@@ -42,7 +42,8 @@ typedef struct _mp_obj_btree_t {
4242 DB * db ;
4343 mp_obj_t start_key ;
4444 mp_obj_t end_key ;
45- bool end_key_inclusive ;
45+ #define FLAG_END_KEY_INCL 1
46+ bool flags ;
4647} mp_obj_btree_t ;
4748
4849STATIC const mp_obj_type_t btree_type ;
@@ -62,6 +63,7 @@ STATIC mp_obj_btree_t *btree_new(DB *db) {
6263 o -> db = db ;
6364 o -> start_key = MP_OBJ_NULL ;
6465 o -> end_key = MP_OBJ_NULL ;
66+ o -> flags = 0 ;
6567 return o ;
6668}
6769
@@ -127,7 +129,10 @@ STATIC mp_obj_t btree_range(size_t n_args, const mp_obj_t *args) {
127129 mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
128130 self -> start_key = args [1 ];
129131 self -> end_key = args [2 ];
130- self -> end_key_inclusive = false;
132+ self -> flags = 0 ;
133+ if (n_args > 3 ) {
134+ self -> flags = MP_OBJ_SMALL_INT_VALUE (args [3 ]);
135+ }
131136 return args [0 ];
132137}
133138STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (btree_range_obj , 3 , 4 , btree_range );
@@ -157,7 +162,11 @@ STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
157162 DBT end_key ;
158163 end_key .data = (void * )mp_obj_str_get_data (self -> end_key , & end_key .size );
159164 BTREE * t = self -> db -> internal ;
160- if (t -> bt_cmp (& key , & end_key ) >= 0 ) {
165+ int cmp = t -> bt_cmp (& key , & end_key );
166+ if (self -> flags & FLAG_END_KEY_INCL ) {
167+ cmp -- ;
168+ }
169+ if (cmp >= 0 ) {
161170 self -> end_key = MP_OBJ_NULL ;
162171 return MP_OBJ_STOP_ITERATION ;
163172 }
@@ -244,6 +253,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_btree_open_obj, 1, mod_btree_open);
244253STATIC const mp_rom_map_elem_t mp_module_btree_globals_table [] = {
245254 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_btree ) },
246255 { MP_ROM_QSTR (MP_QSTR_open ), MP_ROM_PTR (& mod_btree_open_obj ) },
256+ { MP_ROM_QSTR (MP_QSTR_INCL ), MP_OBJ_NEW_SMALL_INT (FLAG_END_KEY_INCL ) },
247257};
248258
249259STATIC MP_DEFINE_CONST_DICT (mp_module_btree_globals , mp_module_btree_globals_table );
0 commit comments