Skip to content

Commit 1babeb4

Browse files
committed
extmod/modbtree: Implement .items() iterator.
1 parent acaa30b commit 1babeb4

1 file changed

Lines changed: 30 additions & 3 deletions

File tree

extmod/modbtree.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,33 @@ STATIC mp_obj_t btree_range(size_t n_args, const mp_obj_t *args) {
132132
}
133133
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_range_obj, 3, 4, btree_range);
134134

135+
STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
136+
mp_obj_btree_t *self = MP_OBJ_TO_PTR(self_in);
137+
DBT key, val;
138+
int res;
139+
if (self->start_key != MP_OBJ_NULL) {
140+
int flags = R_FIRST;
141+
if (self->start_key != mp_const_none) {
142+
key.data = (void*)mp_obj_str_get_data(self->start_key, &key.size);
143+
flags = R_CURSOR;
144+
}
145+
res = __bt_seq(self->db, &key, &val, flags);
146+
self->start_key = MP_OBJ_NULL;
147+
} else {
148+
res = __bt_seq(self->db, &key, &val, R_NEXT);
149+
}
150+
151+
if (res == RET_SPECIAL) {
152+
return MP_OBJ_STOP_ITERATION;
153+
}
154+
CHECK_ERROR(res);
155+
156+
mp_obj_tuple_t *pair = mp_obj_new_tuple(2, NULL);
157+
pair->items[0] = mp_obj_new_bytes(key.data, key.size);
158+
pair->items[1] = mp_obj_new_bytes(val.data, val.size);
159+
return pair;
160+
}
161+
135162
STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
136163
mp_obj_btree_t *self = MP_OBJ_TO_PTR(self_in);
137164
if (value == MP_OBJ_NULL) {
@@ -170,7 +197,7 @@ STATIC const mp_rom_map_elem_t btree_locals_dict_table[] = {
170197
{ MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&btree_get_obj) },
171198
{ MP_ROM_QSTR(MP_QSTR_put), MP_ROM_PTR(&btree_put_obj) },
172199
{ MP_ROM_QSTR(MP_QSTR_seq), MP_ROM_PTR(&btree_seq_obj) },
173-
{ MP_ROM_QSTR(MP_QSTR_range), MP_ROM_PTR(&btree_range_obj) },
200+
{ MP_ROM_QSTR(MP_QSTR_items), MP_ROM_PTR(&btree_range_obj) },
174201
};
175202

176203
STATIC MP_DEFINE_CONST_DICT(btree_locals_dict, btree_locals_dict_table);
@@ -180,8 +207,8 @@ STATIC const mp_obj_type_t btree_type = {
180207
// Save on qstr's, reuse same as for module
181208
.name = MP_QSTR_btree,
182209
.print = btree_print,
183-
.getiter = NULL,
184-
.iternext = NULL,
210+
.getiter = mp_identity,
211+
.iternext = btree_iternext,
185212
.subscr = btree_subscr,
186213
.locals_dict = (void*)&btree_locals_dict,
187214
};

0 commit comments

Comments
 (0)