blob: 1adf18b1f4fcf01c2845a5bbec5ff2a54f142e65 [file] [log] [blame]
Damien George66eaf842014-03-26 19:27:58 +00001#include <stdlib.h>
John R. Lenton9daa7892014-01-14 23:55:01 +00002#include <assert.h>
3
4#include "misc.h"
5#include "mpconfig.h"
Damien George55baff42014-01-21 21:40:13 +00006#include "qstr.h"
John R. Lenton9daa7892014-01-14 23:55:01 +00007#include "obj.h"
8#include "runtime.h"
9
10typedef struct _mp_obj_enumerate_t {
11 mp_obj_base_t base;
12 mp_obj_t iter;
13 machine_int_t cur;
14} mp_obj_enumerate_t;
15
Paul Sokolovskyd5df6cd2014-02-12 18:15:40 +020016STATIC mp_obj_t enumerate_iternext(mp_obj_t self_in);
John R. Lenton9daa7892014-01-14 23:55:01 +000017
18/* TODO: enumerate is one of the ones that can take args or kwargs.
19 Sticking to args for now */
Paul Sokolovskyd5df6cd2014-02-12 18:15:40 +020020STATIC mp_obj_t enumerate_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
John R. Lenton9daa7892014-01-14 23:55:01 +000021 assert(n_args > 0);
John R. Lenton9daa7892014-01-14 23:55:01 +000022 mp_obj_enumerate_t *o = m_new_obj(mp_obj_enumerate_t);
Damien George3e1a5c12014-03-29 13:43:38 +000023 o->base.type = &mp_type_enumerate;
Damien Georged17926d2014-03-30 13:35:08 +010024 o->iter = mp_getiter(args[0]);
Damien George20006db2014-01-18 14:10:48 +000025 o->cur = n_args > 1 ? mp_obj_get_int(args[1]) : 0;
John R. Lenton9daa7892014-01-14 23:55:01 +000026 return o;
27}
28
Damien George3e1a5c12014-03-29 13:43:38 +000029const mp_obj_type_t mp_type_enumerate = {
Damien Georgec5966122014-02-15 16:10:44 +000030 { &mp_type_type },
Damien Georgea71c83a2014-02-15 11:34:50 +000031 .name = MP_QSTR_enumerate,
John R. Lenton9daa7892014-01-14 23:55:01 +000032 .make_new = enumerate_make_new,
33 .iternext = enumerate_iternext,
Paul Sokolovskyd5df6cd2014-02-12 18:15:40 +020034 .getiter = mp_identity,
John R. Lenton9daa7892014-01-14 23:55:01 +000035};
36
Paul Sokolovskyd5df6cd2014-02-12 18:15:40 +020037STATIC mp_obj_t enumerate_iternext(mp_obj_t self_in) {
Damien George3e1a5c12014-03-29 13:43:38 +000038 assert(MP_OBJ_IS_TYPE(self_in, &mp_type_enumerate));
John R. Lenton9daa7892014-01-14 23:55:01 +000039 mp_obj_enumerate_t *self = self_in;
Damien Georged17926d2014-03-30 13:35:08 +010040 mp_obj_t next = mp_iternext(self->iter);
Damien Georgeea8d06c2014-04-17 23:19:36 +010041 if (next == MP_OBJ_STOP_ITERATION) {
42 return MP_OBJ_STOP_ITERATION;
John R. Lenton9daa7892014-01-14 23:55:01 +000043 } else {
44 mp_obj_t items[] = {MP_OBJ_NEW_SMALL_INT(self->cur++), next};
45 return mp_obj_new_tuple(2, items);
46 }
47}