Mercurial > cpython-lru_cache-weakref
annotate Modules/itertoolsmodule.c @ 34161:ca2ca1aeb080 2.4
Check in missing png version of pyfav.gif.
| author | Johannes Gijsbers <jlg@dds.nl> |
|---|---|
| date | Mon, 13 Dec 2004 13:11:42 +0000 |
| parents | c66e6c9ffc2d |
| children | 97c97194e64b 1d1d6377acb1 |
| rev | line source |
|---|---|
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2 #include "Python.h" |
|
33779
c66e6c9ffc2d
some platforms still need offsetof() from structmember.h
Fred Drake <fdrake@acm.org>
parents:
33777
diff
changeset
|
3 #include "structmember.h" |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5 /* Itertools module written and maintained |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6 by Raymond D. Hettinger <python@rcn.com> |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
7 Copyright (c) 2003 Python Software Foundation. |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
8 All rights reserved. |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
9 */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
10 |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
11 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
12 /* groupby object ***********************************************************/ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
13 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
14 typedef struct { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
15 PyObject_HEAD |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
16 PyObject *it; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
17 PyObject *keyfunc; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
18 PyObject *tgtkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
19 PyObject *currkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
20 PyObject *currvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
21 } groupbyobject; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
22 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
23 static PyTypeObject groupby_type; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
24 static PyObject *_grouper_create(groupbyobject *, PyObject *); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
25 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
26 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
27 groupby_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
28 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
29 static char *kwargs[] = {"iterable", "key", NULL}; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
30 groupbyobject *gbo; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
31 PyObject *it, *keyfunc = Py_None; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
32 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
33 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:groupby", kwargs, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
34 &it, &keyfunc)) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
35 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
36 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
37 gbo = (groupbyobject *)type->tp_alloc(type, 0); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
38 if (gbo == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
39 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
40 gbo->tgtkey = NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
41 gbo->currkey = NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
42 gbo->currvalue = NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
43 gbo->keyfunc = keyfunc; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
44 Py_INCREF(keyfunc); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
45 gbo->it = PyObject_GetIter(it); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
46 if (gbo->it == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
47 Py_DECREF(gbo); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
48 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
49 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
50 return (PyObject *)gbo; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
51 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
52 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
53 static void |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
54 groupby_dealloc(groupbyobject *gbo) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
55 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
56 PyObject_GC_UnTrack(gbo); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
57 Py_XDECREF(gbo->it); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
58 Py_XDECREF(gbo->keyfunc); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
59 Py_XDECREF(gbo->tgtkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
60 Py_XDECREF(gbo->currkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
61 Py_XDECREF(gbo->currvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
62 gbo->ob_type->tp_free(gbo); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
63 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
64 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
65 static int |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
66 groupby_traverse(groupbyobject *gbo, visitproc visit, void *arg) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
67 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
68 Py_VISIT(gbo->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
69 Py_VISIT(gbo->keyfunc); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
70 Py_VISIT(gbo->tgtkey); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
71 Py_VISIT(gbo->currkey); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
72 Py_VISIT(gbo->currvalue); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
73 return 0; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
74 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
75 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
76 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
77 groupby_next(groupbyobject *gbo) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
78 { |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
79 PyObject *newvalue, *newkey, *r, *grouper, *tmp; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
80 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
81 /* skip to next iteration group */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
82 for (;;) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
83 if (gbo->currkey == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
84 /* pass */; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
85 else if (gbo->tgtkey == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
86 break; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
87 else { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
88 int rcmp; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
89 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
90 rcmp = PyObject_RichCompareBool(gbo->tgtkey, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
91 gbo->currkey, Py_EQ); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
92 if (rcmp == -1) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
93 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
94 else if (rcmp == 0) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
95 break; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
96 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
97 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
98 newvalue = PyIter_Next(gbo->it); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
99 if (newvalue == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
100 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
101 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
102 if (gbo->keyfunc == Py_None) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
103 newkey = newvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
104 Py_INCREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
105 } else { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
106 newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
107 newvalue, NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
108 if (newkey == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
109 Py_DECREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
110 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
111 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
112 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
113 |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
114 tmp = gbo->currkey; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
115 gbo->currkey = newkey; |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
116 Py_XDECREF(tmp); |
|
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
117 |
|
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
118 tmp = gbo->currvalue; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
119 gbo->currvalue = newvalue; |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
120 Py_XDECREF(tmp); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
121 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
122 |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
123 Py_INCREF(gbo->currkey); |
|
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
124 tmp = gbo->tgtkey; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
125 gbo->tgtkey = gbo->currkey; |
|
33616
31b08670ebdd
* Increase test coverage.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
126 Py_XDECREF(tmp); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
127 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
128 grouper = _grouper_create(gbo, gbo->tgtkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
129 if (grouper == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
130 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
131 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
132 r = PyTuple_Pack(2, gbo->currkey, grouper); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
133 Py_DECREF(grouper); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
134 return r; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
135 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
136 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
137 PyDoc_STRVAR(groupby_doc, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
138 "groupby(iterable[, keyfunc]) -> create an iterator which returns\n\ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
139 (key, sub-iterator) grouped by each value of key(value).\n"); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
140 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
141 static PyTypeObject groupby_type = { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
142 PyObject_HEAD_INIT(NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
143 0, /* ob_size */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
144 "itertools.groupby", /* tp_name */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
145 sizeof(groupbyobject), /* tp_basicsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
146 0, /* tp_itemsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
147 /* methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
148 (destructor)groupby_dealloc, /* tp_dealloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
149 0, /* tp_print */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
150 0, /* tp_getattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
151 0, /* tp_setattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
152 0, /* tp_compare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
153 0, /* tp_repr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
154 0, /* tp_as_number */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
155 0, /* tp_as_sequence */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
156 0, /* tp_as_mapping */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
157 0, /* tp_hash */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
158 0, /* tp_call */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
159 0, /* tp_str */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
160 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
161 0, /* tp_setattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
162 0, /* tp_as_buffer */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
163 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
164 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
165 groupby_doc, /* tp_doc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
166 (traverseproc)groupby_traverse, /* tp_traverse */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
167 0, /* tp_clear */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
168 0, /* tp_richcompare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
169 0, /* tp_weaklistoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
170 PyObject_SelfIter, /* tp_iter */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
171 (iternextfunc)groupby_next, /* tp_iternext */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
172 0, /* tp_methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
173 0, /* tp_members */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
174 0, /* tp_getset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
175 0, /* tp_base */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
176 0, /* tp_dict */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
177 0, /* tp_descr_get */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
178 0, /* tp_descr_set */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
179 0, /* tp_dictoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
180 0, /* tp_init */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
181 0, /* tp_alloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
182 groupby_new, /* tp_new */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
183 PyObject_GC_Del, /* tp_free */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
184 }; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
185 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
186 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
187 /* _grouper object (internal) ************************************************/ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
188 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
189 typedef struct { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
190 PyObject_HEAD |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
191 PyObject *parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
192 PyObject *tgtkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
193 } _grouperobject; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
194 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
195 static PyTypeObject _grouper_type; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
196 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
197 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
198 _grouper_create(groupbyobject *parent, PyObject *tgtkey) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
199 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
200 _grouperobject *igo; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
201 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
202 igo = PyObject_New(_grouperobject, &_grouper_type); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
203 if (igo == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
204 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
205 igo->parent = (PyObject *)parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
206 Py_INCREF(parent); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
207 igo->tgtkey = tgtkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
208 Py_INCREF(tgtkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
209 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
210 return (PyObject *)igo; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
211 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
212 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
213 static void |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
214 _grouper_dealloc(_grouperobject *igo) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
215 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
216 Py_DECREF(igo->parent); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
217 Py_DECREF(igo->tgtkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
218 PyObject_Del(igo); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
219 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
220 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
221 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
222 _grouper_next(_grouperobject *igo) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
223 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
224 groupbyobject *gbo = (groupbyobject *)igo->parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
225 PyObject *newvalue, *newkey, *r; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
226 int rcmp; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
227 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
228 if (gbo->currvalue == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
229 newvalue = PyIter_Next(gbo->it); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
230 if (newvalue == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
231 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
232 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
233 if (gbo->keyfunc == Py_None) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
234 newkey = newvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
235 Py_INCREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
236 } else { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
237 newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
238 newvalue, NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
239 if (newkey == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
240 Py_DECREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
241 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
242 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
243 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
244 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
245 assert(gbo->currkey == NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
246 gbo->currkey = newkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
247 gbo->currvalue = newvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
248 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
249 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
250 assert(gbo->currkey != NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
251 rcmp = PyObject_RichCompareBool(igo->tgtkey, gbo->currkey, Py_EQ); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
252 if (rcmp <= 0) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
253 /* got any error or current group is end */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
254 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
255 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
256 r = gbo->currvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
257 gbo->currvalue = NULL; |
|
33386
c2c49ee727d0
SF patch #1020188: Use Py_CLEAR where necessary to avoid crashes
Raymond Hettinger <python@rcn.com>
parents:
32682
diff
changeset
|
258 Py_CLEAR(gbo->currkey); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
259 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
260 return r; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
261 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
262 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
263 static PyTypeObject _grouper_type = { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
264 PyObject_HEAD_INIT(NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
265 0, /* ob_size */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
266 "itertools._grouper", /* tp_name */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
267 sizeof(_grouperobject), /* tp_basicsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
268 0, /* tp_itemsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
269 /* methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
270 (destructor)_grouper_dealloc, /* tp_dealloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
271 0, /* tp_print */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
272 0, /* tp_getattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
273 0, /* tp_setattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
274 0, /* tp_compare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
275 0, /* tp_repr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
276 0, /* tp_as_number */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
277 0, /* tp_as_sequence */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
278 0, /* tp_as_mapping */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
279 0, /* tp_hash */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
280 0, /* tp_call */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
281 0, /* tp_str */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
282 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
283 0, /* tp_setattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
284 0, /* tp_as_buffer */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
285 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
286 0, /* tp_doc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
287 0, /* tp_traverse */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
288 0, /* tp_clear */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
289 0, /* tp_richcompare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
290 0, /* tp_weaklistoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
291 PyObject_SelfIter, /* tp_iter */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
292 (iternextfunc)_grouper_next, /* tp_iternext */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
293 0, /* tp_methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
294 0, /* tp_members */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
295 0, /* tp_getset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
296 0, /* tp_base */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
297 0, /* tp_dict */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
298 0, /* tp_descr_get */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
299 0, /* tp_descr_set */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
300 0, /* tp_dictoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
301 0, /* tp_init */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
302 0, /* tp_alloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
303 0, /* tp_new */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
304 PyObject_Del, /* tp_free */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
305 }; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
306 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
307 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
308 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
309 /* tee object and with supporting function and objects ***************/ |
| 30764 | 310 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
311 /* The teedataobject pre-allocates space for LINKCELLS number of objects. |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
312 To help the object fit neatly inside cache lines (space for 16 to 32 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
313 pointers), the value should be a multiple of 16 minus space for |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
314 the other structure members including PyHEAD overhead. The larger the |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
315 value, the less memory overhead per object and the less time spent |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
316 allocating/deallocating new links. The smaller the number, the less |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
317 wasted space and the more rapid freeing of older data. |
| 30764 | 318 */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
319 #define LINKCELLS 57 |
| 30764 | 320 |
| 321 typedef struct { | |
| 322 PyObject_HEAD | |
| 323 PyObject *it; | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
324 int numread; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
325 PyObject *nextlink; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
326 PyObject *(values[LINKCELLS]); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
327 } teedataobject; |
| 30764 | 328 |
| 329 typedef struct { | |
| 330 PyObject_HEAD | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
331 teedataobject *dataobj; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
332 int index; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
333 PyObject *weakreflist; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
334 } teeobject; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
335 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
336 static PyTypeObject teedataobject_type; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
337 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
338 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
339 teedataobject_new(PyObject *it) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
340 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
341 teedataobject *tdo; |
| 30764 | 342 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
343 tdo = PyObject_New(teedataobject, &teedataobject_type); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
344 if (tdo == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
345 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
346 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
347 tdo->numread = 0; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
348 tdo->nextlink = NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
349 Py_INCREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
350 tdo->it = it; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
351 return (PyObject *)tdo; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
352 } |
| 30764 | 353 |
| 354 static PyObject * | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
355 teedataobject_jumplink(teedataobject *tdo) |
| 30764 | 356 { |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
357 if (tdo->nextlink == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
358 tdo->nextlink = teedataobject_new(tdo->it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
359 Py_INCREF(tdo->nextlink); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
360 return tdo->nextlink; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
361 } |
| 30764 | 362 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
363 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
364 teedataobject_getitem(teedataobject *tdo, int i) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
365 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
366 PyObject *value; |
| 30764 | 367 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
368 assert(i < LINKCELLS); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
369 if (i < tdo->numread) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
370 value = tdo->values[i]; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
371 else { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
372 /* this is the lead iterator, so fetch more data */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
373 assert(i == tdo->numread); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
374 value = PyIter_Next(tdo->it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
375 if (value == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
376 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
377 tdo->numread++; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
378 tdo->values[i] = value; |
| 30764 | 379 } |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
380 Py_INCREF(value); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
381 return value; |
| 30764 | 382 } |
| 383 | |
| 384 static void | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
385 teedataobject_dealloc(teedataobject *tdo) |
| 30764 | 386 { |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
387 int i; |
|
30773
95fd55545cac
Improvements to coding for itertools.tee():
Raymond Hettinger <python@rcn.com>
parents:
30764
diff
changeset
|
388 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
389 for (i=0 ; i<tdo->numread ; i++) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
390 Py_DECREF(tdo->values[i]); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
391 Py_XDECREF(tdo->it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
392 Py_XDECREF(tdo->nextlink); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
393 PyObject_Del(tdo); |
| 30764 | 394 } |
| 395 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
396 PyDoc_STRVAR(teedataobject_doc, "Data container common to multiple tee objects."); |
| 30764 | 397 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
398 static PyTypeObject teedataobject_type = { |
|
31508
71864820402d
need to initialize ob_type slot at run-time, at least on cygwin
Skip Montanaro <skip@pobox.com>
parents:
31501
diff
changeset
|
399 PyObject_HEAD_INIT(0) /* Must fill in type value later */ |
| 30764 | 400 0, /* ob_size */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
401 "itertools.tee_dataobject", /* tp_name */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
402 sizeof(teedataobject), /* tp_basicsize */ |
| 30764 | 403 0, /* tp_itemsize */ |
| 404 /* methods */ | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
405 (destructor)teedataobject_dealloc, /* tp_dealloc */ |
| 30764 | 406 0, /* tp_print */ |
| 407 0, /* tp_getattr */ | |
| 408 0, /* tp_setattr */ | |
| 409 0, /* tp_compare */ | |
| 410 0, /* tp_repr */ | |
| 411 0, /* tp_as_number */ | |
| 412 0, /* tp_as_sequence */ | |
| 413 0, /* tp_as_mapping */ | |
| 414 0, /* tp_hash */ | |
| 415 0, /* tp_call */ | |
| 416 0, /* tp_str */ | |
| 417 PyObject_GenericGetAttr, /* tp_getattro */ | |
| 418 0, /* tp_setattro */ | |
| 419 0, /* tp_as_buffer */ | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
420 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
421 teedataobject_doc, /* tp_doc */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
422 0, /* tp_traverse */ |
| 30764 | 423 }; |
| 424 | |
| 425 | |
| 426 static PyTypeObject tee_type; | |
| 427 | |
| 428 static PyObject * | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
429 tee_next(teeobject *to) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
430 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
431 PyObject *value, *link; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
432 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
433 if (to->index >= LINKCELLS) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
434 link = teedataobject_jumplink(to->dataobj); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
435 Py_XDECREF(to->dataobj); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
436 to->dataobj = (teedataobject *)link; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
437 to->index = 0; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
438 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
439 value = teedataobject_getitem(to->dataobj, to->index); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
440 if (value == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
441 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
442 to->index++; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
443 return value; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
444 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
445 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
446 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
447 tee_copy(teeobject *to) |
| 30764 | 448 { |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
449 teeobject *newto; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
450 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
451 newto = PyObject_New(teeobject, &tee_type); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
452 if (newto == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
453 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
454 Py_INCREF(to->dataobj); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
455 newto->dataobj = to->dataobj; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
456 newto->index = to->index; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
457 newto->weakreflist = NULL; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
458 return (PyObject *)newto; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
459 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
460 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
461 PyDoc_STRVAR(teecopy_doc, "Returns an independent iterator."); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
462 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
463 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
464 tee_fromiterable(PyObject *iterable) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
465 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
466 teeobject *to; |
| 30764 | 467 PyObject *it = NULL; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
468 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
469 it = PyObject_GetIter(iterable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
470 if (it == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
471 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
472 if (PyObject_TypeCheck(it, &tee_type)) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
473 to = (teeobject *)tee_copy((teeobject *)it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
474 goto done; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
475 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
476 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
477 to = PyObject_New(teeobject, &tee_type); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
478 if (to == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
479 goto done; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
480 to->dataobj = (teedataobject *)teedataobject_new(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
481 to->index = 0; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
482 to->weakreflist = NULL; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
483 done: |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
484 Py_XDECREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
485 return (PyObject *)to; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
486 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
487 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
488 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
489 tee_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
490 { |
| 30764 | 491 PyObject *iterable; |
| 492 | |
| 493 if (!PyArg_UnpackTuple(args, "tee", 1, 1, &iterable)) | |
| 494 return NULL; | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
495 return tee_fromiterable(iterable); |
| 30764 | 496 } |
| 497 | |
| 498 static void | |
| 499 tee_dealloc(teeobject *to) | |
| 500 { | |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
501 if (to->weakreflist != NULL) |
|
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
502 PyObject_ClearWeakRefs((PyObject *) to); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
503 Py_XDECREF(to->dataobj); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
504 PyObject_Del(to); |
| 30764 | 505 } |
| 506 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
507 PyDoc_STRVAR(teeobject_doc, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
508 "Iterator wrapped to make it copyable"); |
| 30764 | 509 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
510 static PyMethodDef tee_methods[] = { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
511 {"__copy__", (PyCFunction)tee_copy, METH_NOARGS, teecopy_doc}, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
512 {NULL, NULL} /* sentinel */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
513 }; |
| 30764 | 514 |
| 515 static PyTypeObject tee_type = { | |
| 516 PyObject_HEAD_INIT(NULL) | |
| 517 0, /* ob_size */ | |
| 518 "itertools.tee", /* tp_name */ | |
| 519 sizeof(teeobject), /* tp_basicsize */ | |
| 520 0, /* tp_itemsize */ | |
| 521 /* methods */ | |
| 522 (destructor)tee_dealloc, /* tp_dealloc */ | |
| 523 0, /* tp_print */ | |
| 524 0, /* tp_getattr */ | |
| 525 0, /* tp_setattr */ | |
| 526 0, /* tp_compare */ | |
| 527 0, /* tp_repr */ | |
| 528 0, /* tp_as_number */ | |
| 529 0, /* tp_as_sequence */ | |
| 530 0, /* tp_as_mapping */ | |
| 531 0, /* tp_hash */ | |
| 532 0, /* tp_call */ | |
| 533 0, /* tp_str */ | |
|
30786
225d848a5f96
Minor improvements to itertools.tee():
Raymond Hettinger <python@rcn.com>
parents:
30773
diff
changeset
|
534 0, /* tp_getattro */ |
| 30764 | 535 0, /* tp_setattro */ |
| 536 0, /* tp_as_buffer */ | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
537 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
538 teeobject_doc, /* tp_doc */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
539 0, /* tp_traverse */ |
| 30764 | 540 0, /* tp_clear */ |
| 541 0, /* tp_richcompare */ | |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
542 offsetof(teeobject, weakreflist), /* tp_weaklistoffset */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
543 PyObject_SelfIter, /* tp_iter */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
544 (iternextfunc)tee_next, /* tp_iternext */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
545 tee_methods, /* tp_methods */ |
| 30764 | 546 0, /* tp_members */ |
| 547 0, /* tp_getset */ | |
| 548 0, /* tp_base */ | |
| 549 0, /* tp_dict */ | |
| 550 0, /* tp_descr_get */ | |
| 551 0, /* tp_descr_set */ | |
| 552 0, /* tp_dictoffset */ | |
| 553 0, /* tp_init */ | |
| 554 0, /* tp_alloc */ | |
| 555 tee_new, /* tp_new */ | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
556 PyObject_Del, /* tp_free */ |
| 30764 | 557 }; |
| 558 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
559 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
560 tee(PyObject *self, PyObject *args) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
561 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
562 int i, n=2; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
563 PyObject *it, *iterable, *copyable, *result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
564 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
565 if (!PyArg_ParseTuple(args, "O|i", &iterable, &n)) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
566 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
567 result = PyTuple_New(n); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
568 if (result == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
569 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
570 if (n == 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
571 return result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
572 it = PyObject_GetIter(iterable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
573 if (it == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
574 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
575 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
576 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
577 if (!PyObject_HasAttrString(it, "__copy__")) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
578 copyable = tee_fromiterable(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
579 Py_DECREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
580 if (copyable == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
581 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
582 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
583 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
584 } else |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
585 copyable = it; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
586 PyTuple_SET_ITEM(result, 0, copyable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
587 for (i=1 ; i<n ; i++) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
588 copyable = PyObject_CallMethod(copyable, "__copy__", NULL); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
589 if (copyable == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
590 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
591 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
592 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
593 PyTuple_SET_ITEM(result, i, copyable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
594 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
595 return result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
596 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
597 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
598 PyDoc_STRVAR(tee_doc, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
599 "tee(iterable, n=2) --> tuple of n independent iterators."); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
600 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
601 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
602 /* cycle object **********************************************************/ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
603 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
604 typedef struct { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
605 PyObject_HEAD |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
606 PyObject *it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
607 PyObject *saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
608 int firstpass; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
609 } cycleobject; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
610 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
611 static PyTypeObject cycle_type; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
612 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
613 static PyObject * |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
614 cycle_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
615 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
616 PyObject *it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
617 PyObject *iterable; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
618 PyObject *saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
619 cycleobject *lz; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
620 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
621 if (!PyArg_UnpackTuple(args, "cycle", 1, 1, &iterable)) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
622 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
623 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
624 /* Get iterator. */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
625 it = PyObject_GetIter(iterable); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
626 if (it == NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
627 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
628 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
629 saved = PyList_New(0); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
630 if (saved == NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
631 Py_DECREF(it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
632 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
633 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
634 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
635 /* create cycleobject structure */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
636 lz = (cycleobject *)type->tp_alloc(type, 0); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
637 if (lz == NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
638 Py_DECREF(it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
639 Py_DECREF(saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
640 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
641 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
642 lz->it = it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
643 lz->saved = saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
644 lz->firstpass = 0; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
645 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
646 return (PyObject *)lz; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
647 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
648 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
649 static void |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
650 cycle_dealloc(cycleobject *lz) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
651 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
652 PyObject_GC_UnTrack(lz); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
653 Py_XDECREF(lz->saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
654 Py_XDECREF(lz->it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
655 lz->ob_type->tp_free(lz); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
656 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
657 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
658 static int |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
659 cycle_traverse(cycleobject *lz, visitproc visit, void *arg) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
660 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
661 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
662 Py_VISIT(lz->saved); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
663 return 0; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
664 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
665 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
666 static PyObject * |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
667 cycle_next(cycleobject *lz) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
668 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
669 PyObject *item; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
670 PyObject *it; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
671 PyObject *tmp; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
672 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
673 while (1) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
674 item = PyIter_Next(lz->it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
675 if (item != NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
676 if (!lz->firstpass) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
677 PyList_Append(lz->saved, item); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
678 return item; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
679 } |
|
32010
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
680 if (PyErr_Occurred()) { |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
681 if (PyErr_ExceptionMatches(PyExc_StopIteration)) |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
682 PyErr_Clear(); |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
683 else |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
684 return NULL; |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
685 } |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
686 if (PyList_Size(lz->saved) == 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
687 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
688 it = PyObject_GetIter(lz->saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
689 if (it == NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
690 return NULL; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
691 tmp = lz->it; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
692 lz->it = it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
693 lz->firstpass = 1; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
694 Py_DECREF(tmp); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
695 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
696 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
697 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
698 PyDoc_STRVAR(cycle_doc, |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
699 "cycle(iterable) --> cycle object\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
700 \n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
701 Return elements from the iterable until it is exhausted.\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
702 Then repeat the sequence indefinitely."); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
703 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
704 static PyTypeObject cycle_type = { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
705 PyObject_HEAD_INIT(NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
706 0, /* ob_size */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
707 "itertools.cycle", /* tp_name */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
708 sizeof(cycleobject), /* tp_basicsize */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
709 0, /* tp_itemsize */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
710 /* methods */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
711 (destructor)cycle_dealloc, /* tp_dealloc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
712 0, /* tp_print */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
713 0, /* tp_getattr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
714 0, /* tp_setattr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
715 0, /* tp_compare */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
716 0, /* tp_repr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
717 0, /* tp_as_number */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
718 0, /* tp_as_sequence */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
719 0, /* tp_as_mapping */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
720 0, /* tp_hash */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
721 0, /* tp_call */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
722 0, /* tp_str */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
723 PyObject_GenericGetAttr, /* tp_getattro */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
724 0, /* tp_setattro */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
725 0, /* tp_as_buffer */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
726 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
727 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
728 cycle_doc, /* tp_doc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
729 (traverseproc)cycle_traverse, /* tp_traverse */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
730 0, /* tp_clear */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
731 0, /* tp_richcompare */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
732 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
733 PyObject_SelfIter, /* tp_iter */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
734 (iternextfunc)cycle_next, /* tp_iternext */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
735 0, /* tp_methods */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
736 0, /* tp_members */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
737 0, /* tp_getset */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
738 0, /* tp_base */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
739 0, /* tp_dict */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
740 0, /* tp_descr_get */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
741 0, /* tp_descr_set */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
742 0, /* tp_dictoffset */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
743 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
744 0, /* tp_alloc */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
745 cycle_new, /* tp_new */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
746 PyObject_GC_Del, /* tp_free */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
747 }; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
748 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
749 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
750 /* dropwhile object **********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
751 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
752 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
753 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
754 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
755 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
756 long start; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
757 } dropwhileobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
758 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
759 static PyTypeObject dropwhile_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
760 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
761 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
762 dropwhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
763 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
764 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
765 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
766 dropwhileobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
767 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
768 if (!PyArg_UnpackTuple(args, "dropwhile", 2, 2, &func, &seq)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
769 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
770 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
771 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
772 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
773 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
774 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
775 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
776 /* create dropwhileobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
777 lz = (dropwhileobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
778 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
779 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
780 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
781 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
782 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
783 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
784 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
785 lz->start = 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
786 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
787 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
788 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
789 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
790 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
791 dropwhile_dealloc(dropwhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
792 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
793 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
794 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
795 Py_XDECREF(lz->it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
796 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
797 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
798 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
799 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
800 dropwhile_traverse(dropwhileobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
801 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
802 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
803 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
804 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
805 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
806 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
807 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
808 dropwhile_next(dropwhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
809 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
810 PyObject *item, *good; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
811 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
812 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
813 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
814 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
815 assert(PyIter_Check(it)); |
|
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
816 iternext = *it->ob_type->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
817 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
818 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
819 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
820 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
821 if (lz->start == 1) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
822 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
823 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
824 good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
825 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
826 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
827 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
828 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
829 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
830 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
831 if (!ok) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
832 lz->start = 1; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
833 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
834 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
835 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
836 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
837 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
838 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
839 PyDoc_STRVAR(dropwhile_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
840 "dropwhile(predicate, iterable) --> dropwhile object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
841 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
842 Drop items from the iterable while predicate(item) is true.\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
843 Afterwards, return every element until the iterable is exhausted."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
844 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
845 static PyTypeObject dropwhile_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
846 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
847 0, /* ob_size */ |
| 27769 | 848 "itertools.dropwhile", /* tp_name */ |
| 849 sizeof(dropwhileobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
850 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
851 /* methods */ |
| 27769 | 852 (destructor)dropwhile_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
853 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
854 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
855 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
856 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
857 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
858 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
859 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
860 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
861 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
862 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
863 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
864 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
865 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
866 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
867 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
868 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 869 dropwhile_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
870 (traverseproc)dropwhile_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
871 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
872 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
873 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
874 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 875 (iternextfunc)dropwhile_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
876 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
877 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
878 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
879 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
880 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
881 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
882 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
883 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
884 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
885 0, /* tp_alloc */ |
| 27769 | 886 dropwhile_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
887 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
888 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
889 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
890 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
891 /* takewhile object **********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
892 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
893 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
894 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
895 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
896 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
897 long stop; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
898 } takewhileobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
899 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
900 static PyTypeObject takewhile_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
901 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
902 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
903 takewhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
904 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
905 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
906 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
907 takewhileobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
908 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
909 if (!PyArg_UnpackTuple(args, "takewhile", 2, 2, &func, &seq)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
910 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
911 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
912 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
913 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
914 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
915 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
916 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
917 /* create takewhileobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
918 lz = (takewhileobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
919 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
920 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
921 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
922 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
923 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
924 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
925 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
926 lz->stop = 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
927 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
928 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
929 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
930 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
931 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
932 takewhile_dealloc(takewhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
933 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
934 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
935 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
936 Py_XDECREF(lz->it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
937 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
938 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
939 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
940 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
941 takewhile_traverse(takewhileobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
942 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
943 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
944 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
945 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
946 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
947 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
948 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
949 takewhile_next(takewhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
950 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
951 PyObject *item, *good; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
952 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
953 long ok; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
954 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
955 if (lz->stop == 1) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
956 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
957 |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
958 assert(PyIter_Check(it)); |
|
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
959 item = (*it->ob_type->tp_iternext)(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
960 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
961 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
962 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
963 good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
964 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
965 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
966 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
967 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
968 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
969 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
970 if (ok) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
971 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
972 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
973 lz->stop = 1; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
974 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
975 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
976 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
977 PyDoc_STRVAR(takewhile_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
978 "takewhile(predicate, iterable) --> takewhile object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
979 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
980 Return successive entries from an iterable as long as the \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
981 predicate evaluates to true for each entry."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
982 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
983 static PyTypeObject takewhile_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
984 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
985 0, /* ob_size */ |
| 27769 | 986 "itertools.takewhile", /* tp_name */ |
| 987 sizeof(takewhileobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
988 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
989 /* methods */ |
| 27769 | 990 (destructor)takewhile_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
991 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
992 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
993 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
994 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
995 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
996 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
997 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
998 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
999 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1000 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1001 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1002 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1003 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1004 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1005 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1006 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1007 takewhile_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1008 (traverseproc)takewhile_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1009 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1010 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1011 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1012 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1013 (iternextfunc)takewhile_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1014 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1015 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1016 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1017 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1018 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1019 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1020 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1021 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1022 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1023 0, /* tp_alloc */ |
| 27769 | 1024 takewhile_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1025 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1026 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1027 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1028 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1029 /* islice object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1030 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1031 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1032 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1033 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1034 long next; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1035 long stop; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1036 long step; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1037 long cnt; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1038 } isliceobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1039 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1040 static PyTypeObject islice_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1041 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1042 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1043 islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1044 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1045 PyObject *seq; |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1046 long start=0, stop=-1, step=1; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1047 PyObject *it, *a1=NULL, *a2=NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1048 int numargs; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1049 isliceobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1050 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1051 numargs = PyTuple_Size(args); |
|
28930
18082b2d2ebd
The previous made the stop argument optional.
Raymond Hettinger <python@rcn.com>
parents:
28929
diff
changeset
|
1052 if (!PyArg_ParseTuple(args, "OO|Ol:islice", &seq, &a1, &a2, &step)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1053 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1054 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1055 if (numargs == 2) { |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1056 if (a1 != Py_None) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1057 stop = PyInt_AsLong(a1); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1058 if (stop == -1) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1059 if (PyErr_Occurred()) |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1060 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1061 PyErr_SetString(PyExc_ValueError, |
|
30800
af443d820a50
Fix nits in error messages.
Raymond Hettinger <python@rcn.com>
parents:
30786
diff
changeset
|
1062 "Stop argument must be a non-negative integer or None."); |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1063 return NULL; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1064 } |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1065 } |
|
28930
18082b2d2ebd
The previous made the stop argument optional.
Raymond Hettinger <python@rcn.com>
parents:
28929
diff
changeset
|
1066 } else { |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1067 start = PyInt_AsLong(a1); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1068 if (start == -1 && PyErr_Occurred()) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1069 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1070 PyErr_SetString(PyExc_ValueError, |
|
30800
af443d820a50
Fix nits in error messages.
Raymond Hettinger <python@rcn.com>
parents:
30786
diff
changeset
|
1071 "Start argument must be a non-negative integer."); |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1072 return NULL; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1073 } |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1074 if (a2 != Py_None) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1075 stop = PyInt_AsLong(a2); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1076 if (stop == -1) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1077 if (PyErr_Occurred()) |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1078 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1079 PyErr_SetString(PyExc_ValueError, |
|
30800
af443d820a50
Fix nits in error messages.
Raymond Hettinger <python@rcn.com>
parents:
30786
diff
changeset
|
1080 "Stop argument must be a non-negative integer or None."); |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1081 return NULL; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1082 } |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1083 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1084 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1085 |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1086 if (start<0 || stop<-1) { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1087 PyErr_SetString(PyExc_ValueError, |
|
30800
af443d820a50
Fix nits in error messages.
Raymond Hettinger <python@rcn.com>
parents:
30786
diff
changeset
|
1088 "Indices for islice() must be non-negative integers."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1089 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1090 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1091 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1092 if (step<1) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1093 PyErr_SetString(PyExc_ValueError, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1094 "Step must be one or larger for islice()."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1095 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1096 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1097 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1098 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1099 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1100 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1101 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1102 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1103 /* create isliceobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1104 lz = (isliceobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1105 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1106 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1107 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1108 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1109 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1110 lz->next = start; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1111 lz->stop = stop; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1112 lz->step = step; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1113 lz->cnt = 0L; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1114 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1115 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1116 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1117 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1118 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1119 islice_dealloc(isliceobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1120 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1121 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1122 Py_XDECREF(lz->it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1123 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1124 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1125 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1126 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1127 islice_traverse(isliceobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1128 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1129 Py_VISIT(lz->it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1130 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1131 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1132 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1133 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1134 islice_next(isliceobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1135 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1136 PyObject *item; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1137 PyObject *it = lz->it; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1138 long oldnext; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1139 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1140 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1141 assert(PyIter_Check(it)); |
|
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1142 iternext = *it->ob_type->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1143 while (lz->cnt < lz->next) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1144 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1145 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1146 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1147 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1148 lz->cnt++; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1149 } |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1150 if (lz->stop != -1 && lz->cnt >= lz->stop) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1151 return NULL; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1152 assert(PyIter_Check(it)); |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1153 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1154 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1155 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1156 lz->cnt++; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1157 oldnext = lz->next; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1158 lz->next += lz->step; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1159 if (lz->next < oldnext) /* Check for overflow */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1160 lz->next = lz->stop; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1161 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1162 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1163 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1164 PyDoc_STRVAR(islice_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1165 "islice(iterable, [start,] stop [, step]) --> islice object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1166 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1167 Return an iterator whose next() method returns selected values from an\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1168 iterable. If start is specified, will skip all preceding elements;\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1169 otherwise, start defaults to zero. Step defaults to one. If\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1170 specified as another value, step determines how many values are \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1171 skipped between successive calls. Works like a slice() on a list\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1172 but returns an iterator."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1173 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1174 static PyTypeObject islice_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1175 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1176 0, /* ob_size */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1177 "itertools.islice", /* tp_name */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1178 sizeof(isliceobject), /* tp_basicsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1179 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1180 /* methods */ |
| 27769 | 1181 (destructor)islice_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1182 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1183 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1184 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1185 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1186 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1187 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1188 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1189 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1190 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1191 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1192 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1193 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1194 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1195 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1196 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1197 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1198 islice_doc, /* tp_doc */ |
| 1199 (traverseproc)islice_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1200 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1201 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1202 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1203 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1204 (iternextfunc)islice_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1205 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1206 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1207 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1208 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1209 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1210 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1211 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1212 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1213 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1214 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1215 islice_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1216 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1217 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1218 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1219 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1220 /* starmap object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1221 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1222 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1223 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1224 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1225 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1226 } starmapobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1227 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1228 static PyTypeObject starmap_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1229 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1230 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1231 starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1232 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1233 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1234 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1235 starmapobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1236 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1237 if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1238 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1239 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1240 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1241 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1242 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1243 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1244 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1245 /* create starmapobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1246 lz = (starmapobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1247 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1248 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1249 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1250 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1251 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1252 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1253 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1254 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1255 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1256 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1257 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1258 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1259 starmap_dealloc(starmapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1260 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1261 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1262 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1263 Py_XDECREF(lz->it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1264 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1265 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1266 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1267 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1268 starmap_traverse(starmapobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1269 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1270 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1271 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1272 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1273 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1274 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1275 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1276 starmap_next(starmapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1277 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1278 PyObject *args; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1279 PyObject *result; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1280 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1281 |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1282 assert(PyIter_Check(it)); |
|
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1283 args = (*it->ob_type->tp_iternext)(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1284 if (args == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1285 return NULL; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1286 if (!PyTuple_CheckExact(args)) { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1287 Py_DECREF(args); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1288 PyErr_SetString(PyExc_TypeError, |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1289 "iterator must return a tuple"); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1290 return NULL; |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1291 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1292 result = PyObject_Call(lz->func, args, NULL); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1293 Py_DECREF(args); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1294 return result; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1295 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1296 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1297 PyDoc_STRVAR(starmap_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1298 "starmap(function, sequence) --> starmap object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1299 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1300 Return an iterator whose values are returned from the function evaluated\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1301 with a argument tuple taken from the given sequence."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1302 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1303 static PyTypeObject starmap_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1304 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1305 0, /* ob_size */ |
| 27769 | 1306 "itertools.starmap", /* tp_name */ |
| 1307 sizeof(starmapobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1308 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1309 /* methods */ |
| 27769 | 1310 (destructor)starmap_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1311 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1312 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1313 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1314 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1315 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1316 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1317 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1318 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1319 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1320 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1321 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1322 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1323 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1324 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1325 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1326 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1327 starmap_doc, /* tp_doc */ |
| 1328 (traverseproc)starmap_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1329 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1330 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1331 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1332 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1333 (iternextfunc)starmap_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1334 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1335 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1336 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1337 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1338 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1339 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1340 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1341 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1342 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1343 0, /* tp_alloc */ |
| 27769 | 1344 starmap_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1345 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1346 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1347 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1348 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1349 /* imap object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1350 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1351 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1352 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1353 PyObject *iters; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1354 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1355 } imapobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1356 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1357 static PyTypeObject imap_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1358 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1359 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1360 imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1361 { |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1362 PyObject *it, *iters, *func; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1363 imapobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1364 int numargs, i; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1365 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1366 numargs = PyTuple_Size(args); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1367 if (numargs < 2) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1368 PyErr_SetString(PyExc_TypeError, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1369 "imap() must have at least two arguments."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1370 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1371 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1372 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1373 iters = PyTuple_New(numargs-1); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1374 if (iters == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1375 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1376 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1377 for (i=1 ; i<numargs ; i++) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1378 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1379 it = PyObject_GetIter(PyTuple_GET_ITEM(args, i)); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1380 if (it == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1381 Py_DECREF(iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1382 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1383 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1384 PyTuple_SET_ITEM(iters, i-1, it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1385 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1386 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1387 /* create imapobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1388 lz = (imapobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1389 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1390 Py_DECREF(iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1391 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1392 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1393 lz->iters = iters; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1394 func = PyTuple_GET_ITEM(args, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1395 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1396 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1397 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1398 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1399 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1400 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1401 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1402 imap_dealloc(imapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1403 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1404 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1405 Py_XDECREF(lz->iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1406 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1407 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1408 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1409 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1410 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1411 imap_traverse(imapobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1412 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1413 Py_VISIT(lz->iters); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1414 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1415 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1416 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1417 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1418 /* |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1419 imap() is an iterator version of __builtins__.map() except that it does |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1420 not have the None fill-in feature. That was intentionally left out for |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1421 the following reasons: |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1422 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1423 1) Itertools are designed to be easily combined and chained together. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1424 Having all tools stop with the shortest input is a unifying principle |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1425 that makes it easier to combine finite iterators (supplying data) with |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1426 infinite iterators like count() and repeat() (for supplying sequential |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1427 or constant arguments to a function). |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1428 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1429 2) In typical use cases for combining itertools, having one finite data |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1430 supplier run out before another is likely to be an error condition which |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1431 should not pass silently by automatically supplying None. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1432 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1433 3) The use cases for automatic None fill-in are rare -- not many functions |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1434 do something useful when a parameter suddenly switches type and becomes |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1435 None. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1436 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1437 4) If a need does arise, it can be met by __builtins__.map() or by |
| 29535 | 1438 writing: chain(iterable, repeat(None)). |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1439 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1440 5) Similar toolsets in Haskell and SML do not have automatic None fill-in. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1441 */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1442 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1443 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1444 imap_next(imapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1445 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1446 PyObject *val; |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1447 PyObject *argtuple; |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1448 PyObject *result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1449 int numargs, i; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1450 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1451 numargs = PyTuple_Size(lz->iters); |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1452 argtuple = PyTuple_New(numargs); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1453 if (argtuple == NULL) |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1454 return NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1455 |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1456 for (i=0 ; i<numargs ; i++) { |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1457 val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i)); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1458 if (val == NULL) { |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1459 Py_DECREF(argtuple); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1460 return NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1461 } |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1462 PyTuple_SET_ITEM(argtuple, i, val); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1463 } |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1464 if (lz->func == Py_None) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1465 return argtuple; |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1466 result = PyObject_Call(lz->func, argtuple, NULL); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1467 Py_DECREF(argtuple); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1468 return result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1469 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1470 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1471 PyDoc_STRVAR(imap_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1472 "imap(func, *iterables) --> imap object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1473 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1474 Make an iterator that computes the function using arguments from\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1475 each of the iterables. Like map() except that it returns\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1476 an iterator instead of a list and that it stops when the shortest\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1477 iterable is exhausted instead of filling in None for shorter\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1478 iterables."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1479 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1480 static PyTypeObject imap_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1481 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1482 0, /* ob_size */ |
| 27769 | 1483 "itertools.imap", /* tp_name */ |
| 1484 sizeof(imapobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1485 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1486 /* methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1487 (destructor)imap_dealloc, /* tp_dealloc */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1488 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1489 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1490 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1491 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1492 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1493 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1494 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1495 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1496 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1497 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1498 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1499 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1500 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1501 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1502 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1503 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1504 imap_doc, /* tp_doc */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1505 (traverseproc)imap_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1506 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1507 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1508 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1509 PyObject_SelfIter, /* tp_iter */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1510 (iternextfunc)imap_next, /* tp_iternext */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1511 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1512 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1513 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1514 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1515 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1516 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1517 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1518 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1519 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1520 0, /* tp_alloc */ |
| 27769 | 1521 imap_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1522 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1523 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1524 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1525 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1526 /* chain object ************************************************************/ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1527 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1528 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1529 PyObject_HEAD |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1530 long tuplesize; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1531 long iternum; /* which iterator is active */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1532 PyObject *ittuple; /* tuple of iterators */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1533 } chainobject; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1534 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1535 static PyTypeObject chain_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1536 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1537 static PyObject * |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1538 chain_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1539 { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1540 chainobject *lz; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1541 int tuplesize = PySequence_Length(args); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1542 int i; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1543 PyObject *ittuple; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1544 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1545 /* obtain iterators */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1546 assert(PyTuple_Check(args)); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1547 ittuple = PyTuple_New(tuplesize); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1548 if(ittuple == NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1549 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1550 for (i=0; i < tuplesize; ++i) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1551 PyObject *item = PyTuple_GET_ITEM(args, i); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1552 PyObject *it = PyObject_GetIter(item); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1553 if (it == NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1554 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1555 PyErr_Format(PyExc_TypeError, |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1556 "chain argument #%d must support iteration", |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1557 i+1); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1558 Py_DECREF(ittuple); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1559 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1560 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1561 PyTuple_SET_ITEM(ittuple, i, it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1562 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1563 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1564 /* create chainobject structure */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1565 lz = (chainobject *)type->tp_alloc(type, 0); |
| 29522 | 1566 if (lz == NULL) { |
| 1567 Py_DECREF(ittuple); | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1568 return NULL; |
| 29522 | 1569 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1570 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1571 lz->ittuple = ittuple; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1572 lz->iternum = 0; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1573 lz->tuplesize = tuplesize; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1574 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1575 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1576 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1577 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1578 static void |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1579 chain_dealloc(chainobject *lz) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1580 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1581 PyObject_GC_UnTrack(lz); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1582 Py_XDECREF(lz->ittuple); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1583 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1584 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1585 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1586 static int |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1587 chain_traverse(chainobject *lz, visitproc visit, void *arg) |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1588 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1589 Py_VISIT(lz->ittuple); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1590 return 0; |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1591 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1592 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1593 static PyObject * |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1594 chain_next(chainobject *lz) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1595 { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1596 PyObject *it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1597 PyObject *item; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1598 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1599 while (lz->iternum < lz->tuplesize) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1600 it = PyTuple_GET_ITEM(lz->ittuple, lz->iternum); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1601 item = PyIter_Next(it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1602 if (item != NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1603 return item; |
|
32010
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1604 if (PyErr_Occurred()) { |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1605 if (PyErr_ExceptionMatches(PyExc_StopIteration)) |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1606 PyErr_Clear(); |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1607 else |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1608 return NULL; |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1609 } |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1610 lz->iternum++; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1611 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1612 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1613 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1614 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1615 PyDoc_STRVAR(chain_doc, |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1616 "chain(*iterables) --> chain object\n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1617 \n\ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1618 Return a chain object whose .next() method returns elements from the\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1619 first iterable until it is exhausted, then elements from the next\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1620 iterable, until all of the iterables are exhausted."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1621 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1622 static PyTypeObject chain_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1623 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1624 0, /* ob_size */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1625 "itertools.chain", /* tp_name */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1626 sizeof(chainobject), /* tp_basicsize */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1627 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1628 /* methods */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1629 (destructor)chain_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1630 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1631 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1632 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1633 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1634 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1635 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1636 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1637 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1638 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1639 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1640 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1641 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1642 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1643 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1644 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1645 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1646 chain_doc, /* tp_doc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1647 (traverseproc)chain_traverse, /* tp_traverse */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1648 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1649 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1650 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1651 PyObject_SelfIter, /* tp_iter */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1652 (iternextfunc)chain_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1653 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1654 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1655 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1656 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1657 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1658 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1659 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1660 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1661 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1662 0, /* tp_alloc */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1663 chain_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1664 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1665 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1666 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1667 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1668 /* ifilter object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1669 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1670 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1671 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1672 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1673 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1674 } ifilterobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1675 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1676 static PyTypeObject ifilter_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1677 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1678 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1679 ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1680 { |
| 27769 | 1681 PyObject *func, *seq; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1682 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1683 ifilterobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1684 |
| 27769 | 1685 if (!PyArg_UnpackTuple(args, "ifilter", 2, 2, &func, &seq)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1686 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1687 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1688 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1689 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1690 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1691 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1692 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1693 /* create ifilterobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1694 lz = (ifilterobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1695 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1696 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1697 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1698 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1699 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1700 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1701 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1702 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1703 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1704 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1705 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1706 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1707 ifilter_dealloc(ifilterobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1708 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1709 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1710 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1711 Py_XDECREF(lz->it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1712 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1713 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1714 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1715 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1716 ifilter_traverse(ifilterobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1717 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1718 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1719 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1720 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1721 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1722 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1723 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1724 ifilter_next(ifilterobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1725 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1726 PyObject *item; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1727 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1728 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1729 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1730 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1731 assert(PyIter_Check(it)); |
|
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1732 iternext = *it->ob_type->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1733 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1734 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1735 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1736 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1737 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1738 if (lz->func == Py_None) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1739 ok = PyObject_IsTrue(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1740 } else { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1741 PyObject *good; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1742 good = PyObject_CallFunctionObjArgs(lz->func, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1743 item, NULL); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1744 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1745 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1746 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1747 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1748 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1749 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1750 } |
| 27769 | 1751 if (ok) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1752 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1753 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1754 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1755 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1756 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1757 PyDoc_STRVAR(ifilter_doc, |
| 27769 | 1758 "ifilter(function or None, sequence) --> ifilter object\n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1759 \n\ |
| 27769 | 1760 Return those items of sequence for which function(item) is true.\n\ |
| 1761 If function is None, return the items that are true."); | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1762 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1763 static PyTypeObject ifilter_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1764 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1765 0, /* ob_size */ |
| 27769 | 1766 "itertools.ifilter", /* tp_name */ |
| 1767 sizeof(ifilterobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1768 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1769 /* methods */ |
| 27769 | 1770 (destructor)ifilter_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1771 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1772 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1773 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1774 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1775 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1776 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1777 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1778 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1779 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1780 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1781 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1782 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1783 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1784 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1785 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1786 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1787 ifilter_doc, /* tp_doc */ |
| 1788 (traverseproc)ifilter_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1789 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1790 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1791 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1792 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1793 (iternextfunc)ifilter_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1794 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1795 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1796 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1797 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1798 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1799 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1800 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1801 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1802 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1803 0, /* tp_alloc */ |
| 27769 | 1804 ifilter_new, /* tp_new */ |
| 1805 PyObject_GC_Del, /* tp_free */ | |
| 1806 }; | |
| 1807 | |
| 1808 | |
| 1809 /* ifilterfalse object ************************************************************/ | |
| 1810 | |
| 1811 typedef struct { | |
| 1812 PyObject_HEAD | |
| 1813 PyObject *func; | |
| 1814 PyObject *it; | |
| 1815 } ifilterfalseobject; | |
| 1816 | |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1817 static PyTypeObject ifilterfalse_type; |
| 27769 | 1818 |
| 1819 static PyObject * | |
| 1820 ifilterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |
| 1821 { | |
|
27770
2c389a0448a4
Remove unused variable.
Guido van Rossum <guido@python.org>
parents:
27769
diff
changeset
|
1822 PyObject *func, *seq; |
| 27769 | 1823 PyObject *it; |
| 1824 ifilterfalseobject *lz; | |
| 1825 | |
| 1826 if (!PyArg_UnpackTuple(args, "ifilterfalse", 2, 2, &func, &seq)) | |
| 1827 return NULL; | |
| 1828 | |
| 1829 /* Get iterator. */ | |
| 1830 it = PyObject_GetIter(seq); | |
| 1831 if (it == NULL) | |
| 1832 return NULL; | |
| 1833 | |
| 1834 /* create ifilterfalseobject structure */ | |
| 1835 lz = (ifilterfalseobject *)type->tp_alloc(type, 0); | |
| 1836 if (lz == NULL) { | |
| 1837 Py_DECREF(it); | |
| 1838 return NULL; | |
| 1839 } | |
| 1840 Py_INCREF(func); | |
| 1841 lz->func = func; | |
| 1842 lz->it = it; | |
| 1843 | |
| 1844 return (PyObject *)lz; | |
| 1845 } | |
| 1846 | |
| 1847 static void | |
| 1848 ifilterfalse_dealloc(ifilterfalseobject *lz) | |
| 1849 { | |
| 1850 PyObject_GC_UnTrack(lz); | |
| 1851 Py_XDECREF(lz->func); | |
| 1852 Py_XDECREF(lz->it); | |
| 1853 lz->ob_type->tp_free(lz); | |
| 1854 } | |
| 1855 | |
| 1856 static int | |
| 1857 ifilterfalse_traverse(ifilterfalseobject *lz, visitproc visit, void *arg) | |
| 1858 { | |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1859 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1860 Py_VISIT(lz->func); |
| 27769 | 1861 return 0; |
| 1862 } | |
| 1863 | |
| 1864 static PyObject * | |
| 1865 ifilterfalse_next(ifilterfalseobject *lz) | |
| 1866 { | |
| 1867 PyObject *item; | |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1868 PyObject *it = lz->it; |
| 27769 | 1869 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1870 PyObject *(*iternext)(PyObject *); |
| 27769 | 1871 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1872 assert(PyIter_Check(it)); |
|
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1873 iternext = *it->ob_type->tp_iternext; |
| 27769 | 1874 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1875 item = iternext(it); |
| 27769 | 1876 if (item == NULL) |
| 1877 return NULL; | |
| 1878 | |
| 1879 if (lz->func == Py_None) { | |
| 1880 ok = PyObject_IsTrue(item); | |
| 1881 } else { | |
| 1882 PyObject *good; | |
| 1883 good = PyObject_CallFunctionObjArgs(lz->func, | |
| 1884 item, NULL); | |
| 1885 if (good == NULL) { | |
| 1886 Py_DECREF(item); | |
| 1887 return NULL; | |
| 1888 } | |
| 1889 ok = PyObject_IsTrue(good); | |
| 1890 Py_DECREF(good); | |
| 1891 } | |
| 1892 if (!ok) | |
| 1893 return item; | |
| 1894 Py_DECREF(item); | |
| 1895 } | |
| 1896 } | |
| 1897 | |
| 1898 PyDoc_STRVAR(ifilterfalse_doc, | |
| 1899 "ifilterfalse(function or None, sequence) --> ifilterfalse object\n\ | |
| 1900 \n\ | |
| 1901 Return those items of sequence for which function(item) is false.\n\ | |
| 1902 If function is None, return the items that are false."); | |
| 1903 | |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1904 static PyTypeObject ifilterfalse_type = { |
| 27769 | 1905 PyObject_HEAD_INIT(NULL) |
| 1906 0, /* ob_size */ | |
| 1907 "itertools.ifilterfalse", /* tp_name */ | |
| 1908 sizeof(ifilterfalseobject), /* tp_basicsize */ | |
| 1909 0, /* tp_itemsize */ | |
| 1910 /* methods */ | |
| 1911 (destructor)ifilterfalse_dealloc, /* tp_dealloc */ | |
| 1912 0, /* tp_print */ | |
| 1913 0, /* tp_getattr */ | |
| 1914 0, /* tp_setattr */ | |
| 1915 0, /* tp_compare */ | |
| 1916 0, /* tp_repr */ | |
| 1917 0, /* tp_as_number */ | |
| 1918 0, /* tp_as_sequence */ | |
| 1919 0, /* tp_as_mapping */ | |
| 1920 0, /* tp_hash */ | |
| 1921 0, /* tp_call */ | |
| 1922 0, /* tp_str */ | |
| 1923 PyObject_GenericGetAttr, /* tp_getattro */ | |
| 1924 0, /* tp_setattro */ | |
| 1925 0, /* tp_as_buffer */ | |
| 1926 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | | |
| 1927 Py_TPFLAGS_BASETYPE, /* tp_flags */ | |
| 1928 ifilterfalse_doc, /* tp_doc */ | |
| 1929 (traverseproc)ifilterfalse_traverse, /* tp_traverse */ | |
| 1930 0, /* tp_clear */ | |
| 1931 0, /* tp_richcompare */ | |
| 1932 0, /* tp_weaklistoffset */ | |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1933 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1934 (iternextfunc)ifilterfalse_next, /* tp_iternext */ |
| 1935 0, /* tp_methods */ | |
| 1936 0, /* tp_members */ | |
| 1937 0, /* tp_getset */ | |
| 1938 0, /* tp_base */ | |
| 1939 0, /* tp_dict */ | |
| 1940 0, /* tp_descr_get */ | |
| 1941 0, /* tp_descr_set */ | |
| 1942 0, /* tp_dictoffset */ | |
| 1943 0, /* tp_init */ | |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1944 0, /* tp_alloc */ |
| 27769 | 1945 ifilterfalse_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1946 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1947 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1948 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1949 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1950 /* count object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1951 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1952 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1953 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1954 long cnt; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1955 } countobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1956 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1957 static PyTypeObject count_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1958 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1959 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1960 count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1961 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1962 countobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1963 long cnt = 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1964 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1965 if (!PyArg_ParseTuple(args, "|l:count", &cnt)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1966 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1967 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1968 /* create countobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1969 lz = (countobject *)PyObject_New(countobject, &count_type); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1970 if (lz == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1971 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1972 lz->cnt = cnt; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1973 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1974 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1975 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1976 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1977 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1978 count_next(countobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1979 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1980 return PyInt_FromLong(lz->cnt++); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1981 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1982 |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
1983 static PyObject * |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
1984 count_repr(countobject *lz) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
1985 { |
|
31909
6b236994684a
Change two instance of format strings for PyString_FromFormat() to use %ld
Brett Cannon <bcannon@gmail.com>
parents:
31890
diff
changeset
|
1986 return PyString_FromFormat("count(%ld)", lz->cnt); |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
1987 } |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
1988 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1989 PyDoc_STRVAR(count_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1990 "count([firstval]) --> count object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1991 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1992 Return a count object whose .next() method returns consecutive\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1993 integers starting from zero or, if specified, from firstval."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1994 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1995 static PyTypeObject count_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1996 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1997 0, /* ob_size */ |
| 27769 | 1998 "itertools.count", /* tp_name */ |
| 1999 sizeof(countobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2000 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2001 /* methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2002 (destructor)PyObject_Del, /* tp_dealloc */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2003 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2004 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2005 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2006 0, /* tp_compare */ |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2007 (reprfunc)count_repr, /* tp_repr */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2008 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2009 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2010 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2011 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2012 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2013 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2014 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2015 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2016 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2017 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
| 27769 | 2018 count_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2019 0, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2020 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2021 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2022 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2023 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2024 (iternextfunc)count_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2025 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2026 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2027 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2028 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2029 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2030 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2031 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2032 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2033 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2034 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2035 count_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2036 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2037 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2038 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2039 /* izip object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2040 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2041 #include "Python.h" |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2042 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2043 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2044 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2045 long tuplesize; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2046 PyObject *ittuple; /* tuple of iterators */ |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2047 PyObject *result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2048 } izipobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2049 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2050 static PyTypeObject izip_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2051 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2052 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2053 izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2054 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2055 izipobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2056 int i; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2057 PyObject *ittuple; /* tuple of iterators */ |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2058 PyObject *result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2059 int tuplesize = PySequence_Length(args); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2060 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2061 /* args must be a tuple */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2062 assert(PyTuple_Check(args)); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2063 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2064 /* obtain iterators */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2065 ittuple = PyTuple_New(tuplesize); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2066 if(ittuple == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2067 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2068 for (i=0; i < tuplesize; ++i) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2069 PyObject *item = PyTuple_GET_ITEM(args, i); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2070 PyObject *it = PyObject_GetIter(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2071 if (it == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2072 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2073 PyErr_Format(PyExc_TypeError, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2074 "izip argument #%d must support iteration", |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2075 i+1); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2076 Py_DECREF(ittuple); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2077 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2078 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2079 PyTuple_SET_ITEM(ittuple, i, it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2080 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2081 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2082 /* create a result holder */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2083 result = PyTuple_New(tuplesize); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2084 if (result == NULL) { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2085 Py_DECREF(ittuple); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2086 return NULL; |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2087 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2088 for (i=0 ; i < tuplesize ; i++) { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2089 Py_INCREF(Py_None); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2090 PyTuple_SET_ITEM(result, i, Py_None); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2091 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2092 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2093 /* create izipobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2094 lz = (izipobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2095 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2096 Py_DECREF(ittuple); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2097 Py_DECREF(result); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2098 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2099 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2100 lz->ittuple = ittuple; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2101 lz->tuplesize = tuplesize; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2102 lz->result = result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2103 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2104 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2105 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2106 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2107 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2108 izip_dealloc(izipobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2109 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2110 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2111 Py_XDECREF(lz->ittuple); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2112 Py_XDECREF(lz->result); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2113 lz->ob_type->tp_free(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2114 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2115 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2116 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2117 izip_traverse(izipobject *lz, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2118 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2119 Py_VISIT(lz->ittuple); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2120 Py_VISIT(lz->result); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2121 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2122 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2123 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2124 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2125 izip_next(izipobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2126 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2127 int i; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2128 long tuplesize = lz->tuplesize; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2129 PyObject *result = lz->result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2130 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2131 PyObject *item; |
|
30240
f1ea311127cf
For safety, replace a tuple entry before decreffing it.
Raymond Hettinger <python@rcn.com>
parents:
30238
diff
changeset
|
2132 PyObject *olditem; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2133 |
|
30093
0ac4396b1894
Modified itertools.izip() to match the behavior of __builtin__.zip()
Raymond Hettinger <python@rcn.com>
parents:
29850
diff
changeset
|
2134 if (tuplesize == 0) |
|
0ac4396b1894
Modified itertools.izip() to match the behavior of __builtin__.zip()
Raymond Hettinger <python@rcn.com>
parents:
29850
diff
changeset
|
2135 return NULL; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2136 if (result->ob_refcnt == 1) { |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
2137 Py_INCREF(result); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2138 for (i=0 ; i < tuplesize ; i++) { |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2139 it = PyTuple_GET_ITEM(lz->ittuple, i); |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2140 assert(PyIter_Check(it)); |
|
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2141 item = (*it->ob_type->tp_iternext)(it); |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
2142 if (item == NULL) { |
|
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
2143 Py_DECREF(result); |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2144 return NULL; |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
2145 } |
|
30240
f1ea311127cf
For safety, replace a tuple entry before decreffing it.
Raymond Hettinger <python@rcn.com>
parents:
30238
diff
changeset
|
2146 olditem = PyTuple_GET_ITEM(result, i); |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2147 PyTuple_SET_ITEM(result, i, item); |
|
30240
f1ea311127cf
For safety, replace a tuple entry before decreffing it.
Raymond Hettinger <python@rcn.com>
parents:
30238
diff
changeset
|
2148 Py_DECREF(olditem); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2149 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2150 } else { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2151 result = PyTuple_New(tuplesize); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2152 if (result == NULL) |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2153 return NULL; |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2154 for (i=0 ; i < tuplesize ; i++) { |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2155 it = PyTuple_GET_ITEM(lz->ittuple, i); |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2156 assert(PyIter_Check(it)); |
|
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2157 item = (*it->ob_type->tp_iternext)(it); |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2158 if (item == NULL) { |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2159 Py_DECREF(result); |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2160 return NULL; |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2161 } |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
2162 PyTuple_SET_ITEM(result, i, item); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2163 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2164 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2165 return result; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2166 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2167 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2168 PyDoc_STRVAR(izip_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2169 "izip(iter1 [,iter2 [...]]) --> izip object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2170 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2171 Return a izip object whose .next() method returns a tuple where\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2172 the i-th element comes from the i-th iterable argument. The .next()\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2173 method continues until the shortest iterable in the argument sequence\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2174 is exhausted and then it raises StopIteration. Works like the zip()\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2175 function but consumes less memory by returning an iterator instead of\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2176 a list."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2177 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2178 static PyTypeObject izip_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2179 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2180 0, /* ob_size */ |
| 27769 | 2181 "itertools.izip", /* tp_name */ |
| 2182 sizeof(izipobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2183 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2184 /* methods */ |
| 27769 | 2185 (destructor)izip_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2186 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2187 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2188 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2189 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2190 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2191 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2192 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2193 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2194 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2195 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2196 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2197 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2198 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2199 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2200 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2201 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 2202 izip_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2203 (traverseproc)izip_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2204 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2205 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2206 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2207 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2208 (iternextfunc)izip_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2209 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2210 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2211 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2212 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2213 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2214 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2215 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2216 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2217 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2218 0, /* tp_alloc */ |
| 27769 | 2219 izip_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2220 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2221 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2222 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2223 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2224 /* repeat object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2225 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2226 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2227 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2228 PyObject *element; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2229 long cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2230 } repeatobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2231 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2232 static PyTypeObject repeat_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2233 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2234 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2235 repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2236 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2237 repeatobject *ro; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2238 PyObject *element; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2239 long cnt = -1; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2240 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2241 if (!PyArg_ParseTuple(args, "O|l:repeat", &element, &cnt)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2242 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2243 |
|
28945
001a90555780
* Added a substantial number of edge case and argument tests for
Raymond Hettinger <python@rcn.com>
parents:
28930
diff
changeset
|
2244 if (PyTuple_Size(args) == 2 && cnt < 0) |
|
001a90555780
* Added a substantial number of edge case and argument tests for
Raymond Hettinger <python@rcn.com>
parents:
28930
diff
changeset
|
2245 cnt = 0; |
|
001a90555780
* Added a substantial number of edge case and argument tests for
Raymond Hettinger <python@rcn.com>
parents:
28930
diff
changeset
|
2246 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2247 ro = (repeatobject *)type->tp_alloc(type, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2248 if (ro == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2249 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2250 Py_INCREF(element); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2251 ro->element = element; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2252 ro->cnt = cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2253 return (PyObject *)ro; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2254 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2255 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2256 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2257 repeat_dealloc(repeatobject *ro) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2258 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2259 PyObject_GC_UnTrack(ro); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2260 Py_XDECREF(ro->element); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2261 ro->ob_type->tp_free(ro); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2262 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2263 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2264 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2265 repeat_traverse(repeatobject *ro, visitproc visit, void *arg) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2266 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2267 Py_VISIT(ro->element); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2268 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2269 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2270 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2271 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2272 repeat_next(repeatobject *ro) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2273 { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2274 if (ro->cnt == 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2275 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2276 if (ro->cnt > 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2277 ro->cnt--; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2278 Py_INCREF(ro->element); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2279 return ro->element; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2280 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2281 |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2282 static PyObject * |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2283 repeat_repr(repeatobject *ro) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2284 { |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2285 PyObject *result, *objrepr; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2286 |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2287 objrepr = PyObject_Repr(ro->element); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2288 if (objrepr == NULL) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2289 return NULL; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2290 |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2291 if (ro->cnt == -1) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2292 result = PyString_FromFormat("repeat(%s)", |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2293 PyString_AS_STRING(objrepr)); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2294 else |
|
31909
6b236994684a
Change two instance of format strings for PyString_FromFormat() to use %ld
Brett Cannon <bcannon@gmail.com>
parents:
31890
diff
changeset
|
2295 result = PyString_FromFormat("repeat(%s, %ld)", |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2296 PyString_AS_STRING(objrepr), ro->cnt); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2297 Py_DECREF(objrepr); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2298 return result; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2299 } |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2300 |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2301 static int |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2302 repeat_len(repeatobject *ro) |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2303 { |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2304 if (ro->cnt == -1) |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2305 PyErr_SetString(PyExc_TypeError, "len() of unsized object"); |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2306 return (int)(ro->cnt); |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2307 } |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2308 |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2309 static PySequenceMethods repeat_as_sequence = { |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2310 (inquiry)repeat_len, /* sq_length */ |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2311 0, /* sq_concat */ |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2312 }; |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2313 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2314 PyDoc_STRVAR(repeat_doc, |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2315 "repeat(element [,times]) -> create an iterator which returns the element\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2316 for the specified number of times. If not specified, returns the element\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2317 endlessly."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2318 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2319 static PyTypeObject repeat_type = { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2320 PyObject_HEAD_INIT(NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2321 0, /* ob_size */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2322 "itertools.repeat", /* tp_name */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2323 sizeof(repeatobject), /* tp_basicsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2324 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2325 /* methods */ |
| 27769 | 2326 (destructor)repeat_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2327 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2328 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2329 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2330 0, /* tp_compare */ |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2331 (reprfunc)repeat_repr, /* tp_repr */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2332 0, /* tp_as_number */ |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
2333 &repeat_as_sequence, /* tp_as_sequence */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2334 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2335 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2336 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2337 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2338 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2339 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2340 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2341 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2342 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 2343 repeat_doc, /* tp_doc */ |
| 2344 (traverseproc)repeat_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2345 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2346 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2347 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2348 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2349 (iternextfunc)repeat_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2350 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2351 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2352 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2353 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2354 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2355 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2356 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2357 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2358 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2359 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2360 repeat_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2361 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2362 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2363 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2364 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2365 /* module level code ********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2366 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2367 PyDoc_STRVAR(module_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2368 "Functional tools for creating and using iterators.\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2369 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2370 Infinite iterators:\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2371 count([n]) --> n, n+1, n+2, ...\n\ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2372 cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\ |
| 28601 | 2373 repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times\n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2374 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2375 Iterators terminating on the shortest input sequence:\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2376 izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ |
| 27769 | 2377 ifilter(pred, seq) --> elements of seq where pred(elem) is True\n\ |
| 2378 ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2379 islice(seq, [start,] stop [, step]) --> elements from\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2380 seq[start:stop:step]\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2381 imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ...\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2382 starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ...\n\ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2383 tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n\n\ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2384 chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... \n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2385 takewhile(pred, seq) --> seq[0], seq[1], until pred fails\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2386 dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails\n\ |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
2387 groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)\n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2388 "); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2389 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2390 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2391 static PyMethodDef module_methods[] = { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2392 {"tee", (PyCFunction)tee, METH_VARARGS, tee_doc}, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2393 {NULL, NULL} /* sentinel */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2394 }; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2395 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2396 PyMODINIT_FUNC |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2397 inititertools(void) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2398 { |
| 27769 | 2399 int i; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2400 PyObject *m; |
| 27769 | 2401 char *name; |
| 2402 PyTypeObject *typelist[] = { | |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2403 &cycle_type, |
| 27769 | 2404 &dropwhile_type, |
| 2405 &takewhile_type, | |
| 2406 &islice_type, | |
| 2407 &starmap_type, | |
| 2408 &imap_type, | |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2409 &chain_type, |
| 27769 | 2410 &ifilter_type, |
| 2411 &ifilterfalse_type, | |
| 2412 &count_type, | |
| 2413 &izip_type, | |
| 2414 &repeat_type, | |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
2415 &groupby_type, |
| 27769 | 2416 NULL |
| 2417 }; | |
| 2418 | |
|
31508
71864820402d
need to initialize ob_type slot at run-time, at least on cygwin
Skip Montanaro <skip@pobox.com>
parents:
31501
diff
changeset
|
2419 teedataobject_type.ob_type = &PyType_Type; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2420 m = Py_InitModule3("itertools", module_methods, module_doc); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2421 |
| 27769 | 2422 for (i=0 ; typelist[i] != NULL ; i++) { |
| 2423 if (PyType_Ready(typelist[i]) < 0) | |
| 2424 return; | |
|
29225
f3f306457b43
Fixed dotted name assertion.
Raymond Hettinger <python@rcn.com>
parents:
28945
diff
changeset
|
2425 name = strchr(typelist[i]->tp_name, '.'); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
2426 assert (name != NULL); |
| 27769 | 2427 Py_INCREF(typelist[i]); |
|
29225
f3f306457b43
Fixed dotted name assertion.
Raymond Hettinger <python@rcn.com>
parents:
28945
diff
changeset
|
2428 PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); |
| 27769 | 2429 } |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2430 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2431 if (PyType_Ready(&teedataobject_type) < 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2432 return; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2433 if (PyType_Ready(&tee_type) < 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
2434 return; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
2435 if (PyType_Ready(&_grouper_type) < 0) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
2436 return; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2437 } |
