Branch data Line data Source code
1 : : /*
2 : : * This file is part of the MicroPython project, http://micropython.org/
3 : : *
4 : : * The MIT License (MIT)
5 : : *
6 : : * Copyright (c) 2013, 2014 Damien P. George
7 : : *
8 : : * Permission is hereby granted, free of charge, to any person obtaining a copy
9 : : * of this software and associated documentation files (the "Software"), to deal
10 : : * in the Software without restriction, including without limitation the rights
11 : : * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 : : * copies of the Software, and to permit persons to whom the Software is
13 : : * furnished to do so, subject to the following conditions:
14 : : *
15 : : * The above copyright notice and this permission notice shall be included in
16 : : * all copies or substantial portions of the Software.
17 : : *
18 : : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 : : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 : : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 : : * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 : : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 : : * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 : : * THE SOFTWARE.
25 : : */
26 : :
27 : : #include <stdlib.h>
28 : : #include <assert.h>
29 : :
30 : : #include "py/runtime.h"
31 : :
32 : : #if MICROPY_PY_BUILTINS_ENUMERATE
33 : :
34 : : typedef struct _mp_obj_enumerate_t {
35 : : mp_obj_base_t base;
36 : : mp_obj_t iter;
37 : : mp_int_t cur;
38 : : } mp_obj_enumerate_t;
39 : :
40 : : static mp_obj_t enumerate_iternext(mp_obj_t self_in);
41 : :
42 : 7272 : static mp_obj_t enumerate_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
43 : : #if MICROPY_CPYTHON_COMPAT
44 : 7272 : static const mp_arg_t allowed_args[] = {
45 : : { MP_QSTR_iterable, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
46 : : { MP_QSTR_start, MP_ARG_INT, {.u_int = 0} },
47 : : };
48 : :
49 : : // parse args
50 : 7272 : struct {
51 : : mp_arg_val_t iterable, start;
52 : : } arg_vals;
53 : 7272 : mp_arg_parse_all_kw_array(n_args, n_kw, args,
54 : : MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&arg_vals);
55 : :
56 : : // create enumerate object
57 : 7264 : mp_obj_enumerate_t *o = mp_obj_malloc(mp_obj_enumerate_t, type);
58 : 7264 : o->iter = mp_getiter(arg_vals.iterable.u_obj, NULL);
59 : 7264 : o->cur = arg_vals.start.u_int;
60 : : #else
61 : : mp_arg_check_num(n_args, n_kw, 1, 2, false);
62 : : mp_obj_enumerate_t *o = mp_obj_malloc(mp_obj_enumerate_t, type);
63 : : o->iter = mp_getiter(args[0], NULL);
64 : : o->cur = n_args > 1 ? mp_obj_get_int(args[1]) : 0;
65 : : #endif
66 : :
67 : 7264 : return MP_OBJ_FROM_PTR(o);
68 : : }
69 : :
70 : : MP_DEFINE_CONST_OBJ_TYPE(
71 : : mp_type_enumerate,
72 : : MP_QSTR_enumerate,
73 : : MP_TYPE_FLAG_ITER_IS_ITERNEXT,
74 : : make_new, enumerate_make_new,
75 : : iter, enumerate_iternext
76 : : );
77 : :
78 : 40086 : static mp_obj_t enumerate_iternext(mp_obj_t self_in) {
79 [ + - - + ]: 40086 : assert(mp_obj_is_type(self_in, &mp_type_enumerate));
80 : 40086 : mp_obj_enumerate_t *self = MP_OBJ_TO_PTR(self_in);
81 : 40086 : mp_obj_t next = mp_iternext(self->iter);
82 [ + + ]: 39264 : if (next == MP_OBJ_STOP_ITERATION) {
83 : : return MP_OBJ_STOP_ITERATION;
84 : : } else {
85 : 34000 : mp_obj_t items[] = {MP_OBJ_NEW_SMALL_INT(self->cur++), next};
86 : 34000 : return mp_obj_new_tuple(2, items);
87 : : }
88 : : }
89 : :
90 : : #endif // MICROPY_PY_BUILTINS_ENUMERATE
|