@@ -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}
127131STATIC 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
141165STATIC 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
188220STATIC 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
229263STATIC MP_DEFINE_CONST_DICT (btree_locals_dict , btree_locals_dict_table );
0 commit comments