rangeobject.c revision 0913166da2629a567c7acdb70511a1b2347000fb
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) 1167ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld)", 1177ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 11872d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 11972d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else if (r->step == 1) 1207ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld, %ld)", 1217ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start, 1227ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 12372d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 12472d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else 1257ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw 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 132c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PySequenceMethods range_as_sequence = { 13318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis (lenfunc)range_length, /* sq_length */ 134d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_concat */ 135d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_repeat */ 13618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis (ssizeargfunc)range_item, /* sq_item */ 137d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_slice */ 13812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}; 13912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 140938ace69a0e112424a2f426a4881d1fd1fc922d2Jeremy Hyltonstatic PyObject * range_iter(PyObject *seq); 14185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * range_reverse(PyObject *seq); 14285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 14385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyDoc_STRVAR(reverse_doc, 14485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"Returns a reverse iterator."); 14585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 14685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyMethodDef range_methods[] = { 14785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, 14885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger {NULL, NULL} /* sentinel */ 14985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}; 15048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 151c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van RossumPyTypeObject PyRange_Type = { 152c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum PyObject_HEAD_INIT(&PyType_Type) 153347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* Number of items for varobject */ 154347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl "xrange", /* Name of this type */ 155347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl sizeof(rangeobject), /* Basic object size */ 156347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* Item size for varobject */ 157347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl (destructor)PyObject_Del, /* tp_dealloc */ 158347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_print */ 159347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_getattr */ 160347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_setattr */ 161347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_compare */ 162347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl (reprfunc)range_repr, /* tp_repr */ 163347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_as_number */ 164347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl &range_as_sequence, /* tp_as_sequence */ 165347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_as_mapping */ 166347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_hash */ 167347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_call */ 168347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_str */ 169347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl PyObject_GenericGetAttr, /* tp_getattro */ 170347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_setattro */ 171347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_as_buffer */ 172347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl Py_TPFLAGS_DEFAULT, /* tp_flags */ 173347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl range_doc, /* tp_doc */ 174347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_traverse */ 175347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_clear */ 176347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_richcompare */ 177347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_weaklistoffset */ 178347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl range_iter, /* tp_iter */ 179347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_iternext */ 180347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl range_methods, /* tp_methods */ 181347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_members */ 182347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_getset */ 183347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_base */ 184347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_dict */ 185347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_descr_get */ 186347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_descr_set */ 187347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_dictoffset */ 188347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_init */ 189347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl 0, /* tp_alloc */ 190347b30042b68e80b245a03b23cb616024ecb1f1eGeorg Brandl range_new, /* tp_new */ 19148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger}; 19248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 19348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger/*********************** Xrange Iterator **************************/ 19448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 19548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingertypedef struct { 19648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_HEAD 19748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long index; 19848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long start; 19948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long step; 20048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long len; 20148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} rangeiterobject; 20248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 20385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * 20448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingerrangeiter_next(rangeiterobject *r) 20548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger{ 206d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters if (r->index < r->len) 20748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return PyInt_FromLong(r->start + (r->index++) * r->step); 20848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return NULL; 20948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} 21048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 2116b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyObject * 212ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettingerrangeiter_len(rangeiterobject *r) 213ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger{ 2146b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger return PyInt_FromLong(r->len - r->index); 215ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger} 216ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 217f5b3e36493da275334e29afdbd238863697dca35Armin RigoPyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); 218ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 2196b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyMethodDef rangeiter_methods[] = { 220f5b3e36493da275334e29afdbd238863697dca35Armin Rigo {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS, length_hint_doc}, 2216b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger {NULL, NULL} /* sentinel */ 2226b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger}; 223ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 22456f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitzstatic PyTypeObject Pyrangeiter_Type = { 22548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_HEAD_INIT(&PyType_Type) 22648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* ob_size */ 22756f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz "rangeiterator", /* tp_name */ 22856f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz sizeof(rangeiterobject), /* tp_basicsize */ 22948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_itemsize */ 23048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger /* methods */ 23148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger (destructor)PyObject_Del, /* tp_dealloc */ 23248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_print */ 23348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_getattr */ 23448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_setattr */ 23548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_compare */ 23648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_repr */ 23748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_number */ 2386b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 0, /* tp_as_sequence */ 23948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_mapping */ 24048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_hash */ 24148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_call */ 24248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_str */ 24348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_GenericGetAttr, /* tp_getattro */ 24448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_setattro */ 24548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_buffer */ 24648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger Py_TPFLAGS_DEFAULT, /* tp_flags */ 24748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_doc */ 24848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_traverse */ 24948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_clear */ 25048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_richcompare */ 25148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_weaklistoffset */ 2521da1dbf4586afbd6b5d5c3cf244a1a3ea0f4382bRaymond Hettinger PyObject_SelfIter, /* tp_iter */ 25348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger (iternextfunc)rangeiter_next, /* tp_iternext */ 2546b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger rangeiter_methods, /* tp_methods */ 2556b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 0, 25648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger}; 25772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 25872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisstatic PyObject * 25972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisrange_iter(PyObject *seq) 26072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis{ 26172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis rangeiterobject *it; 26272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 26372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis if (!PyRange_Check(seq)) { 26472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis PyErr_BadInternalCall(); 26572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return NULL; 26672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis } 26772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); 26872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis if (it == NULL) 26972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return NULL; 27072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->index = 0; 27172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->start = ((rangeobject *)seq)->start; 27272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->step = ((rangeobject *)seq)->step; 27372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->len = ((rangeobject *)seq)->len; 27472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return (PyObject *)it; 27572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis} 27672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 27772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisstatic PyObject * 27872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwisrange_reverse(PyObject *seq) 27972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis{ 28072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis rangeiterobject *it; 28172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis long start, step, len; 28272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 28372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis if (!PyRange_Check(seq)) { 28472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis PyErr_BadInternalCall(); 28572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return NULL; 28672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis } 28772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); 28872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis if (it == NULL) 28972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return NULL; 29072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 29172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis start = ((rangeobject *)seq)->start; 29272d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis step = ((rangeobject *)seq)->step; 29372d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis len = ((rangeobject *)seq)->len; 29472d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 29572d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->index = 0; 29672d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->start = start + (len-1) * step; 29772d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->step = -step; 29872d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis it->len = len; 29972d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis 30072d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis return (PyObject *)it; 30172d206776d34bcc38abbf16aa93c2d25ebec4df9Martin v. Löwis} 302