Module: HashUnnest
- Defined in:
- lib/hash_unnest.rb,
lib/hash_unnest/version.rb,
ext/hash_unnest/hash_unnest.c
Constant Summary collapse
- VERSION =
'1.0.0'.freeze
Instance Method Summary collapse
- #unnest ⇒ Object
-
#unnest_c ⇒ Object
***************************************************************************.
Instance Method Details
#unnest ⇒ Object
4 5 6 |
# File 'lib/hash_unnest.rb', line 4 def unnest unnest_c end |
#unnest_c ⇒ Object
***************************************************************************
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'ext/hash_unnest/hash_unnest.c', line 109 static VALUE hash_unnest_unnest(VALUE self) { VALUE result, in, prefix; hn_record_t* buf; hn_record_t* buf_ptr; int size = 0; #ifdef DEBUG { VALUE _str_self = rb_funcall(self, rb_intern("to_s"), 0); LOG("*** hash_unnest_unnest (%s)\n", StringValueCStr(_str_self)); } #endif rb_hash_foreach(self, hash_unnest_size_closure, (VALUE) &size); #ifdef DEBUG { VALUE _str_self = rb_funcall(self, rb_intern("to_s"), 0); LOG("*** size(%s): %d\n", StringValueCStr(_str_self), size); } #endif buf = (hn_record_t*) malloc(size * sizeof(hn_record_t)); buf_ptr = buf; prefix = rb_str_new("", 0); in = rb_ary_new2(2); rb_ary_store(in, 0, prefix); rb_ary_store(in, 1, (VALUE) &buf_ptr); rb_hash_foreach(self, hash_unnest_closure, in); qsort((void*) buf, size, sizeof(hn_record_t), hn_record_compare); result = rb_hash_new(); for (int k = 0; k < size; ++k) { hn_record_t entry = buf[k]; rb_hash_aset(result, entry.key, entry.value); } free(buf); return result; } |