rangeobject.c revision 1f2f61a78f80933a3e703df1ab08f14e70ea87d5
112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum/* Range object implementation */
212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum
3c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum#include "Python.h"
4efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters
512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossumtypedef struct {
6c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum	PyObject_HEAD
712d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum	long	start;
812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum	long	step;
912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum	long	len;
1012d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} rangeobject;
1112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum
12c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger/* Return number of items in range/xrange (lo, hi, step).  step > 0
13c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger * required.  Return a value < 0 if & only if the true value is too
14c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger * large to fit in a signed long.
15c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger */
16c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettingerstatic long
17c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettingerget_len_of_range(long lo, long hi, long step)
18c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger{
19c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	/* -------------------------------------------------------------
20c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	If lo >= hi, the range is empty.
21c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	Else if n values are in the range, the last one is
22c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	lo + (n-1)*step, which must be <= hi-1.  Rearranging,
23c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
24c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	the proper value.  Since lo < hi in this case, hi-lo-1 >= 0, so
25c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	the RHS is non-negative and so truncation is the same as the
26c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	floor.  Letting M be the largest positive long, the worst case
27c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	for the RHS numerator is hi=M, lo=-M-1, and then
28c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	hi-lo-1 = M-(-M-1)-1 = 2*M.  Therefore unsigned long has enough
29c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	precision to compute the RHS exactly.
30c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	---------------------------------------------------------------*/
31c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	long n = 0;
32c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	if (lo < hi) {
33c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		unsigned long uhi = (unsigned long)hi;
34c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		unsigned long ulo = (unsigned long)lo;
35c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		unsigned long diff = uhi - ulo - 1;
36c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		n = (long)(diff / (unsigned long)step + 1);
37c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	}
38c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	return n;
39c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger}
40c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger
41c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettingerstatic PyObject *
42c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettingerrange_new(PyTypeObject *type, PyObject *args, PyObject *kw)
43c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger{
44feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	rangeobject *obj;
45c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	long ilow = 0, ihigh = 0, istep = 1;
46c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	long n;
47c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger
4802c42871cf73365dc5b6915cac2b017b2b90c81fGeorg Brandl	if (!_PyArg_NoKeywords("xrange()", kw))
4902c42871cf73365dc5b6915cac2b017b2b90c81fGeorg Brandl		return NULL;
5002c42871cf73365dc5b6915cac2b017b2b90c81fGeorg Brandl
51c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	if (PyTuple_Size(args) <= 1) {
52c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		if (!PyArg_ParseTuple(args,
53c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger				"l;xrange() requires 1-3 int arguments",
54c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger				&ihigh))
55c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger			return NULL;
56c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	}
57c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	else {
58c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		if (!PyArg_ParseTuple(args,
59c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger				"ll|l;xrange() requires 1-3 int arguments",
60c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger				&ilow, &ihigh, &istep))
61c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger			return NULL;
62c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	}
63c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	if (istep == 0) {
64c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
65c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		return NULL;
66c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	}
67c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	if (istep > 0)
68c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		n = get_len_of_range(ilow, ihigh, istep);
69c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	else
70c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		n = get_len_of_range(ihigh, ilow, -istep);
71c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	if (n < 0) {
72c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		PyErr_SetString(PyExc_OverflowError,
73c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger				"xrange() result has too many items");
74c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger		return NULL;
75c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger	}
76feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters
77feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	obj = PyObject_New(rangeobject, &PyRange_Type);
78feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	if (obj == NULL)
79feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters		return NULL;
80feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	obj->start = ilow;
81feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	obj->len   = n;
82feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	obj->step  = istep;
83feec4533e21a612e9a5b665c27b1a3eb84e04bb3Tim Peters	return (PyObject *) obj;
84c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger}
85c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger
8614f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(range_doc,
87c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger"xrange([start,] stop[, step]) -> xrange object\n\
88c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger\n\
89c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond HettingerLike range(), but instead of returning a list, returns an object that\n\
90d2bef8256bf7ce6bea7a80074cbd021b5af154afRaymond Hettingergenerates the numbers in the range on demand.  For looping, this is \n\
91d2bef8256bf7ce6bea7a80074cbd021b5af154afRaymond Hettingerslightly faster than range() and more memory efficient.");
92c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger
93c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PyObject *
9418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisrange_item(rangeobject *r, Py_ssize_t i)
9512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{
96d9018323c035b3c5127d635f237f0009a060053aFred Drake	if (i < 0 || i >= r->len) {
97d9018323c035b3c5127d635f237f0009a060053aFred Drake		PyErr_SetString(PyExc_IndexError,
985dadf7e976c55ac3960f79aaa5741ab37a10cdf4Guido van Rossum				"xrange object index out of range");
99d9018323c035b3c5127d635f237f0009a060053aFred Drake		return NULL;
100d9018323c035b3c5127d635f237f0009a060053aFred Drake	}
1010913166da2629a567c7acdb70511a1b2347000fbRaymond Hettinger	return PyInt_FromSsize_t(r->start + i * r->step);
10212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}
10312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum
10418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwisstatic Py_ssize_t
10545cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_length(rangeobject *r)
10612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{
10718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	return (Py_ssize_t)(r->len);
1087d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum}
1097d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum
110c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PyObject *
11145cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_repr(rangeobject *r)
11212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{
1137ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw	PyObject *rtn;
114d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters
11572d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters	if (r->start == 0 && r->step == 1)
116dd96db63f689e2f0d8ae5a1436b3b3395eec7de5Gregory P. Smith		rtn = PyString_FromFormat("xrange(%ld)",
1177ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->start + r->len * r->step);
11872d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters
11972d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters	else if (r->step == 1)
120dd96db63f689e2f0d8ae5a1436b3b3395eec7de5Gregory P. Smith		rtn = PyString_FromFormat("xrange(%ld, %ld)",
1217ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->start,
1227ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->start + r->len * r->step);
12372d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters
12472d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters	else
125dd96db63f689e2f0d8ae5a1436b3b3395eec7de5Gregory P. Smith		rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)",
1267ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->start,
1277ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->start + r->len * r->step,
1287ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw					  r->step);
1297ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw	return rtn;
130efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters}
131efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters
1321f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti/* Pickling support */
1331f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalottistatic PyObject *
1341f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalottirange_getnewargs(rangeobject *r)
1351f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti{
1361f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti	return Py_BuildValue("(iii)",
1371f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti			     r->start,
1381f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti			     r->start + r->len * r->step,
1391f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti			     r->step);
1401f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti}
1411f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti
142c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PySequenceMethods range_as_sequence = {
14318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	(lenfunc)range_length,	/* sq_length */
144d9018323c035b3c5127d635f237f0009a060053aFred Drake	0,			/* sq_concat */
145d9018323c035b3c5127d635f237f0009a060053aFred Drake	0,			/* sq_repeat */
14618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	(ssizeargfunc)range_item, /* sq_item */
147d9018323c035b3c5127d635f237f0009a060053aFred Drake	0,			/* sq_slice */
14812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum};
14912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum
150938ace69a0e112424a2f426a4881d1fd1fc922d2Jeremy Hyltonstatic PyObject * range_iter(PyObject *seq);
15185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * range_reverse(PyObject *seq);
15285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
15385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyDoc_STRVAR(reverse_doc,
15485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"Returns a reverse iterator.");
15585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
15685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyMethodDef range_methods[] = {
15785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger	{"__reversed__",	(PyCFunction)range_reverse, METH_NOARGS, reverse_doc},
1581f2f61a78f80933a3e703df1ab08f14e70ea87d5Alexandre Vassalotti	{"__getnewargs__",	(PyCFunction)range_getnewargs, METH_NOARGS},
15985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 	{NULL,		NULL}		/* sentinel */
16085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger};
16148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger
162c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van RossumPyTypeObject PyRange_Type = {
163c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum	PyObject_HEAD_INIT(&PyType_Type)
164347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* Number of items for varobject */
165347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	"xrange",		/* Name of this type */
166347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	sizeof(rangeobject),	/* Basic object size */
167347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* Item size for varobject */
168347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	(destructor)PyObject_Del, /* tp_dealloc */
169347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_print */
170347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_getattr */
171347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_setattr */
172347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_compare */
173347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	(reprfunc)range_repr,	/* tp_repr */
174347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_as_number */
175347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	&range_as_sequence,	/* tp_as_sequence */
176347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_as_mapping */
177347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_hash */
178347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_call */
179347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_str */
180347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	PyObject_GenericGetAttr,  /* tp_getattro */
181347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_setattro */
182347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_as_buffer */
183347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	Py_TPFLAGS_DEFAULT,	/* tp_flags */
184347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	range_doc,		/* tp_doc */
185347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_traverse */
186347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_clear */
187347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_richcompare */
188347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_weaklistoffset */
189347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	range_iter,		/* tp_iter */
190347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_iternext */
191347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	range_methods,		/* tp_methods */
192347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_members */
193347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_getset */
194347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_base */
195347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_dict */
196347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_descr_get */
197347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_descr_set */
198347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_dictoffset */
199347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_init */
200347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	0,			/* tp_alloc */
201347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl	range_new,		/* tp_new */
20248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger};
20348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger
20448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger/*********************** Xrange Iterator **************************/
20548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger
20648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingertypedef struct {
20748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	PyObject_HEAD
20848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	long	index;
20948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	long	start;
21048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	long	step;
21148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	long	len;
21248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} rangeiterobject;
21348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger
21485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject *
21548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingerrangeiter_next(rangeiterobject *r)
21648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger{
217d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters	if (r->index < r->len)
21848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger		return PyInt_FromLong(r->start + (r->index++) * r->step);
21948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	return NULL;
22048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger}
22148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger
2226b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyObject *
223ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettingerrangeiter_len(rangeiterobject *r)
224ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger{
2256b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	return PyInt_FromLong(r->len - r->index);
226ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger}
227ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger
228f5b3e36493da275334e29afdbd238863697dca35Armin RigoPyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
229ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger
2306b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyMethodDef rangeiter_methods[] = {
231f5b3e36493da275334e29afdbd238863697dca35Armin Rigo	{"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS, length_hint_doc},
2326b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 	{NULL,		NULL}		/* sentinel */
2336b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger};
234ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger
23556f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitzstatic PyTypeObject Pyrangeiter_Type = {
23648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	PyObject_HEAD_INIT(&PyType_Type)
23748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* ob_size */
23856f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz	"rangeiterator",                        /* tp_name */
23956f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz	sizeof(rangeiterobject),                /* tp_basicsize */
24048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_itemsize */
24148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	/* methods */
24248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	(destructor)PyObject_Del,		/* tp_dealloc */
24348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_print */
24448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_getattr */
24548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_setattr */
24648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_compare */
24748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_repr */
24848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_as_number */
2496b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	0,					/* tp_as_sequence */
25048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_as_mapping */
25148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_hash */
25248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_call */
25348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_str */
25448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	PyObject_GenericGetAttr,                /* tp_getattro */
25548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_setattro */
25648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_as_buffer */
25748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	Py_TPFLAGS_DEFAULT,			/* tp_flags */
25848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_doc */
25948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,					/* tp_traverse */
26048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_clear */
26148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_richcompare */
26248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	0,                                      /* tp_weaklistoffset */
2631da1dbf4586afbd6b5d5c3cf244a1a3ea0f4382bRaymond Hettinger	PyObject_SelfIter,			/* tp_iter */
26448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger	(iternextfunc)rangeiter_next,		/* tp_iternext */
2656b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	rangeiter_methods,			/* tp_methods */
2666b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	0,
26748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger};
26872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
26972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisstatic PyObject *
27072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisrange_iter(PyObject *seq)
27172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis{
27272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	rangeiterobject *it;
27372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
27472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	if (!PyRange_Check(seq)) {
27572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		PyErr_BadInternalCall();
27672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		return NULL;
27772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	}
27872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it = PyObject_New(rangeiterobject, &Pyrangeiter_Type);
27972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	if (it == NULL)
28072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		return NULL;
28172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->index = 0;
28272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->start = ((rangeobject *)seq)->start;
28372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->step = ((rangeobject *)seq)->step;
28472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->len = ((rangeobject *)seq)->len;
28572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	return (PyObject *)it;
28672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis}
28772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
28872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisstatic PyObject *
28972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisrange_reverse(PyObject *seq)
29072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis{
29172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	rangeiterobject *it;
29272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	long start, step, len;
29372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
29472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	if (!PyRange_Check(seq)) {
29572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		PyErr_BadInternalCall();
29672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		return NULL;
29772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	}
29872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it = PyObject_New(rangeiterobject, &Pyrangeiter_Type);
29972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	if (it == NULL)
30072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis		return NULL;
30172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
30272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	start = ((rangeobject *)seq)->start;
30372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	step = ((rangeobject *)seq)->step;
30472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	len = ((rangeobject *)seq)->len;
30572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
30672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->index = 0;
30772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->start = start + (len-1) * step;
30872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->step = -step;
30972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	it->len = len;
31072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis
31172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis	return (PyObject *)it;
31272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis}
313