From 7ad68af020ffea5ab68e663aef2a079d2bef4970 Mon Sep 17 00:00:00 2001 From: David Finkel Date: Thu, 12 Jan 2023 18:14:10 -0500 Subject: [PATCH] lru: consolidate LRU for go 1.20+ With Go 1.20+, interface-types become capable of satisfying comparable constraints (with a runtime-check/panic). Thus it becomes possible to deduplicate the two public types in the lru package. Use build-tags to preserve compatibility with versions below go 1.20 by preserving the legacy implementation. --- go.mod | 2 +- lru/lru.go | 2 ++ lru/lru_go120.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 lru/lru_go120.go diff --git a/go.mod b/go.mod index 0fa8fc1e..5c7fc3fc 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/vimeo/galaxycache -go 1.18 +go 1.20 require ( github.com/golang/protobuf v1.4.3 diff --git a/lru/lru.go b/lru/lru.go index 19e2dea5..259a4679 100644 --- a/lru/lru.go +++ b/lru/lru.go @@ -1,3 +1,5 @@ +//go:build !go1.20 + /* Copyright 2013 Google Inc. diff --git a/lru/lru_go120.go b/lru/lru_go120.go new file mode 100644 index 00000000..24e8554d --- /dev/null +++ b/lru/lru_go120.go @@ -0,0 +1,34 @@ +//go:build go1.20 + +/* +Copyright 2023 Vimeo Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package lru implements an LRU cache. +package lru + +// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators +type Key interface{} + +// Cache is an LRU cache. It is not safe for concurrent access. +// This is a compatibility alias for TypedCache[Key,any] +type Cache = TypedCache[Key, any] + +// New creates a new Cache. +// If maxEntries is zero, the cache has no limit and it's assumed +// that eviction is done by the caller. +func New(maxEntries int) *Cache { + return TypedNew[Key, any](maxEntries) +}