@@ -421,6 +421,53 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg
421421}
422422STATIC MP_DEFINE_CONST_FUN_OBJ_KW (dict_update_obj , 1 , dict_update );
423423
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+
424471
425472/******************************************************************************/
426473/* dict views */
@@ -590,6 +637,9 @@ STATIC const mp_rom_map_elem_t dict_locals_dict_table[] = {
590637 { MP_ROM_QSTR (MP_QSTR_get ), MP_ROM_PTR (& dict_get_obj ) },
591638 { MP_ROM_QSTR (MP_QSTR_items ), MP_ROM_PTR (& dict_items_obj ) },
592639 { 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
593643 { MP_ROM_QSTR (MP_QSTR_pop ), MP_ROM_PTR (& dict_pop_obj ) },
594644 { MP_ROM_QSTR (MP_QSTR_popitem ), MP_ROM_PTR (& dict_popitem_obj ) },
595645 { MP_ROM_QSTR (MP_QSTR_setdefault ), MP_ROM_PTR (& dict_setdefault_obj ) },
0 commit comments