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.2.0"

Instance Method Summary collapse

Constructor Details

#initialize(ttl) ⇒ Object



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

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



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

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



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

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



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

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)


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

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)


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

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)


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

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



197
198
199
200
201
202
203
# File 'ext/volatile_map/volatile_map.c', line 197

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)


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

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



197
198
199
200
201
202
203
# File 'ext/volatile_map/volatile_map.c', line 197

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



156
157
158
# File 'ext/volatile_map/volatile_map.c', line 156

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