diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-14 23:55:01 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-14 23:55:01 +0000 |
commit | 9daa78943e58602f74c89a2b5b1ed225f4ccf6cc (patch) | |
tree | a5ea774c04ce313d437654cf49b085732e480791 /py/objenumerate.c | |
parent | 6c2401e935b38ca87fd8f52efbb614a428b6938c (diff) | |
download | micropython-9daa78943e58602f74c89a2b5b1ed225f4ccf6cc.tar.gz micropython-9daa78943e58602f74c89a2b5b1ed225f4ccf6cc.zip |
added enumerate()
Diffstat (limited to 'py/objenumerate.c')
-rw-r--r-- | py/objenumerate.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/py/objenumerate.c b/py/objenumerate.c new file mode 100644 index 0000000000..5bfd8a3370 --- /dev/null +++ b/py/objenumerate.c @@ -0,0 +1,53 @@ +#include <stdlib.h> +#include <assert.h> + +#include "misc.h" +#include "mpconfig.h" +#include "obj.h" +#include "runtime.h" + +typedef struct _mp_obj_enumerate_t { + mp_obj_base_t base; + mp_obj_t iter; + machine_int_t cur; +} mp_obj_enumerate_t; + +static mp_obj_t enumerate_getiter(mp_obj_t self_in) { + return self_in; +} + +static mp_obj_t enumerate_iternext(mp_obj_t self_in); + +/* TODO: enumerate is one of the ones that can take args or kwargs. + Sticking to args for now */ +static mp_obj_t enumerate_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args) { + /* NOTE: args are backwards */ + assert(n_args > 0); + args += n_args - 1; + mp_obj_enumerate_t *o = m_new_obj(mp_obj_enumerate_t); + o->base.type = &enumerate_type; + o->iter = rt_getiter(args[0]); + o->cur = n_args > 1 ? mp_obj_get_int(args[-1]) : 0; + + return o; +} + +const mp_obj_type_t enumerate_type = { + { &mp_const_type }, + "enumerate", + .make_new = enumerate_make_new, + .iternext = enumerate_iternext, + .getiter = enumerate_getiter, +}; + +static mp_obj_t enumerate_iternext(mp_obj_t self_in) { + assert(MP_OBJ_IS_TYPE(self_in, &enumerate_type)); + mp_obj_enumerate_t *self = self_in; + mp_obj_t next = rt_iternext(self->iter); + if (next == mp_const_stop_iteration) { + return mp_const_stop_iteration; + } else { + mp_obj_t items[] = {MP_OBJ_NEW_SMALL_INT(self->cur++), next}; + return mp_obj_new_tuple(2, items); + } +} |