added: Weakhash#each
This commit is contained in:
parent
0540eabcb4
commit
299978a9ed
1 changed files with 35 additions and 21 deletions
|
@ -1,10 +1,11 @@
|
||||||
module SBDB
|
module SBDB
|
||||||
|
|
||||||
# See http://eigenclass.org/hiki/deferred-finalizers-in-Ruby
|
# See http://eigenclass.org/hiki/deferred-finalizers-in-Ruby
|
||||||
|
# Not threadsafe.
|
||||||
|
|
||||||
class WeakHash
|
class WeakHash
|
||||||
attr_reader :cache
|
attr_reader :cache
|
||||||
def initialize( cache = Hash.new )
|
def initialize cache = Hash.new
|
||||||
@cache = cache
|
@cache = cache
|
||||||
@key_map = {}
|
@key_map = {}
|
||||||
@rev_cache = Hash.new{|h,k| h[k] = {}}
|
@rev_cache = Hash.new{|h,k| h[k] = {}}
|
||||||
|
@ -21,15 +22,7 @@ class WeakHash
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def []( key )
|
def []= key, value
|
||||||
value_id = @cache[key]
|
|
||||||
return ObjectSpace._id2ref(value_id) unless value_id.nil?
|
|
||||||
nil
|
|
||||||
rescue RangeError
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def []=( key, value )
|
|
||||||
case key
|
case key
|
||||||
when Fixnum, Symbol, true, false
|
when Fixnum, Symbol, true, false
|
||||||
key2 = key
|
key2 = key
|
||||||
|
@ -43,6 +36,27 @@ class WeakHash
|
||||||
ObjectSpace.define_finalizer(value, @reclaim_value)
|
ObjectSpace.define_finalizer(value, @reclaim_value)
|
||||||
ObjectSpace.define_finalizer(key, @reclaim_key)
|
ObjectSpace.define_finalizer(key, @reclaim_key)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def [] key
|
||||||
|
value_id = @cache[key]
|
||||||
|
return ObjectSpace._id2ref( value_id) unless value_id.nil?
|
||||||
|
nil
|
||||||
|
rescue RangeError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def each &e
|
||||||
|
@cache.each do |k, vid|
|
||||||
|
unless vid.nil?
|
||||||
|
obj = begin
|
||||||
|
ObjectSpace._id2ref vid
|
||||||
|
rescue RangeError
|
||||||
|
next
|
||||||
|
end
|
||||||
|
yield k, obj
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue