@@ -421,6 +421,53 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg
421
421
}
422
422
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (dict_update_obj , 1 , dict_update );
423
423
424
+ #if MICROPY_PY_COLLECTIONS_ORDEREDDICT
425
+ STATIC mp_obj_t dict_move_to_end (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
426
+ mp_obj_dict_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
427
+ mp_arg_validate_type (self , & mp_type_ordereddict , MP_QSTR_self );
428
+
429
+ // parse args
430
+ enum { ARG_key , ARG_last };
431
+ static const mp_arg_t allowed_args [] = {
432
+ { MP_QSTR_key , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
433
+ { MP_QSTR_last , MP_ARG_BOOL , {.u_bool = true } }
434
+ };
435
+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
436
+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
437
+
438
+ mp_obj_t * key = args [ARG_key ].u_obj ;
439
+ bool last = args [ARG_last ].u_bool ;
440
+
441
+ mp_map_elem_t * elem = mp_map_lookup (& self -> map , key , MP_MAP_LOOKUP );
442
+ if (!elem ) {
443
+ mp_raise_type_arg (& mp_type_KeyError , key );
444
+ }
445
+
446
+ mp_map_elem_t tmp = * elem ;
447
+ mp_map_elem_t * table = self -> map .table ;
448
+ mp_map_elem_t * dest , * move_begin , * move_dest ;
449
+ size_t move_count ;
450
+
451
+ if (last ) {
452
+ mp_map_elem_t * top = & table [self -> map .used ];
453
+ dest = top - 1 ;
454
+ move_begin = elem + 1 ;
455
+ move_dest = elem ;
456
+ move_count = top - move_begin ;
457
+ } else {
458
+ dest = & table [0 ];
459
+ move_begin = table ;
460
+ move_dest = table + 1 ;
461
+ move_count = elem - table ;
462
+ }
463
+ memmove (move_dest , move_begin , move_count * sizeof (* elem ));
464
+ * dest = tmp ;
465
+
466
+ return mp_const_none ;
467
+ }
468
+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (dict_move_to_end_obj , 1 , dict_move_to_end );
469
+ #endif
470
+
424
471
425
472
/******************************************************************************/
426
473
/* dict views */
@@ -590,6 +637,9 @@ STATIC const mp_rom_map_elem_t dict_locals_dict_table[] = {
590
637
{ MP_ROM_QSTR (MP_QSTR_get ), MP_ROM_PTR (& dict_get_obj ) },
591
638
{ MP_ROM_QSTR (MP_QSTR_items ), MP_ROM_PTR (& dict_items_obj ) },
592
639
{ MP_ROM_QSTR (MP_QSTR_keys ), MP_ROM_PTR (& dict_keys_obj ) },
640
+ #if MICROPY_PY_COLLECTIONS_ORDEREDDICT
641
+ { MP_ROM_QSTR (MP_QSTR_move_to_end ), MP_ROM_PTR (& dict_move_to_end_obj ) },
642
+ #endif
593
643
{ MP_ROM_QSTR (MP_QSTR_pop ), MP_ROM_PTR (& dict_pop_obj ) },
594
644
{ MP_ROM_QSTR (MP_QSTR_popitem ), MP_ROM_PTR (& dict_popitem_obj ) },
595
645
{ MP_ROM_QSTR (MP_QSTR_setdefault ), MP_ROM_PTR (& dict_setdefault_obj ) },
0 commit comments