Sha256: 1f3d4c159e723190cc804781aa7cef4d928bf9e8cb928edc1642d3c67e1ecbe4

Contents?: true

Size: 1.85 KB

Versions: 107

Compression:

Stored size: 1.85 KB

Contents

require 'concurrent/hash'

module BELParser
  module Resource
    # LRUCache implements a least recently used cache. This implementation was
    # adapted from https://github.com/SamSaffron/lru_redux.
		class LRUCache
			def initialize(max_size)
				raise ArgumentError.new(:max_size) if max_size < 1

				@max_size = max_size
				@data = Concurrent::Hash.new
			end

			def max_size=(max_size)
				max_size ||= @max_size

				raise ArgumentError.new(:max_size) if max_size < 1

				@max_size = max_size

				@data.shift while @data.size > @max_size
			end

			def getset(key)
				found = true
				value = @data.delete(key){ found = false }
				if found
					@data[key] = value
				else
					result = @data[key] = yield
					@data.shift if @data.length > @max_size
					result
				end
			end

			def fetch(key)
				found = true
				value = @data.delete(key){ found = false }
				if found
					@data[key] = value
				else
					yield if block_given?
				end
			end

			def [](key)
				found = true
				value = @data.delete(key){ found = false }
				if found
					@data[key] = value
				else
					nil
				end
			end

			def []=(key,val)
				@data.delete(key)
				@data[key] = val
				@data.shift if @data.length > @max_size
				val
			end

			def each
				unless block_given?
					return enum_for(:each)
				end

				array = @data.to_a
				array.reverse!.each do |pair|
					yield pair
				end
			end

			# used further up the chain, non thread safe each
			alias_method :each_unsafe, :each

			def to_a
				array = @data.to_a
				array.reverse!
			end

			def delete(key)
				@data.delete(key)
			end

			alias_method :evict, :delete

			def key?(key)
				@data.key?(key)
			end

			alias_method :has_key?, :key?

			def clear
				@data.clear
			end

			def count
				@data.size
			end

			protected

			# for cache validation only, ensures all is sound
			def valid?
				true
			end
		end
	end
end

Version data entries

107 entries across 107 versions & 1 rubygems

Version Path
bel_parser-1.1.6-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.6 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.5 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.4-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.4 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.3-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.3 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.2-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.2 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.1-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.1.1 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.8-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.8 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.7-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.7 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.6-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.6 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.5-java lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.5 lib/bel_parser/resource/lru_cache.rb
bel_parser-1.0.4-java lib/bel_parser/resource/lru_cache.rb