Class: Data

Inherits:
Object show all
Defined in:
mruby/mrbgems/mruby-data/src/data.c

Instance Method Summary collapse

Constructor Details

#initializeObject



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'mruby/mrbgems/mruby-data/src/data.c', line 238

static mrb_value
mrb_data_initialize(mrb_state *mrb, mrb_value self)
{
  struct RClass *klass = mrb_obj_class(mrb, self);
  mrb_value members = data_s_members(mrb, klass);

  mrb_int n = RARRAY_LEN(members);
  mrb_value hash;
  mrb_get_args(mrb, "H", &hash);
  if (mrb_hash_size(mrb, hash) != n) {
    mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
  }
  mrb_ary_resize(mrb, self, n);

  mrb_value *mems = RARRAY_PTR(members);
  for (mrb_int i = 0; i < n; i++) {
    if (!mrb_hash_key_p(mrb, hash, mems[i])) {
      mrb_raisef(mrb, E_ARGUMENT_ERROR, "undefined data member %v", mems[i]);
    }
    mrb_ary_set(mrb, self, i, mrb_hash_get(mrb, hash, mems[i]));
  }
  mrb_obj_freeze(mrb, self);
  return self;
}

Instance Method Details

#==(other_data) ⇒ Boolean

Equality—Returns true if other_data is equal to this one: they must be of the same class as generated by Data::define, and all values of must be equal (according to Object#==).

Customer = Data.define(:name, :address, :zip)
joe  = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe2 = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345)
joe == joe2   #=> true
joe == jane   #=> false

Returns:

  • (Boolean)


297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'mruby/mrbgems/mruby-data/src/data.c', line 297

static mrb_value
mrb_data_equal(mrb_state *mrb, mrb_value s)
{
  mrb_value s2 = mrb_get_arg1(mrb);
  mrb_value *ptr, *ptr2;
  mrb_int len;

  if (mrb_obj_equal(mrb, s, s2)) {
    return mrb_true_value();
  }
  if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
    return mrb_false_value();
  }
  if (RDATA_LEN(s) != RDATA_LEN(s2)) {
    return mrb_false_value();
  }
  ptr = RDATA_PTR(s);
  ptr2 = RDATA_PTR(s2);
  len = RDATA_LEN(s);
  for (mrb_int i=0; i<len; i++) {
    if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
      return mrb_false_value();
    }
  }

  return mrb_true_value();
}

#eql?(other) ⇒ Boolean

Two structures are equal if they are the same object, or if all their fields are equal (using Object#eql?).

Returns:

  • (Boolean)


332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'mruby/mrbgems/mruby-data/src/data.c', line 332

static mrb_value
mrb_data_eql(mrb_state *mrb, mrb_value s)
{
  mrb_value s2 = mrb_get_arg1(mrb);
  mrb_value *ptr, *ptr2;
  mrb_int len;

  if (mrb_obj_equal(mrb, s, s2)) {
    return mrb_true_value();
  }
  if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
    return mrb_false_value();
  }
  if (RDATA_LEN(s) != RDATA_LEN(s2)) {
    return mrb_false_value();
  }
  ptr = RDATA_PTR(s);
  ptr2 = RDATA_PTR(s2);
  len = RDATA_LEN(s);
  for (mrb_int i=0; i<len; i++) {
    if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
      return mrb_false_value();
    }
  }

  return mrb_true_value();
}

#initialize_copyObject



263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# File 'mruby/mrbgems/mruby-data/src/data.c', line 263

static mrb_value
mrb_data_init_copy(mrb_state *mrb, mrb_value copy)
{
  mrb_value s = mrb_get_arg1(mrb);

  if (mrb_obj_equal(mrb, copy, s)) return copy;
  if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
    mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
  }
  if (!data_p(s)) {
    data_corrupted(mrb);
  }
  mrb_ary_replace(mrb, copy, s);
  mrb_obj_freeze(mrb, copy);
  return copy;
}

#to_sString #inspectString

