Class: DataMapper::Support::WeakHash

Inherits:
Object
  • Object
show all
Defined in:
lib/data_mapper/support/weak_hash.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#cacheObject (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