blob: b7fd17fa0ada1fb5924317f862fadcea891357c3 [file] [log] [blame]
Damiend99b0522013-12-21 18:17:45 +00001#include <stdlib.h>
2#include <stdint.h>
3
4#include "nlr.h"
5#include "misc.h"
6#include "mpconfig.h"
7#include "obj.h"
8
9/******************************************************************************/
10/* range */
11
12typedef struct _mp_obj_range_t {
13 mp_obj_base_t base;
14 // TODO make these values generic objects or something
15 machine_int_t start;
16 machine_int_t stop;
17 machine_int_t step;
18} mp_obj_range_t;
19
20mp_obj_t range_getiter(mp_obj_t o_in) {
21 mp_obj_range_t *o = o_in;
22 return mp_obj_new_range_iterator(o->start, o->stop, o->step);
23}
24
25static const mp_obj_type_t range_type = {
26 { &mp_const_type} ,
27 "range",
28 NULL, // print
29 NULL, // call_n
30 NULL, // unary_op
31 NULL, // binary_op
32 range_getiter,
33 NULL, // iternext
34 {{NULL, NULL},}, // method list
35};
36
37// range is a class and instances are immutable sequence objects
38mp_obj_t mp_obj_new_range(int start, int stop, int step) {
39 mp_obj_range_t *o = m_new_obj(mp_obj_range_t);
40 o->base.type = &range_type;
41 o->start = start;
42 o->stop = stop;
43 o->step = step;
44 return o;
45}
46
47/******************************************************************************/
48/* range iterator */
49
50typedef struct _mp_obj_range_it_t {
51 mp_obj_base_t base;
52 // TODO make these values generic objects or something
53 machine_int_t cur;
54 machine_int_t stop;
55 machine_int_t step;
56} mp_obj_range_it_t;
57
58mp_obj_t range_it_iternext(mp_obj_t o_in) {
59 mp_obj_range_it_t *o = o_in;
60 if ((o->step > 0 && o->cur < o->stop) || (o->step < 0 && o->cur > o->stop)) {
61 mp_obj_t o_out = MP_OBJ_NEW_SMALL_INT(o->cur);
62 o->cur += o->step;
63 return o_out;
64 } else {
65 return mp_const_stop_iteration;
66 }
67}
68
69static const mp_obj_type_t range_it_type = {
70 { &mp_const_type },
71 "range_iterator",
72 NULL, // print
73 NULL, // call_n
74 NULL, // unary_op
75 NULL, // binary_op
76 NULL, // getiter
77 range_it_iternext,
78 {{NULL, NULL},}, // method list
79};
80
81mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) {
82 mp_obj_range_it_t *o = m_new_obj(mp_obj_range_it_t);
83 o->base.type = &range_it_type;
84 o->cur = cur;
85 o->stop = stop;
86 o->step = step;
87 return o;
88}