rangeobject.c revision 6b27cda64386195cd07dfb686e9486f1c4bc3159
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 * 9445cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_item(rangeobject *r, int 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 } 101c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum return PyInt_FromLong(r->start + (i % r->len) * r->step); 10212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} 10312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 10412d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossumstatic int 10545cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_length(rangeobject *r) 10612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 107d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum#if LONG_MAX != INT_MAX 108d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum if (r->len > INT_MAX) { 109d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum PyErr_SetString(PyExc_ValueError, 110d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum "xrange object size cannot be reported"); 111d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum return -1; 112d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum } 113d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum#endif 114d4774fb6efde8facccfe0b60a37e3ecd4a943bd9Guido van Rossum return (int)(r->len); 1157d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum} 1167d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum 117c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PyObject * 11845cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_repr(rangeobject *r) 11912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 1207ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw PyObject *rtn; 121d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters 12272d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters if (r->start == 0 && r->step == 1) 1237ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld)", 1247ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 12572d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 12672d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else if (r->step == 1) 1277ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld, %ld)", 1287ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start, 1297ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 13072d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 13172d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else 1327ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)", 1337ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start, 1347ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step, 1357ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->step); 1367ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw return rtn; 137efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 138efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 139c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PySequenceMethods range_as_sequence = { 140d9018323c035b3c5127d635f237f0009a060053aFred Drake (inquiry)range_length, /* sq_length */ 141d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_concat */ 142d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_repeat */ 143d9018323c035b3c5127d635f237f0009a060053aFred Drake (intargfunc)range_item, /* sq_item */ 144d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* sq_slice */ 14512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}; 14612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 147938ace69a0e112424a2f426a4881d1fd1fc922d2Jeremy Hyltonstatic PyObject * range_iter(PyObject *seq); 14885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * range_reverse(PyObject *seq); 14985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 15085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyDoc_STRVAR(reverse_doc, 15185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"Returns a reverse iterator."); 15285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 15385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyMethodDef range_methods[] = { 15485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, 15585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger {NULL, NULL} /* sentinel */ 15685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}; 15748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 158c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van RossumPyTypeObject PyRange_Type = { 159c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum PyObject_HEAD_INIT(&PyType_Type) 160d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* Number of items for varobject */ 161d9018323c035b3c5127d635f237f0009a060053aFred Drake "xrange", /* Name of this type */ 162d9018323c035b3c5127d635f237f0009a060053aFred Drake sizeof(rangeobject), /* Basic object size */ 163d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* Item size for varobject */ 164d9018323c035b3c5127d635f237f0009a060053aFred Drake (destructor)PyObject_Del, /* tp_dealloc */ 165d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_print */ 166d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_getattr */ 167d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_setattr */ 168d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_compare */ 169d9018323c035b3c5127d635f237f0009a060053aFred Drake (reprfunc)range_repr, /* tp_repr */ 170d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_as_number */ 171d9018323c035b3c5127d635f237f0009a060053aFred Drake &range_as_sequence, /* tp_as_sequence */ 172d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_as_mapping */ 173d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_hash */ 174d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_call */ 175d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_str */ 1765ae8e01cc5f7e7e85530abc59b4362c5541872a7Raymond Hettinger PyObject_GenericGetAttr, /* tp_getattro */ 177d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_setattro */ 178d9018323c035b3c5127d635f237f0009a060053aFred Drake 0, /* tp_as_buffer */ 179d9018323c035b3c5127d635f237f0009a060053aFred Drake Py_TPFLAGS_DEFAULT, /* tp_flags */ 180c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger range_doc, /* tp_doc */ 181e452659237aa9716231fd97f7fb59bc0eff0d417Martin v. Löwis 0, /* tp_traverse */ 182e452659237aa9716231fd97f7fb59bc0eff0d417Martin v. Löwis 0, /* tp_clear */ 183e452659237aa9716231fd97f7fb59bc0eff0d417Martin v. Löwis 0, /* tp_richcompare */ 184e452659237aa9716231fd97f7fb59bc0eff0d417Martin v. Löwis 0, /* tp_weaklistoffset */ 185c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger (getiterfunc)range_iter, /* tp_iter */ 186c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_iternext */ 187d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters range_methods, /* tp_methods */ 188c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_members */ 189c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_getset */ 190c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_base */ 191c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_dict */ 192c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_descr_get */ 193c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_descr_set */ 194c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_dictoffset */ 195c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_init */ 196c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger 0, /* tp_alloc */ 197c4c453f5ae0a245aa0dd59431c323911c47f2735Raymond Hettinger range_new, /* tp_new */ 19848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger}; 19948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 20048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger/*********************** Xrange Iterator **************************/ 20148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 20248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingertypedef struct { 20348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_HEAD 20448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long index; 20548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long start; 20648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long step; 20748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger long len; 20848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} rangeiterobject; 20948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 210938ace69a0e112424a2f426a4881d1fd1fc922d2Jeremy Hyltonstatic PyTypeObject Pyrangeiter_Type; 21148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 21256f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitzstatic PyObject * 21348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingerrange_iter(PyObject *seq) 21448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger{ 21548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger rangeiterobject *it; 21648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 21748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger if (!PyRange_Check(seq)) { 21848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyErr_BadInternalCall(); 21948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return NULL; 22048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger } 22148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); 22248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger if (it == NULL) 22348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return NULL; 22448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger it->index = 0; 22548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger it->start = ((rangeobject *)seq)->start; 22648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger it->step = ((rangeobject *)seq)->step; 22748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger it->len = ((rangeobject *)seq)->len; 22848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return (PyObject *)it; 22948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} 23048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 23148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingerstatic PyObject * 23285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerrange_reverse(PyObject *seq) 23385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{ 23485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger rangeiterobject *it; 23585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger long start, step, len; 23685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 23785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger if (!PyRange_Check(seq)) { 23885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger PyErr_BadInternalCall(); 23985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger return NULL; 24085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger } 24185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); 24285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger if (it == NULL) 24385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger return NULL; 24485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 24585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger start = ((rangeobject *)seq)->start; 24685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger step = ((rangeobject *)seq)->step; 24785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger len = ((rangeobject *)seq)->len; 24885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 24985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger it->index = 0; 25085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger it->start = start + (len-1) * step; 25185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger it->step = -step; 25285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger it->len = len; 25385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 25485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger return (PyObject *)it; 25585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} 25685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 25785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * 25848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettingerrangeiter_next(rangeiterobject *r) 25948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger{ 260d976ab7caf098eecf44173bbce8101f13ce79d86Tim Peters if (r->index < r->len) 26148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return PyInt_FromLong(r->start + (r->index++) * r->step); 26248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger return NULL; 26348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger} 26448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 2656b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyObject * 266ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettingerrangeiter_len(rangeiterobject *r) 267ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger{ 2686b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger return PyInt_FromLong(r->len - r->index); 269ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger} 270ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 2716b27cda64386195cd07dfb686e9486f1c4bc3159Raymond HettingerPyDoc_STRVAR(length_cue_doc, "Private method returning an estimate of len(list(it))."); 272ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 2736b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyMethodDef rangeiter_methods[] = { 2746b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger {"_length_cue", (PyCFunction)rangeiter_len, METH_NOARGS, length_cue_doc}, 2756b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger {NULL, NULL} /* sentinel */ 2766b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger}; 277ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 27856f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitzstatic PyTypeObject Pyrangeiter_Type = { 27948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_HEAD_INIT(&PyType_Type) 28048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* ob_size */ 28156f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz "rangeiterator", /* tp_name */ 28256f46f8d8c1af1cf150df61f5aeafa40ca0b18e5Neal Norwitz sizeof(rangeiterobject), /* tp_basicsize */ 28348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_itemsize */ 28448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger /* methods */ 28548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger (destructor)PyObject_Del, /* tp_dealloc */ 28648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_print */ 28748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_getattr */ 28848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_setattr */ 28948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_compare */ 29048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_repr */ 29148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_number */ 2926b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 0, /* tp_as_sequence */ 29348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_mapping */ 29448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_hash */ 29548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_call */ 29648165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_str */ 29748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger PyObject_GenericGetAttr, /* tp_getattro */ 29848165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_setattro */ 29948165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_as_buffer */ 30048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger Py_TPFLAGS_DEFAULT, /* tp_flags */ 30148165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_doc */ 30248165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_traverse */ 30348165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_clear */ 30448165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_richcompare */ 30548165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger 0, /* tp_weaklistoffset */ 3061da1dbf4586afbd6b5d5c3cf244a1a3ea0f4382bRaymond Hettinger PyObject_SelfIter, /* tp_iter */ 30748165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger (iternextfunc)rangeiter_next, /* tp_iternext */ 3086b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger rangeiter_methods, /* tp_methods */ 3096b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 0, 31048165d40cbe4280ba4c668798200548a22bce3ddRaymond Hettinger}; 311