annotate Objects/rangeobject.c @ 57303:4aa4c19dfaed legacy-trunk

#1757126: fix typo with the cyrillic_asian alias
author Philip Jenvey <pjenvey@underboss.org>
date Tue, 17 Nov 2009 02:42:26 +0000
parents d127679ecfaa
children fd25030223b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Range object implementation */
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
3 #include "Python.h"
18436
9653272f036f Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents: 18391
diff changeset
4
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 typedef struct {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
6 PyObject_HEAD
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 long start;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 long step;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 long len;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 } rangeobject;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
12 /* Return number of items in range (lo, hi, step). step != 0
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
13 * required. The result always fits in an unsigned long.
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
14 */
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
15 static unsigned long
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
16 get_len_of_range(long lo, long hi, long step)
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
17 {
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
18 /* -------------------------------------------------------------
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
19 If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty.
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
20 Else for step > 0, if n values are in the range, the last one is
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
21 lo + (n-1)*step, which must be <= hi-1. Rearranging,
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
22 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
23 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
24 the RHS is non-negative and so truncation is the same as the
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
25 floor. Letting M be the largest positive long, the worst case
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
26 for the RHS numerator is hi=M, lo=-M-1, and then
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
27 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
28 precision to compute the RHS exactly. The analysis for step < 0
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
29 is similar.
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
30 ---------------------------------------------------------------*/
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
31 assert(step != 0);
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
32 if (step > 0 && lo < hi)
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
33 return 1UL + (hi - 1UL - lo) / step;
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
34 else if (step < 0 && lo > hi)
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
35 return 1UL + (lo - 1UL - hi) / (0UL - step);
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
36 else
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
37 return 0UL;
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
38 }
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
39
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
40 static PyObject *
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
41 range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
42 {
33047
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
43 rangeobject *obj;
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
44 long ilow = 0, ihigh = 0, istep = 1;
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
45 unsigned long n;
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
46
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34087
diff changeset
47 if (!_PyArg_NoKeywords("xrange()", kw))
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34087
diff changeset
48 return NULL;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34087
diff changeset
49
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
50 if (PyTuple_Size(args) <= 1) {
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
51 if (!PyArg_ParseTuple(args,
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
52 "l;xrange() requires 1-3 int arguments",
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
53 &ihigh))
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
54 return NULL;
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
55 }
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
56 else {
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
57 if (!PyArg_ParseTuple(args,
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
58 "ll|l;xrange() requires 1-3 int arguments",
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
59 &ilow, &ihigh, &istep))
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
60 return NULL;
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
61 }
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
62 if (istep == 0) {
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
63 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
64 return NULL;
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
65 }
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
66 n = get_len_of_range(ilow, ihigh, istep);
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
67 if (n > (unsigned long)LONG_MAX || (long)n > PY_SSIZE_T_MAX) {
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
68 PyErr_SetString(PyExc_OverflowError,
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
69 "xrange() result has too many items");
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
70 return NULL;
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
71 }
33047
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
72
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
73 obj = PyObject_New(rangeobject, &PyRange_Type);
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
74 if (obj == NULL)
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
75 return NULL;
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
76 obj->start = ilow;
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
77 obj->len = (long)n;
33047
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
78 obj->step = istep;
c81ed079576f Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents: 33046
diff changeset
79 return (PyObject *) obj;
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
80 }
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
81
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23702
diff changeset
82 PyDoc_STRVAR(range_doc,
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
83 "xrange([start,] stop[, step]) -> xrange object\n\
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
84 \n\
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
85 Like range(), but instead of returning a list, returns an object that\n\
26592
0c646baeec58 Update comments about the performance of xrange().
Raymond Hettinger <python@rcn.com>
parents: 26097
diff changeset
86 generates the numbers in the range on demand. For looping, this is \n\
0c646baeec58 Update comments about the performance of xrange().
Raymond Hettinger <python@rcn.com>
parents: 26097
diff changeset
87 slightly faster than range() and more memory efficient.");
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23693
diff changeset
88
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
89 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
90 range_item(rangeobject *r, Py_ssize_t i)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 {
23361
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
92 if (i < 0 || i >= r->len) {
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
93 PyErr_SetString(PyExc_IndexError,
9828
80150f9c8c41 Use 'xrange', not 'range', in error messages. Reported by Nathan Sullivan.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
94 "xrange object index out of range");
23361
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
95 return NULL;
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
96 }
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
97 /* do calculation entirely using unsigned longs, to avoid
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
98 undefined behaviour due to signed overflow. */
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
99 return PyInt_FromLong((long)(r->start + (unsigned long)i * r->step));
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
101
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
102 static Py_ssize_t
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
103 range_length(rangeobject *r)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
105 return (Py_ssize_t)(r->len);
1444
f2d04054c934 * rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents: 1387
diff changeset
106 }
f2d04054c934 * rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents: 1387
diff changeset
107
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
108 static PyObject *
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
109 range_repr(rangeobject *r)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 {
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
111 PyObject *rtn;
33046
67d25217bc7f Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32897
diff changeset
112
13848
dd042f5a8fa2 Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents: 13847
diff changeset
113 if (r->start == 0 && r->step == 1)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
114 rtn = PyString_FromFormat("xrange(%ld)",
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
115 r->start + r->len * r->step);
13848
dd042f5a8fa2 Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents: 13847
diff changeset
116
dd042f5a8fa2 Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents: 13847
diff changeset
117 else if (r->step == 1)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
118 rtn = PyString_FromFormat("xrange(%ld, %ld)",
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
119 r->start,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
120 r->start + r->len * r->step);
13848
dd042f5a8fa2 Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents: 13847
diff changeset
121
dd042f5a8fa2 Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents: 13847
diff changeset
122 else
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
123 rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)",
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
124 r->start,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
125 r->start + r->len * r->step,
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
126 r->step);
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
127 return rtn;
18436
9653272f036f Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents: 18391
diff changeset
128 }
9653272f036f Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents: 18391
diff changeset
129
47534
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
130 /* Pickling support */
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
131 static PyObject *
47535
3939ff89834c Added better pickling support to xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47534
diff changeset
132 range_reduce(rangeobject *r, PyObject *args)
47534
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
133 {
47535
3939ff89834c Added better pickling support to xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47534
diff changeset
134 return Py_BuildValue("(O(iii))", Py_TYPE(r),
47534
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
135 r->start,
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
136 r->start + r->len * r->step,
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
137 r->step);
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
138 }
df9b337ba311 Issue 2582: Fix pickling of xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47527
diff changeset
139
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
140 static PySequenceMethods range_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
141 (lenfunc)range_length, /* sq_length */
23361
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
142 0, /* sq_concat */
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
143 0, /* sq_repeat */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
144 (ssizeargfunc)range_item, /* sq_item */
23361
aee8f16f2774 Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents: 23348
diff changeset
145 0, /* sq_slice */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 };
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24260
diff changeset
148 static PyObject * range_iter(PyObject *seq);
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
149 static PyObject * range_reverse(PyObject *seq);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
150
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
151 PyDoc_STRVAR(reverse_doc,
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
152 "Returns a reverse iterator.");
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
153
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
154 static PyMethodDef range_methods[] = {
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
155 {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc},
47535
3939ff89834c Added better pickling support to xrange objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 47534
diff changeset
156 {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS},
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
157 {NULL, NULL} /* sentinel */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
158 };
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
159
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
160 PyTypeObject PyRange_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4588
diff changeset
161 PyObject_HEAD_INIT(&PyType_Type)
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
162 0, /* Number of items for varobject */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
163 "xrange", /* Name of this type */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
164 sizeof(rangeobject), /* Basic object size */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
165 0, /* Item size for varobject */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
166 (destructor)PyObject_Del, /* tp_dealloc */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
167 0, /* tp_print */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
168 0, /* tp_getattr */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
169 0, /* tp_setattr */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
170 0, /* tp_compare */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
171 (reprfunc)range_repr, /* tp_repr */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
172 0, /* tp_as_number */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
173 &range_as_sequence, /* tp_as_sequence */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
174 0, /* tp_as_mapping */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
175 0, /* tp_hash */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
176 0, /* tp_call */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
177 0, /* tp_str */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
178 PyObject_GenericGetAttr, /* tp_getattro */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
179 0, /* tp_setattro */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
180 0, /* tp_as_buffer */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
181 Py_TPFLAGS_DEFAULT, /* tp_flags */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
182 range_doc, /* tp_doc */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
183 0, /* tp_traverse */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
184 0, /* tp_clear */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
185 0, /* tp_richcompare */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
186 0, /* tp_weaklistoffset */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
187 range_iter, /* tp_iter */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
188 0, /* tp_iternext */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
189 range_methods, /* tp_methods */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
190 0, /* tp_members */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
191 0, /* tp_getset */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
192 0, /* tp_base */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
193 0, /* tp_dict */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
194 0, /* tp_descr_get */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
195 0, /* tp_descr_set */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
196 0, /* tp_dictoffset */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
197 0, /* tp_init */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
198 0, /* tp_alloc */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
199 range_new, /* tp_new */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 };
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
201
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
202 /*********************** Xrange Iterator **************************/
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
203
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
204 typedef struct {
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
205 PyObject_HEAD
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
206 long index;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
207 long start;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
208 long step;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
209 long len;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
210 } rangeiterobject;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
211
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 28320
diff changeset
212 static PyObject *
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
213 rangeiter_next(rangeiterobject *r)
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
214 {
33046
67d25217bc7f Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32897
diff changeset
215 if (r->index < r->len)
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
216 return PyInt_FromLong(r->start + (r->index++) * r->step);
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
217 return NULL;
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
218 }
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
219
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
220 static PyObject *
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
221 rangeiter_len(rangeiterobject *r)
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
222 {
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
223 return PyInt_FromLong(r->len - r->index);
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
224 }
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
225
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 35636
diff changeset
226 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
227
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
228 static PyMethodDef rangeiter_methods[] = {
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 35636
diff changeset
229 {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS, length_hint_doc},
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
230 {NULL, NULL} /* sentinel */
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
231 };
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 30865
diff changeset
232
23702
d4f6e2adde48 Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents: 23695
diff changeset
233 static PyTypeObject Pyrangeiter_Type = {
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
234 PyObject_HEAD_INIT(&PyType_Type)
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
235 0, /* ob_size */
23702
d4f6e2adde48 Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents: 23695
diff changeset
236 "rangeiterator", /* tp_name */
d4f6e2adde48 Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents: 23695
diff changeset
237 sizeof(rangeiterobject), /* tp_basicsize */
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
238 0, /* tp_itemsize */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
239 /* methods */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
240 (destructor)PyObject_Del, /* tp_dealloc */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
241 0, /* tp_print */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
242 0, /* tp_getattr */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
243 0, /* tp_setattr */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
244 0, /* tp_compare */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
245 0, /* tp_repr */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
246 0, /* tp_as_number */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
247 0, /* tp_as_sequence */
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
248 0, /* tp_as_mapping */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
249 0, /* tp_hash */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
250 0, /* tp_call */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
251 0, /* tp_str */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
252 PyObject_GenericGetAttr, /* tp_getattro */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
253 0, /* tp_setattro */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
254 0, /* tp_as_buffer */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
255 Py_TPFLAGS_DEFAULT, /* tp_flags */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
256 0, /* tp_doc */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
257 0, /* tp_traverse */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
258 0, /* tp_clear */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
259 0, /* tp_richcompare */
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
260 0, /* tp_weaklistoffset */
28320
fd5ef7003469 Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents: 28308
diff changeset
261 PyObject_SelfIter, /* tp_iter */
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
262 (iternextfunc)rangeiter_next, /* tp_iternext */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
263 rangeiter_methods, /* tp_methods */
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
264 0,
23693
8983158e9f11 SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents: 23664
diff changeset
265 };
37602
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
266
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
267 static PyObject *
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
268 range_iter(PyObject *seq)
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
269 {
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
270 rangeiterobject *it;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
271
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
272 if (!PyRange_Check(seq)) {
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
273 PyErr_BadInternalCall();
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
274 return NULL;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
275 }
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
276 it = PyObject_New(rangeiterobject, &Pyrangeiter_Type);
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
277 if (it == NULL)
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
278 return NULL;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
279 it->index = 0;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
280 it->start = ((rangeobject *)seq)->start;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
281 it->step = ((rangeobject *)seq)->step;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
282 it->len = ((rangeobject *)seq)->len;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
283 return (PyObject *)it;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
284 }
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
285
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
286 static PyObject *
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
287 range_reverse(PyObject *seq)
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
288 {
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
289 rangeiterobject *it;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
290 long start, step, len;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
291
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
292 if (!PyRange_Check(seq)) {
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
293 PyErr_BadInternalCall();
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
294 return NULL;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
295 }
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
296 it = PyObject_New(rangeiterobject, &Pyrangeiter_Type);
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
297 if (it == NULL)
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
298 return NULL;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
299
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
300 start = ((rangeobject *)seq)->start;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
301 step = ((rangeobject *)seq)->step;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
302 len = ((rangeobject *)seq)->len;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
303
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
304 it->index = 0;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
305 it->len = len;
57265
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
306 /* the casts below guard against signed overflow by turning it
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
307 into unsigned overflow instead. The correctness of this
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
308 code still depends on conversion from unsigned long to long
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
309 wrapping modulo ULONG_MAX+1, which isn't guaranteed (see
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
310 C99 6.3.1.3p3) but seems to hold in practice for all
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
311 platforms we're likely to meet.
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
312
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
313 If step == LONG_MIN then we still end up with LONG_MIN
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
314 after negation; but this works out, since we've still got
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
315 the correct value modulo ULONG_MAX+1, and the range_item
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
316 calculation is also done modulo ULONG_MAX+1.
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
317 */
c217e0331d4b Merged revisions 76295 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47535
diff changeset
318 it->start = (long)(start + (unsigned long)(len-1) * step);
57298
d127679ecfaa Merged revisions 76330 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57265
diff changeset
319 it->step = (long)(0UL-step);
37602
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
320
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
321 return (PyObject *)it;
ca95ad5b0fbc Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents: 37476
diff changeset
322 }