class SizeLimitedStorage

ストレージ内の要素が一定のサイズ以上になったら、古いものから消去される連想配列っぽいもの。

Attributes

limit[RW]

格納できる容量

using[R]

使用している容量

Public Class Methods

new(key_class, val_class, limit, proc=(block_given? ? Proc.new : :size.to_proc)) click to toggle source

Args

limit

格納できる容量(Integer)

&proc

要素の容量を返すブロック(デフォルト: sizeメソッド)

Calls superclass method WeakStore.new
# File core/lib/weakstorage.rb, line 108
def initialize(key_class, val_class, limit, proc=(block_given? ? Proc.new : :size.to_proc))
  @key_class, @val_class, @limit, @get_size = key_class, val_class, limit, proc
  @using = 0
  super()
end

Public Instance Methods

[](key) click to toggle source
# File core/lib/weakstorage.rb, line 114
def [](key)
  atomic { storage[key] } end
Also aliased as: get
[]=(key, val) click to toggle source

val を追加する。 これを入れることで容量制限を超えてしまう場合、入るようになるまで古い要素から順番に破棄される。 val のサイズが 容量制限以上だったら追加されない。

Args

key

キー

val

Return

val 又は nil(値が大きすぎて格納できない場合)

# File core/lib/weakstorage.rb, line 126
def []=(key, val)
  type_strict key => @key_class, val => @val_class
  val_size = get_size(val.freeze)
  return nil if val_size >= @limit
  atomic {
    delete key
    insert_value(key, val, val_size) }
  val
end
Also aliased as: store
delete(key) click to toggle source

key に対応する値を削除する

Args

key

キー

Return

削除した値。値が存在しない場合はnil。

# File core/lib/weakstorage.rb, line 146
def delete(key)
  type_strict key => @key_class
  atomic {
    if has_key? key
      result = storage.delete(key)
      @using -= get_size(result)
      result end } end
get(key)
Alias for: []
has_key?(key) click to toggle source
# File core/lib/weakstorage.rb, line 137
def has_key?(key)
  atomic{ storage.has_key? key }
end
inspect() click to toggle source
# File core/lib/weakstorage.rb, line 154
def inspect
  "#<SizeLimitedStorage(#{@using}/#{@limit})>" end
store(key, val)
Alias for: []=