Class: MTBL::Iterator

Inherits:
Object
  • Object
show all
Defined in:
ext/mtbl/ruby-mtbl.c

Instance Method Summary collapse

Constructor Details

#initialize(c_reader) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'ext/mtbl/ruby-mtbl.c', line 74

static VALUE rbmtbl_iterator_initialize(VALUE self, VALUE c_reader) {
    rbmtbl_iterator_t *iterator;
    rbmtbl_reader_t *reader;
    Data_Get_Struct(self, rbmtbl_iterator_t, iterator);
    // TODO: Verify that c_reader is a MTBL::Reader
    Data_Get_Struct(c_reader, rbmtbl_reader_t, reader);
    iterator->it = mtbl_source_iter(mtbl_reader_source(reader->r));
    return self;
}

Instance Method Details

#eachObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'ext/mtbl/ruby-mtbl.c', line 84

static VALUE rbmtbl_iterator_next(VALUE self) {
    const uint8_t *key, *val;
    size_t len_key, len_val;
    VALUE r_key;
    VALUE r_val;
    VALUE r_arr;
    rbmtbl_iterator_t *iterator;
    Data_Get_Struct(self, rbmtbl_iterator_t, iterator);

    while (mtbl_iter_next(iterator->it, &key, &len_key, &val, &len_val)) {
        r_key = rb_usascii_str_new((const char *)key, len_key);
        r_val = rb_usascii_str_new((const char *)val, len_val);

        r_arr = rb_ary_new2(2);
        rb_ary_push(r_arr, r_key);
        rb_ary_push(r_arr, r_val);

        if(rb_block_given_p()) {
            rb_yield(r_arr);
        } else {
            return r_arr;
        }
    }
    return Qnil;
}

#nextObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'ext/mtbl/ruby-mtbl.c', line 84

static VALUE rbmtbl_iterator_next(VALUE self) {
    const uint8_t *key, *val;
    size_t len_key, len_val;
    VALUE r_key;
    VALUE r_val;
    VALUE r_arr;
    rbmtbl_iterator_t *iterator;
    Data_Get_Struct(self, rbmtbl_iterator_t, iterator);

    while (mtbl_iter_next(iterator->it, &key, &len_key, &val, &len_val)) {
        r_key = rb_usascii_str_new((const char *)key, len_key);
        r_val = rb_usascii_str_new((const char *)val, len_val);

        r_arr = rb_ary_new2(2);
        rb_ary_push(r_arr, r_key);
        rb_ary_push(r_arr, r_val);

        if(rb_block_given_p()) {
            rb_yield(r_arr);
        } else {
            return r_arr;
        }
    }
    return Qnil;
}