Class: VolatileMap

Inherits:
Object
  • Object
show all
Defined in:
lib/volatile_map/version.rb,
ext/volatile_map/volatile_map.c

Constant Summary collapse

VERSION =
"0.1.0"

Instance Method Summary collapse

Constructor Details

#initialize(ttl) ⇒ Object



147
148
149
150
151
152
153
154
155
156
# File 'ext/volatile_map/volatile_map.c', line 147

static VALUE vm_initialize(VALUE self, VALUE ttl) {
  VolatileMap *vm = vm_get(self);
  double ttl_value = NUM2DBL(ttl);

  if(ttl_value <= 0.0) rb_raise(rb_eArgError, "TTL must be positive");

  vm->ttl = ttl_value;

  return self;
}

Instance Method Details

#[](key) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'ext/volatile_map/volatile_map.c', line 171

static VALUE vm_aref(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_lookup2(vm->storage, key, Qundef);

  if(entry == Qundef) return Qnil;

  double now = now_seconds();

  if(is_stale(vm->ttl, entry, now)) {
    rb_hash_delete(vm->storage, key);

    return Qnil;
  }

  rb_ary_store(entry, 1, DBL2NUM(now));

  return RARRAY_AREF(entry, 0);
}

#[]=(key, value) ⇒ Object



162
163
164
165
166
167
168
169
# File 'ext/volatile_map/volatile_map.c', line 162

static VALUE vm_aset(VALUE self, VALUE key, VALUE value) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_ary_new_from_args(2, value, DBL2NUM(now_seconds()));

  rb_hash_aset(vm->storage, key, entry);

  return value;
}

#delete(key) ⇒ Object



190
191
192
193
194
195
196
197
# File 'ext/volatile_map/volatile_map.c', line 190

static VALUE vm_delete(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_delete(vm->storage, key);

  if(NIL_P(entry) || !RB_TYPE_P(entry, T_ARRAY) || RARRAY_LEN(entry) < 1) return Qnil;

  return RARRAY_AREF(entry, 0);
}

#has_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'ext/volatile_map/volatile_map.c', line 207

static VALUE vm_key(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_lookup2(vm->storage, key, Qundef);

  if(entry == Qundef) return Qfalse;

  double now = now_seconds();

  if(is_stale(vm->ttl, entry, now)) {
    rb_hash_delete(vm->storage, key);

    return Qfalse;
  }

  rb_ary_store(entry, 1, DBL2NUM(now));

  return Qtrue;
}

#include?(key) ⇒ Boolean

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'ext/volatile_map/volatile_map.c', line 207

static VALUE vm_key(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_lookup2(vm->storage, key, Qundef);

  if(entry == Qundef) return Qfalse;

  double now = now_seconds();

  if(is_stale(vm->ttl, entry, now)) {
    rb_hash_delete(vm->storage, key);

    return Qfalse;
  }

  rb_ary_store(entry, 1, DBL2NUM(now));

  return Qtrue;
}

#key?(key) ⇒ Boolean

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'ext/volatile_map/volatile_map.c', line 207

static VALUE vm_key(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_lookup2(vm->storage, key, Qundef);

  if(entry == Qundef) return Qfalse;

  double now = now_seconds();

  if(is_stale(vm->ttl, entry, now)) {
    rb_hash_delete(vm->storage, key);

    return Qfalse;
  }

  rb_ary_store(entry, 1, DBL2NUM(now));

  return Qtrue;
}

#lengthObject



199
200
201
202
203
204
205
# File 'ext/volatile_map/volatile_map.c', line 199

static VALUE vm_size(VALUE self) {
  VolatileMap *vm = vm_get(self);

  if(NIL_P(vm->storage)) return INT2FIX(0);

  return ULONG2NUM(RHASH_SIZE(vm->storage));
}

#member?(key) ⇒ Boolean

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'ext/volatile_map/volatile_map.c', line 207

static VALUE vm_key(VALUE self, VALUE key) {
  VolatileMap *vm = vm_get(self);
  VALUE entry = rb_hash_lookup2(vm->storage, key, Qundef);

  if(entry == Qundef) return Qfalse;

  double now = now_seconds();

  if(is_stale(vm->ttl, entry, now)) {
    rb_hash_delete(vm->storage, key);

    return Qfalse;
  }

  rb_ary_store(entry, 1, DBL2NUM(now));

  return Qtrue;
}

#sizeObject



199
200
201
202
203
204
205
# File 'ext/volatile_map/volatile_map.c', line 199

static VALUE vm_size(VALUE self) {
  VolatileMap *vm = vm_get(self);

  if(NIL_P(vm->storage)) return INT2FIX(0);

  return ULONG2NUM(RHASH_SIZE(vm->storage));
}

#ttlObject



158
159
160
# File 'ext/volatile_map/volatile_map.c', line 158

static VALUE vm_ttl(VALUE self) {
  return DBL2NUM(vm_get(self)->ttl);
}