File: nested_multimap_ext.c

package info (click to toggle)
ruby-multimap 1.1.2%2Bgh-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 236 kB
  • ctags: 101
  • sloc: ruby: 1,464; ansic: 21; makefile: 3
file content (27 lines) | stat: -rw-r--r-- 766 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "ruby.h"
#ifndef RHASH_IFNONE
#define HASH_IFNONE (RHASH(h)->ifnone)
#endif

VALUE cNestedMultimap;

static VALUE rb_nested_multimap_aref(int argc, VALUE *argv, VALUE self)
{
	int i;
	VALUE r, h;

	for (i = 0, r = self; rb_obj_is_kind_of(r, cNestedMultimap) == Qtrue; i++) {
		h = rb_funcall(r, rb_intern("_internal_hash"), 0);
		Check_Type(h, T_HASH);
		r = (i < argc) ? rb_hash_aref(h, argv[i]) : RHASH_IFNONE(h);
	}

	return r;
}

void Init_nested_multimap_ext() {
	cNestedMultimap = rb_const_get(rb_cObject, rb_intern("NestedMultimap"));
	// rb_funcall(cNestedMultimap, rb_intern("remove_method"), 1, rb_intern("[]"));
	rb_eval_string("NestedMultimap.send(:remove_method, :[])");
	rb_define_method(cNestedMultimap, "[]", rb_nested_multimap_aref, -1);
}