Skip to content

Commit 6b088a6

Browse files
committed
extmod/modbtree: Implement keys(), values(), items() iterators.
Each takes optional args of starting key, ending key, and flags (ending key inclusive, reverse order).
1 parent 119b3da commit 6b088a6

1 file changed

Lines changed: 46 additions & 12 deletions

File tree

extmod/modbtree.c

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ typedef struct _mp_obj_btree_t {
4444
mp_obj_t end_key;
4545
#define FLAG_END_KEY_INCL 1
4646
#define FLAG_DESC 2
47+
#define FLAG_ITER_TYPE_MASK 0xc0
48+
#define FLAG_ITER_KEYS 0x40
49+
#define FLAG_ITER_VALUES 0x80
50+
#define FLAG_ITER_ITEMS 0xc0
4751
byte flags;
4852
} mp_obj_btree_t;
4953

@@ -126,17 +130,37 @@ STATIC mp_obj_t btree_seq(size_t n_args, const mp_obj_t *args) {
126130
}
127131
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_seq_obj, 2, 4, btree_seq);
128132

129-
STATIC mp_obj_t btree_range(size_t n_args, const mp_obj_t *args) {
133+
STATIC mp_obj_t btree_init_iter(size_t n_args, const mp_obj_t *args, byte type) {
130134
mp_obj_btree_t *self = MP_OBJ_TO_PTR(args[0]);
131-
self->start_key = args[1];
132-
self->end_key = args[2];
133-
self->flags = 0;
134-
if (n_args > 3) {
135-
self->flags = MP_OBJ_SMALL_INT_VALUE(args[3]);
135+
self->flags = type;
136+
self->start_key = mp_const_none;
137+
self->end_key = mp_const_none;
138+
if (n_args > 1) {
139+
self->start_key = args[1];
140+
if (n_args > 2) {
141+
self->end_key = args[2];
142+
if (n_args > 3) {
143+
self->flags |= MP_OBJ_SMALL_INT_VALUE(args[3]);
144+
}
145+
}
136146
}
137147
return args[0];
138148
}
139-
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_range_obj, 3, 4, btree_range);
149+
150+
STATIC mp_obj_t btree_keys(size_t n_args, const mp_obj_t *args) {
151+
return btree_init_iter(n_args, args, FLAG_ITER_KEYS);
152+
}
153+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_keys_obj, 1, 4, btree_keys);
154+
155+
STATIC mp_obj_t btree_values(size_t n_args, const mp_obj_t *args) {
156+
return btree_init_iter(n_args, args, FLAG_ITER_VALUES);
157+
}
158+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_values_obj, 1, 4, btree_values);
159+
160+
STATIC mp_obj_t btree_items(size_t n_args, const mp_obj_t *args) {
161+
return btree_init_iter(n_args, args, FLAG_ITER_ITEMS);
162+
}
163+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_items_obj, 1, 4, btree_items);
140164

141165
STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
142166
mp_obj_btree_t *self = MP_OBJ_TO_PTR(self_in);
@@ -179,10 +203,18 @@ STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
179203
}
180204
}
181205

182-
mp_obj_tuple_t *pair = mp_obj_new_tuple(2, NULL);
183-
pair->items[0] = mp_obj_new_bytes(key.data, key.size);
184-
pair->items[1] = mp_obj_new_bytes(val.data, val.size);
185-
return pair;
206+
switch (self->flags & FLAG_ITER_TYPE_MASK) {
207+
case FLAG_ITER_KEYS:
208+
return mp_obj_new_bytes(key.data, key.size);
209+
case FLAG_ITER_VALUES:
210+
return mp_obj_new_bytes(val.data, val.size);
211+
default: {
212+
mp_obj_tuple_t *pair = mp_obj_new_tuple(2, NULL);
213+
pair->items[0] = mp_obj_new_bytes(key.data, key.size);
214+
pair->items[1] = mp_obj_new_bytes(val.data, val.size);
215+
return pair;
216+
}
217+
}
186218
}
187219

188220
STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
@@ -223,7 +255,9 @@ STATIC const mp_rom_map_elem_t btree_locals_dict_table[] = {
223255
{ MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&btree_get_obj) },
224256
{ MP_ROM_QSTR(MP_QSTR_put), MP_ROM_PTR(&btree_put_obj) },
225257
{ MP_ROM_QSTR(MP_QSTR_seq), MP_ROM_PTR(&btree_seq_obj) },
226-
{ MP_ROM_QSTR(MP_QSTR_items), MP_ROM_PTR(&btree_range_obj) },
258+
{ MP_ROM_QSTR(MP_QSTR_keys), MP_ROM_PTR(&btree_keys_obj) },
259+
{ MP_ROM_QSTR(MP_QSTR_values), MP_ROM_PTR(&btree_values_obj) },
260+
{ MP_ROM_QSTR(MP_QSTR_items), MP_ROM_PTR(&btree_items_obj) },
227261
};
228262

229263
STATIC MP_DEFINE_CONST_DICT(btree_locals_dict, btree_locals_dict_table);

0 commit comments

Comments
 (0)