Returns a string representation of Data

Overloads:



392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
# File 'mruby/mrbgems/mruby-data/src/data.c', line 392

static mrb_value
mrb_data_to_s(mrb_state *mrb, mrb_value self)
{
  mrb_value members, ret, cname;
  mrb_value *mems, *vals;
  mrb_int mlen;

  members = data_members(mrb, self);
  mlen = RARRAY_LEN(members);
  mems = RARRAY_PTR(members);
  vals = RDATA_PTR(self);
  ret = mrb_str_new_lit(mrb, "#<data ");
  int ai = mrb_gc_arena_save(mrb);
  cname = mrb_class_path(mrb, mrb_class_real(mrb_class(mrb, self)));
  if (!mrb_nil_p(cname)) {
    mrb_str_cat_str(mrb, ret, cname);
    mrb_str_cat_lit(mrb, ret, " ");
  }
  for (mrb_int i=0; i<mlen; i++) {
    mrb_int len;
    const char *name = mrb_sym_name_len(mrb, mrb_symbol(mems[i]), &len);
    if (i>0) mrb_str_cat_lit(mrb, ret, ", ");
    mrb_str_cat(mrb, ret, name, len);
    mrb_str_cat_lit(mrb, ret, "=");
    mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, vals[i]));
    mrb_gc_arena_restore(mrb, ai);
  }
  mrb_str_cat_lit(mrb, ret, ">");

  return ret;
}

#membersArray

Returns an array of strings representing the names of the instance variables.

Customer = Data.define(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.members   #=> [:name, :address, :zip]

Returns:



90
91
92
93
94
# File 'mruby/mrbgems/mruby-data/src/data.c', line 90

static mrb_value
mrb_data_members(mrb_state *mrb, mrb_value obj)
{
  return mrb_data_s_members(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
}

#to_hHash

Create a hash from member names and values.

Returns:



366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'mruby/mrbgems/mruby-data/src/data.c', line 366

static mrb_value
mrb_data_to_h(mrb_state *mrb, mrb_value self)
{
  mrb_value members, ret;
  mrb_value *mems, *vals;

  members = data_members(mrb, self);
  mems = RARRAY_PTR(members);
  vals = RDATA_PTR(self);

  ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members));
  mrb_int len = RARRAY_LEN(members);
  for (mrb_int i=0; i<len; i++) {
    mrb_hash_set(mrb, ret, mems[i], vals[i]);
  }

  return ret;
}

#to_sString #inspectString

Returns a string representation of Data

Overloads:



392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
# File 'mruby/mrbgems/mruby-data/src/data.c', line 392

static mrb_value
mrb_data_to_s(mrb_state *mrb, mrb_value self)
{
  mrb_value members, ret, cname;
  mrb_value *mems, *vals;
  mrb_int mlen;

  members = data_members(mrb, self);
  mlen = RARRAY_LEN(members);
  mems = RARRAY_PTR(members);
  vals = RDATA_PTR(self);
  ret = mrb_str_new_lit(mrb, "#<data ");
  int ai = mrb_gc_arena_save(mrb);
  cname = mrb_class_path(mrb, mrb_class_real(mrb_class(mrb, self)));
  if (!mrb_nil_p(cname)) {
    mrb_str_cat_str(mrb, ret, cname);
    mrb_str_cat_lit(mrb, ret, " ");
  }
  for (mrb_int i=0; i<mlen; i++) {
    mrb_int len;
    const char *name = mrb_sym_name_len(mrb, mrb_symbol(mems[i]), &len);
    if (i>0) mrb_str_cat_lit(mrb, ret, ", ");
    mrb_str_cat(mrb, ret, name, len);
    mrb_str_cat_lit(mrb, ret, "=");
    mrb_str_cat_str(mrb, ret, mrb_inspect(mrb, vals[i]));
    mrb_gc_arena_restore(mrb, ai);
  }
  mrb_str_cat_lit(mrb, ret, ">");

  return ret;
}