Class: DataMapper::Support::WeakHash
- Defined in:
- lib/data_mapper/support/weak_hash.rb
Instance Attribute Summary collapse
-
#cache ⇒ Object
readonly
Returns the value of attribute cache.
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
-
#initialize(cache = Hash.new) ⇒ WeakHash
constructor
A new instance of WeakHash.
Constructor Details
#initialize(cache = Hash.new) ⇒ WeakHash
Returns a new instance of WeakHash.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/data_mapper/support/weak_hash.rb', line 5 def initialize( cache = Hash.new ) @cache = cache @key_map = {} @rev_cache = Hash.new{|h,k| h[k] = {}} @reclaim_value = lambda do |value_id| if @rev_cache.has_key? value_id @rev_cache[value_id].each_key{|key| @cache.delete key} @rev_cache.delete value_id end end @reclaim_key = lambda do |key_id| if @key_map.has_key? key_id @cache.delete @key_map[key_id] end end end |
Instance Attribute Details
#cache ⇒ Object (readonly)
Returns the value of attribute cache.
4 5 6 |
# File 'lib/data_mapper/support/weak_hash.rb', line 4 def cache @cache end |
Instance Method Details
#[](key) ⇒ Object
22 23 24 25 26 27 28 |
# File 'lib/data_mapper/support/weak_hash.rb', line 22 def []( key ) value_id = @cache[key] return ObjectSpace._id2ref(value_id) unless value_id.nil? nil rescue RangeError nil end |
#[]=(key, value) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/data_mapper/support/weak_hash.rb', line 30 def []=( key, value ) case key when Fixnum, Symbol, true, false key2 = key else key2 = key.dup end @rev_cache[value.object_id][key2] = true @cache[key2] = value.object_id @key_map[key.object_id] = key2 ObjectSpace.define_finalizer(value, @reclaim_value) ObjectSpace.define_finalizer(key, @reclaim_key) end |