File tree Expand file tree Collapse file tree 3 files changed +35
-0
lines changed
shared-bindings/displayio Expand file tree Collapse file tree 3 files changed +35
-0
lines changed Original file line number Diff line number Diff line change @@ -531,6 +531,36 @@ mp_obj_t mp_identity_getiter(mp_obj_t self, mp_obj_iter_buf_t *iter_buf) {
531
531
return self ;
532
532
}
533
533
534
+ typedef struct {
535
+ mp_obj_base_t base ;
536
+ mp_fun_1_t iternext ;
537
+ mp_obj_t obj ;
538
+ mp_int_t cur ;
539
+ } mp_obj_generic_it_t ;
540
+
541
+ STATIC mp_obj_t generic_it_iternext (mp_obj_t self_in ) {
542
+ mp_obj_generic_it_t * self = MP_OBJ_TO_PTR (self_in );
543
+ mp_obj_type_t * type = mp_obj_get_type (self -> obj );
544
+ mp_obj_t current_length = type -> unary_op (MP_UNARY_OP_LEN , self -> obj );
545
+ if (self -> cur < MP_OBJ_SMALL_INT_VALUE (current_length )) {
546
+ mp_obj_t o_out = type -> subscr (self -> obj , MP_OBJ_NEW_SMALL_INT (self -> cur ), MP_OBJ_SENTINEL );
547
+ self -> cur += 1 ;
548
+ return o_out ;
549
+ } else {
550
+ return MP_OBJ_STOP_ITERATION ;
551
+ }
552
+ }
553
+
554
+ mp_obj_t mp_obj_new_generic_iterator (mp_obj_t obj , mp_obj_iter_buf_t * iter_buf ) {
555
+ assert (sizeof (mp_obj_generic_it_t ) <= sizeof (mp_obj_iter_buf_t ));
556
+ mp_obj_generic_it_t * o = (mp_obj_generic_it_t * )iter_buf ;
557
+ o -> base .type = & mp_type_polymorph_iter ;
558
+ o -> iternext = generic_it_iternext ;
559
+ o -> obj = obj ;
560
+ o -> cur = 0 ;
561
+ return MP_OBJ_FROM_PTR (o );
562
+ }
563
+
534
564
bool mp_get_buffer (mp_obj_t obj , mp_buffer_info_t * bufinfo , mp_uint_t flags ) {
535
565
mp_obj_type_t * type = mp_obj_get_type (obj );
536
566
if (type -> buffer_p .get_buffer == NULL ) {
Original file line number Diff line number Diff line change @@ -819,6 +819,10 @@ mp_obj_t mp_identity(mp_obj_t self);
819
819
MP_DECLARE_CONST_FUN_OBJ_1 (mp_identity_obj );
820
820
mp_obj_t mp_identity_getiter (mp_obj_t self , mp_obj_iter_buf_t * iter_buf );
821
821
822
+ // Generic iterator that uses unary op and subscr to iterate over a native type. It will be slower
823
+ // than a custom iterator but applies broadly.
824
+ mp_obj_t mp_obj_new_generic_iterator (mp_obj_t self , mp_obj_iter_buf_t * iter_buf );
825
+
822
826
// module
823
827
typedef struct _mp_obj_module_t {
824
828
mp_obj_base_t base ;
Original file line number Diff line number Diff line change @@ -291,5 +291,6 @@ const mp_obj_type_t displayio_group_type = {
291
291
.make_new = displayio_group_make_new ,
292
292
.subscr = group_subscr ,
293
293
.unary_op = group_unary_op ,
294
+ .getiter = mp_obj_new_generic_iterator ,
294
295
.locals_dict = (mp_obj_dict_t * )& displayio_group_locals_dict ,
295
296
};
You can’t perform that action at this time.
0 commit comments