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