Mercurial > cpython-lru_cache-weakref
annotate Modules/itertoolsmodule.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | f4989516b4d6 |
| children | 0b8d2cf3f55b |
| 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 { |
| 36684 | 29 static char *kwargs[] = {"iterable", "key", NULL}; |
|
31136
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); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
62 Py_TYPE(gbo)->tp_free(gbo); |
|
31136
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 = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
142 PyVarObject_HEAD_INIT(NULL, 0) |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
143 "itertools.groupby", /* tp_name */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
144 sizeof(groupbyobject), /* tp_basicsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
145 0, /* tp_itemsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
146 /* methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
147 (destructor)groupby_dealloc, /* tp_dealloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
148 0, /* tp_print */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
149 0, /* tp_getattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
150 0, /* tp_setattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
151 0, /* tp_compare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
152 0, /* tp_repr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
153 0, /* tp_as_number */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
154 0, /* tp_as_sequence */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
155 0, /* tp_as_mapping */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
156 0, /* tp_hash */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
157 0, /* tp_call */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
158 0, /* tp_str */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
159 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
160 0, /* tp_setattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
161 0, /* tp_as_buffer */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
162 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
163 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
164 groupby_doc, /* tp_doc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
165 (traverseproc)groupby_traverse, /* tp_traverse */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
166 0, /* tp_clear */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
167 0, /* tp_richcompare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
168 0, /* tp_weaklistoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
169 PyObject_SelfIter, /* tp_iter */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
170 (iternextfunc)groupby_next, /* tp_iternext */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
171 0, /* tp_methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
172 0, /* tp_members */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
173 0, /* tp_getset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
174 0, /* tp_base */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
175 0, /* tp_dict */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
176 0, /* tp_descr_get */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
177 0, /* tp_descr_set */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
178 0, /* tp_dictoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
179 0, /* tp_init */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
180 0, /* tp_alloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
181 groupby_new, /* tp_new */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
182 PyObject_GC_Del, /* tp_free */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
183 }; |
|
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 /* _grouper object (internal) ************************************************/ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
187 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
188 typedef struct { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
189 PyObject_HEAD |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
190 PyObject *parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
191 PyObject *tgtkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
192 } _grouperobject; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
193 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
194 static PyTypeObject _grouper_type; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
195 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
196 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
197 _grouper_create(groupbyobject *parent, PyObject *tgtkey) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
198 { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
199 _grouperobject *igo; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
200 |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
201 igo = PyObject_GC_New(_grouperobject, &_grouper_type); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
202 if (igo == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
203 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
204 igo->parent = (PyObject *)parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
205 Py_INCREF(parent); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
206 igo->tgtkey = tgtkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
207 Py_INCREF(tgtkey); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
208 |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
209 PyObject_GC_Track(igo); |
|
31136
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 { |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
216 PyObject_GC_UnTrack(igo); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
217 Py_DECREF(igo->parent); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
218 Py_DECREF(igo->tgtkey); |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
219 PyObject_GC_Del(igo); |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
220 } |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
221 |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
222 static int |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
223 _grouper_traverse(_grouperobject *igo, visitproc visit, void *arg) |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
224 { |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
225 Py_VISIT(igo->parent); |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
226 Py_VISIT(igo->tgtkey); |
|
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
227 return 0; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
228 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
229 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
230 static PyObject * |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
231 _grouper_next(_grouperobject *igo) |
|
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 groupbyobject *gbo = (groupbyobject *)igo->parent; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
234 PyObject *newvalue, *newkey, *r; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
235 int rcmp; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
236 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
237 if (gbo->currvalue == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
238 newvalue = PyIter_Next(gbo->it); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
239 if (newvalue == NULL) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
240 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
241 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
242 if (gbo->keyfunc == Py_None) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
243 newkey = newvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
244 Py_INCREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
245 } else { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
246 newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc, |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
247 newvalue, NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
248 if (newkey == NULL) { |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
249 Py_DECREF(newvalue); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
250 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
251 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
252 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
253 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
254 assert(gbo->currkey == NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
255 gbo->currkey = newkey; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
256 gbo->currvalue = newvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
257 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
258 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
259 assert(gbo->currkey != NULL); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
260 rcmp = PyObject_RichCompareBool(igo->tgtkey, gbo->currkey, Py_EQ); |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
261 if (rcmp <= 0) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
262 /* got any error or current group is end */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
263 return NULL; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
264 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
265 r = gbo->currvalue; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
266 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
|
267 Py_CLEAR(gbo->currkey); |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
268 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
269 return r; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
270 } |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
271 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
272 static PyTypeObject _grouper_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
273 PyVarObject_HEAD_INIT(NULL, 0) |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
274 "itertools._grouper", /* tp_name */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
275 sizeof(_grouperobject), /* tp_basicsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
276 0, /* tp_itemsize */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
277 /* methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
278 (destructor)_grouper_dealloc, /* tp_dealloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
279 0, /* tp_print */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
280 0, /* tp_getattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
281 0, /* tp_setattr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
282 0, /* tp_compare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
283 0, /* tp_repr */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
284 0, /* tp_as_number */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
285 0, /* tp_as_sequence */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
286 0, /* tp_as_mapping */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
287 0, /* tp_hash */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
288 0, /* tp_call */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
289 0, /* tp_str */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
290 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
291 0, /* tp_setattro */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
292 0, /* tp_as_buffer */ |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
293 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
294 0, /* tp_doc */ |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
295 (traverseproc)_grouper_traverse,/* tp_traverse */ |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
296 0, /* tp_clear */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
297 0, /* tp_richcompare */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
298 0, /* tp_weaklistoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
299 PyObject_SelfIter, /* tp_iter */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
300 (iternextfunc)_grouper_next, /* tp_iternext */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
301 0, /* tp_methods */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
302 0, /* tp_members */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
303 0, /* tp_getset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
304 0, /* tp_base */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
305 0, /* tp_dict */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
306 0, /* tp_descr_get */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
307 0, /* tp_descr_set */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
308 0, /* tp_dictoffset */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
309 0, /* tp_init */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
310 0, /* tp_alloc */ |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
311 0, /* tp_new */ |
|
45699
0be9b1cf1b16
Issue 2246: itertools grouper object did not participate in GC (should be backported).
Raymond Hettinger <python@rcn.com>
parents:
45676
diff
changeset
|
312 PyObject_GC_Del, /* tp_free */ |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
313 }; |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
314 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
315 |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
316 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
317 /* tee object and with supporting function and objects ***************/ |
| 30764 | 318 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
319 /* 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
|
320 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
|
321 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
|
322 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
|
323 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
|
324 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
|
325 wasted space and the more rapid freeing of older data. |
| 30764 | 326 */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
327 #define LINKCELLS 57 |
| 30764 | 328 |
| 329 typedef struct { | |
| 330 PyObject_HEAD | |
| 331 PyObject *it; | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
332 int numread; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
333 PyObject *nextlink; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
334 PyObject *(values[LINKCELLS]); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
335 } teedataobject; |
| 30764 | 336 |
| 337 typedef struct { | |
| 338 PyObject_HEAD | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
339 teedataobject *dataobj; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
340 int index; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
341 PyObject *weakreflist; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
342 } teeobject; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
343 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
344 static PyTypeObject teedataobject_type; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
345 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
346 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
347 teedataobject_new(PyObject *it) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
348 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
349 teedataobject *tdo; |
| 30764 | 350 |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
351 tdo = PyObject_GC_New(teedataobject, &teedataobject_type); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
352 if (tdo == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
353 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
354 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
355 tdo->numread = 0; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
356 tdo->nextlink = NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
357 Py_INCREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
358 tdo->it = it; |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
359 PyObject_GC_Track(tdo); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
360 return (PyObject *)tdo; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
361 } |
| 30764 | 362 |
| 363 static PyObject * | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
364 teedataobject_jumplink(teedataobject *tdo) |
| 30764 | 365 { |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
366 if (tdo->nextlink == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
367 tdo->nextlink = teedataobject_new(tdo->it); |
|
39144
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
368 Py_XINCREF(tdo->nextlink); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
369 return tdo->nextlink; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
370 } |
| 30764 | 371 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
372 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
373 teedataobject_getitem(teedataobject *tdo, int i) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
374 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
375 PyObject *value; |
| 30764 | 376 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
377 assert(i < LINKCELLS); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
378 if (i < tdo->numread) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
379 value = tdo->values[i]; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
380 else { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
381 /* 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
|
382 assert(i == tdo->numread); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
383 value = PyIter_Next(tdo->it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
384 if (value == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
385 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
386 tdo->numread++; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
387 tdo->values[i] = value; |
| 30764 | 388 } |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
389 Py_INCREF(value); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
390 return value; |
| 30764 | 391 } |
| 392 | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
393 static int |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
394 teedataobject_traverse(teedataobject *tdo, visitproc visit, void * arg) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
395 { |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
396 int i; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
397 Py_VISIT(tdo->it); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
398 for (i = 0; i < tdo->numread; i++) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
399 Py_VISIT(tdo->values[i]); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
400 Py_VISIT(tdo->nextlink); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
401 return 0; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
402 } |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
403 |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
404 static int |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
405 teedataobject_clear(teedataobject *tdo) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
406 { |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
407 int i; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
408 Py_CLEAR(tdo->it); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
409 for (i=0 ; i<tdo->numread ; i++) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
410 Py_CLEAR(tdo->values[i]); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
411 Py_CLEAR(tdo->nextlink); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
412 return 0; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
413 } |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
414 |
| 30764 | 415 static void |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
416 teedataobject_dealloc(teedataobject *tdo) |
| 30764 | 417 { |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
418 PyObject_GC_UnTrack(tdo); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
419 teedataobject_clear(tdo); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
420 PyObject_GC_Del(tdo); |
| 30764 | 421 } |
| 422 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
423 PyDoc_STRVAR(teedataobject_doc, "Data container common to multiple tee objects."); |
| 30764 | 424 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
425 static PyTypeObject teedataobject_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
426 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
427 "itertools.tee_dataobject", /* tp_name */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
428 sizeof(teedataobject), /* tp_basicsize */ |
| 30764 | 429 0, /* tp_itemsize */ |
| 430 /* methods */ | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
431 (destructor)teedataobject_dealloc, /* tp_dealloc */ |
| 30764 | 432 0, /* tp_print */ |
| 433 0, /* tp_getattr */ | |
| 434 0, /* tp_setattr */ | |
| 435 0, /* tp_compare */ | |
| 436 0, /* tp_repr */ | |
| 437 0, /* tp_as_number */ | |
| 438 0, /* tp_as_sequence */ | |
| 439 0, /* tp_as_mapping */ | |
| 440 0, /* tp_hash */ | |
| 441 0, /* tp_call */ | |
| 442 0, /* tp_str */ | |
| 443 PyObject_GenericGetAttr, /* tp_getattro */ | |
| 444 0, /* tp_setattro */ | |
| 445 0, /* tp_as_buffer */ | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
446 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
447 teedataobject_doc, /* tp_doc */ |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
448 (traverseproc)teedataobject_traverse, /* tp_traverse */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
449 (inquiry)teedataobject_clear, /* tp_clear */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
450 0, /* tp_richcompare */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
451 0, /* tp_weaklistoffset */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
452 0, /* tp_iter */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
453 0, /* tp_iternext */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
454 0, /* tp_methods */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
455 0, /* tp_members */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
456 0, /* tp_getset */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
457 0, /* tp_base */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
458 0, /* tp_dict */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
459 0, /* tp_descr_get */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
460 0, /* tp_descr_set */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
461 0, /* tp_dictoffset */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
462 0, /* tp_init */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
463 0, /* tp_alloc */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
464 0, /* tp_new */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
465 PyObject_GC_Del, /* tp_free */ |
| 30764 | 466 }; |
| 467 | |
| 468 | |
| 469 static PyTypeObject tee_type; | |
| 470 | |
| 471 static PyObject * | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
472 tee_next(teeobject *to) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
473 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
474 PyObject *value, *link; |
|
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 if (to->index >= LINKCELLS) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
477 link = teedataobject_jumplink(to->dataobj); |
|
39144
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
478 Py_DECREF(to->dataobj); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
479 to->dataobj = (teedataobject *)link; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
480 to->index = 0; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
481 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
482 value = teedataobject_getitem(to->dataobj, to->index); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
483 if (value == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
484 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
485 to->index++; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
486 return value; |
|
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 |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
489 static int |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
490 tee_traverse(teeobject *to, visitproc visit, void *arg) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
491 { |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
492 Py_VISIT((PyObject *)to->dataobj); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
493 return 0; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
494 } |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
495 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
496 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
497 tee_copy(teeobject *to) |
| 30764 | 498 { |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
499 teeobject *newto; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
500 |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
501 newto = PyObject_GC_New(teeobject, &tee_type); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
502 if (newto == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
503 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
504 Py_INCREF(to->dataobj); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
505 newto->dataobj = to->dataobj; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
506 newto->index = to->index; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
507 newto->weakreflist = NULL; |
|
37757
e1388aba9896
Add missing PyObject_GC_Track call, causing *some* itertools.tee objects to
Thomas Wouters <thomas@python.org>
parents:
37248
diff
changeset
|
508 PyObject_GC_Track(newto); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
509 return (PyObject *)newto; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
510 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
511 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
512 PyDoc_STRVAR(teecopy_doc, "Returns an independent iterator."); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
513 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
514 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
515 tee_fromiterable(PyObject *iterable) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
516 { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
517 teeobject *to; |
| 30764 | 518 PyObject *it = NULL; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
519 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
520 it = PyObject_GetIter(iterable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
521 if (it == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
522 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
523 if (PyObject_TypeCheck(it, &tee_type)) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
524 to = (teeobject *)tee_copy((teeobject *)it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
525 goto done; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
526 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
527 |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
528 to = PyObject_GC_New(teeobject, &tee_type); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
529 if (to == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
530 goto done; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
531 to->dataobj = (teedataobject *)teedataobject_new(it); |
|
39144
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
532 if (!to->dataobj) { |
|
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
533 PyObject_GC_Del(to); |
|
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
534 to = NULL; |
|
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
535 goto done; |
|
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
536 } |
|
e9773fc27e9b
nextlink can be NULL if teedataobject_new fails, so use XINCREF.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38420
diff
changeset
|
537 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
538 to->index = 0; |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
539 to->weakreflist = NULL; |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
540 PyObject_GC_Track(to); |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
541 done: |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
542 Py_XDECREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
543 return (PyObject *)to; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
544 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
545 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
546 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
547 tee_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
548 { |
| 30764 | 549 PyObject *iterable; |
| 550 | |
| 551 if (!PyArg_UnpackTuple(args, "tee", 1, 1, &iterable)) | |
| 552 return NULL; | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
553 return tee_fromiterable(iterable); |
| 30764 | 554 } |
| 555 | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
556 static int |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
557 tee_clear(teeobject *to) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
558 { |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
559 if (to->weakreflist != NULL) |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
560 PyObject_ClearWeakRefs((PyObject *) to); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
561 Py_CLEAR(to->dataobj); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
562 return 0; |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
563 } |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
564 |
| 30764 | 565 static void |
| 566 tee_dealloc(teeobject *to) | |
| 567 { | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
568 PyObject_GC_UnTrack(to); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
569 tee_clear(to); |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
570 PyObject_GC_Del(to); |
| 30764 | 571 } |
| 572 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
573 PyDoc_STRVAR(teeobject_doc, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
574 "Iterator wrapped to make it copyable"); |
| 30764 | 575 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
576 static PyMethodDef tee_methods[] = { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
577 {"__copy__", (PyCFunction)tee_copy, METH_NOARGS, teecopy_doc}, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
578 {NULL, NULL} /* sentinel */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
579 }; |
| 30764 | 580 |
| 581 static PyTypeObject tee_type = { | |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
582 PyVarObject_HEAD_INIT(NULL, 0) |
| 30764 | 583 "itertools.tee", /* tp_name */ |
| 584 sizeof(teeobject), /* tp_basicsize */ | |
| 585 0, /* tp_itemsize */ | |
| 586 /* methods */ | |
| 587 (destructor)tee_dealloc, /* tp_dealloc */ | |
| 588 0, /* tp_print */ | |
| 589 0, /* tp_getattr */ | |
| 590 0, /* tp_setattr */ | |
| 591 0, /* tp_compare */ | |
| 592 0, /* tp_repr */ | |
| 593 0, /* tp_as_number */ | |
| 594 0, /* tp_as_sequence */ | |
| 595 0, /* tp_as_mapping */ | |
| 596 0, /* tp_hash */ | |
| 597 0, /* tp_call */ | |
| 598 0, /* tp_str */ | |
|
30786
225d848a5f96
Minor improvements to itertools.tee():
Raymond Hettinger <python@rcn.com>
parents:
30773
diff
changeset
|
599 0, /* tp_getattro */ |
| 30764 | 600 0, /* tp_setattro */ |
| 601 0, /* tp_as_buffer */ | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
602 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
603 teeobject_doc, /* tp_doc */ |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
604 (traverseproc)tee_traverse, /* tp_traverse */ |
|
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
605 (inquiry)tee_clear, /* tp_clear */ |
| 30764 | 606 0, /* tp_richcompare */ |
|
33777
e4b7c923ed5f
Fix and test weak referencing of itertools.tee objects.
Raymond Hettinger <python@rcn.com>
parents:
33646
diff
changeset
|
607 offsetof(teeobject, weakreflist), /* tp_weaklistoffset */ |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
608 PyObject_SelfIter, /* tp_iter */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
609 (iternextfunc)tee_next, /* tp_iternext */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
610 tee_methods, /* tp_methods */ |
| 30764 | 611 0, /* tp_members */ |
| 612 0, /* tp_getset */ | |
| 613 0, /* tp_base */ | |
| 614 0, /* tp_dict */ | |
| 615 0, /* tp_descr_get */ | |
| 616 0, /* tp_descr_set */ | |
| 617 0, /* tp_dictoffset */ | |
| 618 0, /* tp_init */ | |
| 619 0, /* tp_alloc */ | |
| 620 tee_new, /* tp_new */ | |
|
37248
00e9d59c23b4
Make itertools.tee and its internal teedataobject participate in GC. This
Thomas Wouters <thomas@python.org>
parents:
36684
diff
changeset
|
621 PyObject_GC_Del, /* tp_free */ |
| 30764 | 622 }; |
| 623 | |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
624 static PyObject * |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
625 tee(PyObject *self, PyObject *args) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
626 { |
|
39720
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
627 Py_ssize_t i, n=2; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
628 PyObject *it, *iterable, *copyable, *result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
629 |
|
39720
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
630 if (!PyArg_ParseTuple(args, "O|n", &iterable, &n)) |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
631 return NULL; |
|
39720
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
632 if (n < 0) { |
|
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
633 PyErr_SetString(PyExc_ValueError, "n must be >= 0"); |
|
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
634 return NULL; |
|
1352ad9afcc0
Bug #1550714: fix SystemError from itertools.tee on negative value for n.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39144
diff
changeset
|
635 } |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
636 result = PyTuple_New(n); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
637 if (result == NULL) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
638 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
639 if (n == 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
640 return result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
641 it = PyObject_GetIter(iterable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
642 if (it == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
643 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
644 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
645 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
646 if (!PyObject_HasAttrString(it, "__copy__")) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
647 copyable = tee_fromiterable(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
648 Py_DECREF(it); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
649 if (copyable == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
650 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
651 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
652 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
653 } else |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
654 copyable = it; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
655 PyTuple_SET_ITEM(result, 0, copyable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
656 for (i=1 ; i<n ; i++) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
657 copyable = PyObject_CallMethod(copyable, "__copy__", NULL); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
658 if (copyable == NULL) { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
659 Py_DECREF(result); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
660 return NULL; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
661 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
662 PyTuple_SET_ITEM(result, i, copyable); |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
663 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
664 return result; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
665 } |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
666 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
667 PyDoc_STRVAR(tee_doc, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
668 "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
|
669 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
670 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
671 /* cycle object **********************************************************/ |
|
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 typedef struct { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
674 PyObject_HEAD |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
675 PyObject *it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
676 PyObject *saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
677 int firstpass; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
678 } cycleobject; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
679 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
680 static PyTypeObject cycle_type; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
681 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
682 static PyObject * |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
683 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
|
684 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
685 PyObject *it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
686 PyObject *iterable; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
687 PyObject *saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
688 cycleobject *lz; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
689 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
690 if (type == &cycle_type && !_PyArg_NoKeywords("cycle()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
691 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
692 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
693 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
|
694 return NULL; |
|
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 /* Get iterator. */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
697 it = PyObject_GetIter(iterable); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
698 if (it == NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
699 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
700 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
701 saved = PyList_New(0); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
702 if (saved == NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
703 Py_DECREF(it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
704 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
705 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
706 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
707 /* create cycleobject structure */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
708 lz = (cycleobject *)type->tp_alloc(type, 0); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
709 if (lz == NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
710 Py_DECREF(it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
711 Py_DECREF(saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
712 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
713 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
714 lz->it = it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
715 lz->saved = saved; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
716 lz->firstpass = 0; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
717 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
718 return (PyObject *)lz; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
719 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
720 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
721 static void |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
722 cycle_dealloc(cycleobject *lz) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
723 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
724 PyObject_GC_UnTrack(lz); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
725 Py_XDECREF(lz->saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
726 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
727 Py_TYPE(lz)->tp_free(lz); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
728 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
729 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
730 static int |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
731 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
|
732 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
733 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
734 Py_VISIT(lz->saved); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
735 return 0; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
736 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
737 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
738 static PyObject * |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
739 cycle_next(cycleobject *lz) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
740 { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
741 PyObject *item; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
742 PyObject *it; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
743 PyObject *tmp; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
744 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
745 while (1) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
746 item = PyIter_Next(lz->it); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
747 if (item != NULL) { |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
748 if (!lz->firstpass) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
749 PyList_Append(lz->saved, item); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
750 return item; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
751 } |
|
32010
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
752 if (PyErr_Occurred()) { |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
753 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
|
754 PyErr_Clear(); |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
755 else |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
756 return NULL; |
|
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
757 } |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
758 if (PyList_Size(lz->saved) == 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
759 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
760 it = PyObject_GetIter(lz->saved); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
761 if (it == NULL) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
762 return NULL; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
763 tmp = lz->it; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
764 lz->it = it; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
765 lz->firstpass = 1; |
|
33646
3d8d78217599
Replace structure member before decreffing.
Raymond Hettinger <python@rcn.com>
parents:
33616
diff
changeset
|
766 Py_DECREF(tmp); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
767 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
768 } |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
769 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
770 PyDoc_STRVAR(cycle_doc, |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
771 "cycle(iterable) --> cycle object\n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
772 \n\ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
773 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
|
774 Then repeat the sequence indefinitely."); |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
775 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
776 static PyTypeObject cycle_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
777 PyVarObject_HEAD_INIT(NULL, 0) |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
778 "itertools.cycle", /* tp_name */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
779 sizeof(cycleobject), /* tp_basicsize */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
780 0, /* tp_itemsize */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
781 /* methods */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
782 (destructor)cycle_dealloc, /* tp_dealloc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
783 0, /* tp_print */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
784 0, /* tp_getattr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
785 0, /* tp_setattr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
786 0, /* tp_compare */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
787 0, /* tp_repr */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
788 0, /* tp_as_number */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
789 0, /* tp_as_sequence */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
790 0, /* tp_as_mapping */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
791 0, /* tp_hash */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
792 0, /* tp_call */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
793 0, /* tp_str */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
794 PyObject_GenericGetAttr, /* tp_getattro */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
795 0, /* tp_setattro */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
796 0, /* tp_as_buffer */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
797 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
798 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
799 cycle_doc, /* tp_doc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
800 (traverseproc)cycle_traverse, /* tp_traverse */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
801 0, /* tp_clear */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
802 0, /* tp_richcompare */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
803 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
804 PyObject_SelfIter, /* tp_iter */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
805 (iternextfunc)cycle_next, /* tp_iternext */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
806 0, /* tp_methods */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
807 0, /* tp_members */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
808 0, /* tp_getset */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
809 0, /* tp_base */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
810 0, /* tp_dict */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
811 0, /* tp_descr_get */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
812 0, /* tp_descr_set */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
813 0, /* tp_dictoffset */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
814 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
815 0, /* tp_alloc */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
816 cycle_new, /* tp_new */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
817 PyObject_GC_Del, /* tp_free */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
818 }; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
819 |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
820 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
821 /* dropwhile object **********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
822 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
823 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
824 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
825 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
826 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
827 long start; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
828 } dropwhileobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
829 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
830 static PyTypeObject dropwhile_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
831 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
832 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
833 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
|
834 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
835 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
836 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
837 dropwhileobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
838 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
839 if (type == &dropwhile_type && !_PyArg_NoKeywords("dropwhile()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
840 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
841 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
842 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
|
843 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
844 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
845 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
846 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
847 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
848 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
849 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
850 /* create dropwhileobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
851 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
|
852 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
853 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
854 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
855 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
856 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
857 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
858 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
859 lz->start = 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
860 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
861 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
862 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
863 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
864 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
865 dropwhile_dealloc(dropwhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
866 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
867 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
868 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
869 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
870 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
871 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
872 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
873 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
874 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
|
875 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
876 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
877 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
878 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
879 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
880 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
881 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
882 dropwhile_next(dropwhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
883 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
884 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
|
885 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
886 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
887 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
888 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
889 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
890 iternext = *Py_TYPE(it)->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
891 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
892 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
893 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
894 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
895 if (lz->start == 1) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
896 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
897 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
898 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
|
899 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
900 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
901 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
902 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
903 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
904 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
905 if (!ok) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
906 lz->start = 1; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
907 return item; |
|
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 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
910 } |
|
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 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
913 PyDoc_STRVAR(dropwhile_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
914 "dropwhile(predicate, iterable) --> dropwhile object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
915 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
916 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
|
917 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
|
918 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
919 static PyTypeObject dropwhile_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
920 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 921 "itertools.dropwhile", /* tp_name */ |
| 922 sizeof(dropwhileobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
923 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
924 /* methods */ |
| 27769 | 925 (destructor)dropwhile_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
926 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
927 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
928 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
929 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
930 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
931 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
932 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
933 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
934 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
935 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
936 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
937 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
938 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
939 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
940 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
|
941 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 942 dropwhile_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
943 (traverseproc)dropwhile_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
944 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
945 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
946 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
947 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 948 (iternextfunc)dropwhile_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
949 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
950 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
951 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
952 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
953 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
954 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
955 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
956 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
957 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
958 0, /* tp_alloc */ |
| 27769 | 959 dropwhile_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
960 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
961 }; |
|
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 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
964 /* takewhile object **********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
965 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
966 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
967 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
968 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
969 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
970 long stop; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
971 } takewhileobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
972 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
973 static PyTypeObject takewhile_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
974 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
975 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
976 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
|
977 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
978 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
979 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
980 takewhileobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
981 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
982 if (type == &takewhile_type && !_PyArg_NoKeywords("takewhile()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
983 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
984 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
985 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
|
986 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
987 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
988 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
989 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
990 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
991 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
992 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
993 /* create takewhileobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
994 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
|
995 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
996 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
997 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
998 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
999 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1000 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1001 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1002 lz->stop = 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1003 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1004 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1005 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1006 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1007 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1008 takewhile_dealloc(takewhileobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1009 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1010 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1011 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1012 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1013 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1014 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1015 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1016 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1017 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
|
1018 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1019 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1020 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1021 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1022 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1023 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1024 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1025 takewhile_next(takewhileobject *lz) |
|
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 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
|
1028 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1029 long ok; |
|
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 if (lz->stop == 1) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1032 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1033 |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1034 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1035 item = (*Py_TYPE(it)->tp_iternext)(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1036 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1037 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1038 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1039 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
|
1040 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1041 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1042 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1043 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1044 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1045 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1046 if (ok) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1047 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1048 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1049 lz->stop = 1; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1050 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1051 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1052 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1053 PyDoc_STRVAR(takewhile_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1054 "takewhile(predicate, iterable) --> takewhile object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1055 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1056 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
|
1057 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
|
1058 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1059 static PyTypeObject takewhile_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
1060 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 1061 "itertools.takewhile", /* tp_name */ |
| 1062 sizeof(takewhileobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1063 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1064 /* methods */ |
| 27769 | 1065 (destructor)takewhile_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1066 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1067 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1068 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1069 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1070 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1071 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1072 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1073 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1074 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1075 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1076 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1077 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1078 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1079 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1080 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
|
1081 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1082 takewhile_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1083 (traverseproc)takewhile_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1084 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1085 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1086 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1087 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1088 (iternextfunc)takewhile_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1089 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1090 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1091 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1092 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1093 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1094 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1095 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1096 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1097 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1098 0, /* tp_alloc */ |
| 27769 | 1099 takewhile_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1100 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1101 }; |
|
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 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1104 /* islice object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1105 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1106 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1107 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1108 PyObject *it; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1109 Py_ssize_t next; |
|
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1110 Py_ssize_t stop; |
|
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1111 Py_ssize_t step; |
|
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1112 Py_ssize_t cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1113 } isliceobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1114 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1115 static PyTypeObject islice_type; |
|
27570
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 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1118 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
|
1119 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1120 PyObject *seq; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1121 Py_ssize_t start=0, stop=-1, step=1; |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1122 PyObject *it, *a1=NULL, *a2=NULL, *a3=NULL; |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1123 Py_ssize_t numargs; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1124 isliceobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1125 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
1126 if (type == &islice_type && !_PyArg_NoKeywords("islice()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1127 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1128 |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1129 if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1130 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1131 |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1132 numargs = PyTuple_Size(args); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1133 if (numargs == 2) { |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1134 if (a1 != Py_None) { |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1135 stop = PyInt_AsSsize_t(a1); |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1136 if (stop == -1) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1137 if (PyErr_Occurred()) |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1138 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1139 PyErr_SetString(PyExc_ValueError, |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1140 "Stop argument for islice() 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
|
1141 return NULL; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1142 } |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1143 } |
|
28930
18082b2d2ebd
The previous made the stop argument optional.
Raymond Hettinger <python@rcn.com>
parents:
28929
diff
changeset
|
1144 } else { |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1145 if (a1 != Py_None) |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1146 start = PyInt_AsSsize_t(a1); |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1147 if (start == -1 && PyErr_Occurred()) |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1148 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1149 if (a2 != Py_None) { |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1150 stop = PyInt_AsSsize_t(a2); |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1151 if (stop == -1) { |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1152 if (PyErr_Occurred()) |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1153 PyErr_Clear(); |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1154 PyErr_SetString(PyExc_ValueError, |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1155 "Stop argument for islice() 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
|
1156 return NULL; |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1157 } |
|
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1158 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1159 } |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1160 if (start<0 || stop<-1) { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1161 PyErr_SetString(PyExc_ValueError, |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1162 "Indices for islice() must be non-negative integers or None."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1163 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1164 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1165 |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1166 if (a3 != NULL) { |
|
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1167 if (a3 != Py_None) |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1168 step = PyInt_AsSsize_t(a3); |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1169 if (step == -1 && PyErr_Occurred()) |
|
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1170 PyErr_Clear(); |
|
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1171 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1172 if (step<1) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1173 PyErr_SetString(PyExc_ValueError, |
|
34108
1d1d6377acb1
Added optional None arguments to itertools.islice().
Raymond Hettinger <python@rcn.com>
parents:
33779
diff
changeset
|
1174 "Step for islice() must be a positive integer or None."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1175 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1176 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1177 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1178 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1179 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1180 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1181 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1182 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1183 /* create isliceobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1184 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
|
1185 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1186 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1187 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1188 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1189 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1190 lz->next = start; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1191 lz->stop = stop; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1192 lz->step = step; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1193 lz->cnt = 0L; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1194 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1195 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1196 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1197 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1198 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1199 islice_dealloc(isliceobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1200 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1201 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1202 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1203 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1204 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1205 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1206 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1207 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
|
1208 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1209 Py_VISIT(lz->it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1210 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1211 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1212 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1213 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1214 islice_next(isliceobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1215 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1216 PyObject *item; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1217 PyObject *it = lz->it; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
1218 Py_ssize_t oldnext; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1219 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1220 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1221 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1222 iternext = *Py_TYPE(it)->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1223 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
|
1224 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1225 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1226 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1227 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1228 lz->cnt++; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1229 } |
|
28929
92a1e585abf7
SF bug #730685: itertools.islice stop argument is not optional
Raymond Hettinger <python@rcn.com>
parents:
28601
diff
changeset
|
1230 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
|
1231 return NULL; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1232 assert(PyIter_Check(it)); |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
1233 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1234 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1235 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1236 lz->cnt++; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1237 oldnext = lz->next; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1238 lz->next += lz->step; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1239 if (lz->next < oldnext) /* Check for overflow */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1240 lz->next = lz->stop; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1241 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1242 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1243 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1244 PyDoc_STRVAR(islice_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1245 "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
|
1246 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1247 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
|
1248 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
|
1249 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
|
1250 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
|
1251 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
|
1252 but returns an iterator."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1253 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1254 static PyTypeObject islice_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
1255 PyVarObject_HEAD_INIT(NULL, 0) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1256 "itertools.islice", /* tp_name */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1257 sizeof(isliceobject), /* tp_basicsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1258 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1259 /* methods */ |
| 27769 | 1260 (destructor)islice_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1261 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1262 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1263 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1264 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1265 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1266 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1267 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1268 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1269 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1270 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1271 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1272 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1273 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1274 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1275 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
|
1276 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1277 islice_doc, /* tp_doc */ |
| 1278 (traverseproc)islice_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1279 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1280 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1281 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1282 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1283 (iternextfunc)islice_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1284 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1285 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1286 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1287 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1288 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1289 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1290 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1291 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1292 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1293 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1294 islice_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1295 PyObject_GC_Del, /* tp_free */ |
|
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 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1298 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1299 /* starmap object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1300 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1301 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1302 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1303 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1304 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1305 } starmapobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1306 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1307 static PyTypeObject starmap_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1308 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1309 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1310 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
|
1311 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1312 PyObject *func, *seq; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1313 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1314 starmapobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1315 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
1316 if (type == &starmap_type && !_PyArg_NoKeywords("starmap()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1317 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1318 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1319 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
|
1320 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1321 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1322 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1323 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1324 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1325 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1326 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1327 /* create starmapobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1328 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
|
1329 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1330 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1331 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1332 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1333 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1334 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1335 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1336 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1337 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1338 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1339 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1340 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1341 starmap_dealloc(starmapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1342 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1343 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1344 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1345 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1346 Py_TYPE(lz)->tp_free(lz); |
|
27570
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 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1350 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
|
1351 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1352 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1353 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1354 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1355 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1356 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1357 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1358 starmap_next(starmapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1359 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1360 PyObject *args; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1361 PyObject *result; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1362 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1363 |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
1364 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1365 args = (*Py_TYPE(it)->tp_iternext)(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1366 if (args == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1367 return NULL; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1368 if (!PyTuple_CheckExact(args)) { |
|
44717
d0f7963cf8b0
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1369 PyObject *newargs = PySequence_Tuple(args); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1370 Py_DECREF(args); |
|
44717
d0f7963cf8b0
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1371 if (newargs == NULL) |
|
d0f7963cf8b0
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1372 return NULL; |
|
d0f7963cf8b0
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1373 args = newargs; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1374 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1375 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
|
1376 Py_DECREF(args); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1377 return result; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1378 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1379 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1380 PyDoc_STRVAR(starmap_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1381 "starmap(function, sequence) --> starmap object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1382 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1383 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
|
1384 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
|
1385 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1386 static PyTypeObject starmap_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
1387 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 1388 "itertools.starmap", /* tp_name */ |
| 1389 sizeof(starmapobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1390 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1391 /* methods */ |
| 27769 | 1392 (destructor)starmap_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1393 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1394 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1395 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1396 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1397 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1398 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1399 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1400 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1401 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1402 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1403 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1404 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1405 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1406 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1407 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
|
1408 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 1409 starmap_doc, /* tp_doc */ |
| 1410 (traverseproc)starmap_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1411 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1412 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1413 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1414 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 1415 (iternextfunc)starmap_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1416 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1417 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1418 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1419 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1420 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1421 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1422 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1423 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1424 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1425 0, /* tp_alloc */ |
| 27769 | 1426 starmap_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1427 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1428 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1429 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1430 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1431 /* imap object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1432 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1433 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1434 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1435 PyObject *iters; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1436 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1437 } imapobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1438 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1439 static PyTypeObject imap_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1440 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1441 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1442 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
|
1443 { |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1444 PyObject *it, *iters, *func; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1445 imapobject *lz; |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1446 Py_ssize_t numargs, i; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1447 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
1448 if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1449 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1450 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1451 numargs = PyTuple_Size(args); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1452 if (numargs < 2) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1453 PyErr_SetString(PyExc_TypeError, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1454 "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
|
1455 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1456 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1457 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1458 iters = PyTuple_New(numargs-1); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1459 if (iters == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1460 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1461 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1462 for (i=1 ; i<numargs ; i++) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1463 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1464 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
|
1465 if (it == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1466 Py_DECREF(iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1467 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1468 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1469 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
|
1470 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1471 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1472 /* create imapobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1473 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
|
1474 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1475 Py_DECREF(iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1476 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1477 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1478 lz->iters = iters; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1479 func = PyTuple_GET_ITEM(args, 0); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1480 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1481 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1482 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1483 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1484 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1485 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1486 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1487 imap_dealloc(imapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1488 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1489 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1490 Py_XDECREF(lz->iters); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1491 Py_XDECREF(lz->func); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1492 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1493 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1494 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1495 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1496 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
|
1497 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1498 Py_VISIT(lz->iters); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
1499 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1500 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1501 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1502 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1503 /* |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1504 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
|
1505 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
|
1506 the following reasons: |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1507 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1508 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
|
1509 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
|
1510 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
|
1511 infinite iterators like count() and repeat() (for supplying sequential |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1512 or constant arguments to a function). |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1513 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1514 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
|
1515 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
|
1516 should not pass silently by automatically supplying None. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1517 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1518 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
|
1519 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
|
1520 None. |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1521 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1522 4) If a need does arise, it can be met by __builtins__.map() or by |
| 29535 | 1523 writing: chain(iterable, repeat(None)). |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1524 |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1525 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
|
1526 */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1527 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1528 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1529 imap_next(imapobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1530 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1531 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
|
1532 PyObject *argtuple; |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1533 PyObject *result; |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1534 Py_ssize_t numargs, i; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1535 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1536 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
|
1537 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
|
1538 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
|
1539 return NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1540 |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1541 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
|
1542 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
|
1543 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
|
1544 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
|
1545 return NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1546 } |
|
27748
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1547 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
|
1548 } |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
1549 if (lz->func == Py_None) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1550 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
|
1551 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
|
1552 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
|
1553 return result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1554 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1555 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1556 PyDoc_STRVAR(imap_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1557 "imap(func, *iterables) --> imap object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1558 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1559 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
|
1560 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
|
1561 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
|
1562 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
|
1563 iterables."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1564 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1565 static PyTypeObject imap_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
1566 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 1567 "itertools.imap", /* tp_name */ |
| 1568 sizeof(imapobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1569 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1570 /* methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1571 (destructor)imap_dealloc, /* tp_dealloc */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1572 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1573 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1574 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1575 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1576 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1577 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1578 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1579 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1580 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1581 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1582 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1583 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1584 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1585 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1586 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
|
1587 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1588 imap_doc, /* tp_doc */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1589 (traverseproc)imap_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1590 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1591 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1592 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1593 PyObject_SelfIter, /* tp_iter */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1594 (iternextfunc)imap_next, /* tp_iternext */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1595 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1596 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1597 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1598 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1599 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1600 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1601 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1602 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1603 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1604 0, /* tp_alloc */ |
| 27769 | 1605 imap_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1606 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1607 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1608 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1609 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1610 /* chain object ************************************************************/ |
|
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 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1613 PyObject_HEAD |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1614 PyObject *source; /* Iterator over input iterables */ |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1615 PyObject *active; /* Currently running input iterator */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1616 } chainobject; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1617 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1618 static PyTypeObject chain_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1619 |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1620 static PyObject * |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1621 chain_new_internal(PyTypeObject *type, PyObject *source) |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1622 { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1623 chainobject *lz; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1624 |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1625 lz = (chainobject *)type->tp_alloc(type, 0); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1626 if (lz == NULL) { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1627 Py_DECREF(source); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1628 return NULL; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1629 } |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1630 |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1631 lz->source = source; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1632 lz->active = NULL; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1633 return (PyObject *)lz; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1634 } |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1635 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1636 static PyObject * |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1637 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
|
1638 { |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1639 PyObject *source; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1640 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
1641 if (type == &chain_type && !_PyArg_NoKeywords("chain()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
1642 return NULL; |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1643 |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1644 source = PyObject_GetIter(args); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1645 if (source == NULL) |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1646 return NULL; |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1647 |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1648 return chain_new_internal(type, source); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1649 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1650 |
|
45563
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1651 static PyObject * |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1652 chain_new_from_iterable(PyTypeObject *type, PyObject *arg) |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1653 { |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1654 PyObject *source; |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1655 |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1656 source = PyObject_GetIter(arg); |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1657 if (source == NULL) |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1658 return NULL; |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1659 |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1660 return chain_new_internal(type, source); |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1661 } |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1662 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1663 static void |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1664 chain_dealloc(chainobject *lz) |
|
27570
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 PyObject_GC_UnTrack(lz); |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1667 Py_XDECREF(lz->active); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1668 Py_XDECREF(lz->source); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
1669 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1670 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1671 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1672 static int |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1673 chain_traverse(chainobject *lz, visitproc visit, void *arg) |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1674 { |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1675 Py_VISIT(lz->source); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1676 Py_VISIT(lz->active); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1677 return 0; |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1678 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
1679 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1680 static PyObject * |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1681 chain_next(chainobject *lz) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1682 { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1683 PyObject *item; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1684 |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1685 if (lz->source == NULL) |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1686 return NULL; /* already stopped */ |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1687 |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1688 if (lz->active == NULL) { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1689 PyObject *iterable = PyIter_Next(lz->source); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1690 if (iterable == NULL) { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1691 Py_CLEAR(lz->source); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1692 return NULL; /* no more input sources */ |
|
32010
544f2172363d
SF #950057: itertools.chain doesn't "process" exceptions as they occur
Raymond Hettinger <python@rcn.com>
parents:
31909
diff
changeset
|
1693 } |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1694 lz->active = PyObject_GetIter(iterable); |
|
45658
8a5c75efae4c
Fix refleak in chain().
Raymond Hettinger <python@rcn.com>
parents:
45651
diff
changeset
|
1695 Py_DECREF(iterable); |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1696 if (lz->active == NULL) { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1697 Py_CLEAR(lz->source); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1698 return NULL; /* input not iterable */ |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1699 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1700 } |
|
45562
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1701 item = PyIter_Next(lz->active); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1702 if (item != NULL) |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1703 return item; |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1704 if (PyErr_Occurred()) { |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1705 if (PyErr_ExceptionMatches(PyExc_StopIteration)) |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1706 PyErr_Clear(); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1707 else |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1708 return NULL; /* input raised an exception */ |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1709 } |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1710 Py_CLEAR(lz->active); |
|
43e084847e53
Have itertools.chain() consume its inputs lazily instead of building a tuple of iterators at the outset.
Raymond Hettinger <python@rcn.com>
parents:
45547
diff
changeset
|
1711 return chain_next(lz); /* recurse and use next active */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1712 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1713 |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1714 PyDoc_STRVAR(chain_doc, |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1715 "chain(*iterables) --> chain object\n\ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1716 \n\ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1717 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
|
1718 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
|
1719 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
|
1720 |
|
45563
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1721 PyDoc_STRVAR(chain_from_iterable_doc, |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1722 "chain.from_iterable(iterable) --> chain object\n\ |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1723 \n\ |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1724 Alternate chain() contructor taking a single iterable argument\n\ |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1725 that evaluates lazily."); |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1726 |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1727 static PyMethodDef chain_methods[] = { |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1728 {"from_iterable", (PyCFunction) chain_new_from_iterable, METH_O | METH_CLASS, |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1729 chain_from_iterable_doc}, |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1730 {NULL, NULL} /* sentinel */ |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1731 }; |
|
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1732 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
1733 static PyTypeObject chain_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
1734 PyVarObject_HEAD_INIT(NULL, 0) |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1735 "itertools.chain", /* tp_name */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1736 sizeof(chainobject), /* tp_basicsize */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1737 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1738 /* methods */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1739 (destructor)chain_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1740 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1741 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1742 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1743 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1744 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1745 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1746 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1747 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1748 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1749 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1750 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1751 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1752 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1753 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1754 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
|
1755 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1756 chain_doc, /* tp_doc */ |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1757 (traverseproc)chain_traverse, /* tp_traverse */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1758 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1759 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1760 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
1761 PyObject_SelfIter, /* tp_iter */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1762 (iternextfunc)chain_next, /* tp_iternext */ |
|
45563
7da36b49c9e5
Add alternate constructor for itertools.chain().
Raymond Hettinger <python@rcn.com>
parents:
45562
diff
changeset
|
1763 chain_methods, /* tp_methods */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1764 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1765 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1766 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1767 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1768 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1769 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1770 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1771 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
1772 0, /* tp_alloc */ |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
1773 chain_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1774 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1775 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1776 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1777 |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1778 /* product object ************************************************************/ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1779 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1780 typedef struct { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1781 PyObject_HEAD |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1782 PyObject *pools; /* tuple of pool tuples */ |
| 45441 | 1783 Py_ssize_t *indices; /* one index per pool */ |
| 1784 PyObject *result; /* most recently returned result tuple */ | |
| 1785 int stopped; /* set to 1 when the product iterator is exhausted */ | |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1786 } productobject; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1787 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1788 static PyTypeObject product_type; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1789 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1790 static PyObject * |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1791 product_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1792 { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1793 productobject *lz; |
|
45567
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1794 Py_ssize_t nargs, npools, repeat=1; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1795 PyObject *pools = NULL; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1796 Py_ssize_t *indices = NULL; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1797 Py_ssize_t i; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1798 |
|
45567
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1799 if (kwds != NULL) { |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1800 char *kwlist[] = {"repeat", 0}; |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1801 PyObject *tmpargs = PyTuple_New(0); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1802 if (tmpargs == NULL) |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1803 return NULL; |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1804 if (!PyArg_ParseTupleAndKeywords(tmpargs, kwds, "|n:product", kwlist, &repeat)) { |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1805 Py_DECREF(tmpargs); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1806 return NULL; |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1807 } |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1808 Py_DECREF(tmpargs); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1809 if (repeat < 0) { |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1810 PyErr_SetString(PyExc_ValueError, |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1811 "repeat argument cannot be negative"); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1812 return NULL; |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1813 } |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1814 } |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1815 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1816 assert(PyTuple_Check(args)); |
|
45567
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1817 nargs = (repeat == 0) ? 0 : PyTuple_GET_SIZE(args); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1818 npools = nargs * repeat; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1819 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1820 indices = PyMem_Malloc(npools * sizeof(Py_ssize_t)); |
|
45606
f72b2de997b9
Simplify code for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45567
diff
changeset
|
1821 if (indices == NULL) { |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1822 PyErr_NoMemory(); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1823 goto error; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1824 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1825 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1826 pools = PyTuple_New(npools); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1827 if (pools == NULL) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1828 goto error; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1829 |
|
45567
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1830 for (i=0; i < nargs ; ++i) { |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1831 PyObject *item = PyTuple_GET_ITEM(args, i); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1832 PyObject *pool = PySequence_Tuple(item); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1833 if (pool == NULL) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1834 goto error; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1835 PyTuple_SET_ITEM(pools, i, pool); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1836 indices[i] = 0; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1837 } |
|
45567
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1838 for ( ; i < npools; ++i) { |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1839 PyObject *pool = PyTuple_GET_ITEM(pools, i - nargs); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1840 Py_INCREF(pool); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1841 PyTuple_SET_ITEM(pools, i, pool); |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1842 indices[i] = 0; |
|
10962b3f77a9
Handle the repeat keyword argument for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45563
diff
changeset
|
1843 } |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1844 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1845 /* create productobject structure */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1846 lz = (productobject *)type->tp_alloc(type, 0); |
| 45540 | 1847 if (lz == NULL) |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1848 goto error; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1849 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1850 lz->pools = pools; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1851 lz->indices = indices; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1852 lz->result = NULL; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1853 lz->stopped = 0; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1854 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1855 return (PyObject *)lz; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1856 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1857 error: |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1858 if (indices != NULL) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1859 PyMem_Free(indices); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1860 Py_XDECREF(pools); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1861 return NULL; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1862 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1863 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1864 static void |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1865 product_dealloc(productobject *lz) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1866 { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1867 PyObject_GC_UnTrack(lz); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1868 Py_XDECREF(lz->pools); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1869 Py_XDECREF(lz->result); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1870 PyMem_Free(lz->indices); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1871 Py_TYPE(lz)->tp_free(lz); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1872 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1873 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1874 static int |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1875 product_traverse(productobject *lz, visitproc visit, void *arg) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1876 { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1877 Py_VISIT(lz->pools); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1878 Py_VISIT(lz->result); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1879 return 0; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1880 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1881 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1882 static PyObject * |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1883 product_next(productobject *lz) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1884 { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1885 PyObject *pool; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1886 PyObject *elem; |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1887 PyObject *oldelem; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1888 PyObject *pools = lz->pools; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1889 PyObject *result = lz->result; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1890 Py_ssize_t npools = PyTuple_GET_SIZE(pools); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1891 Py_ssize_t i; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1892 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1893 if (lz->stopped) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1894 return NULL; |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1895 |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1896 if (result == NULL) { |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1897 /* On the first pass, return an initial tuple filled with the |
|
45651
e44c745bec0b
Beef-up docs and tests for itertools. Fix-up end-case for product().
Raymond Hettinger <python@rcn.com>
parents:
45607
diff
changeset
|
1898 first element from each pool. */ |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1899 result = PyTuple_New(npools); |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1900 if (result == NULL) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1901 goto empty; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1902 lz->result = result; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1903 for (i=0; i < npools; i++) { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1904 pool = PyTuple_GET_ITEM(pools, i); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1905 if (PyTuple_GET_SIZE(pool) == 0) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1906 goto empty; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1907 elem = PyTuple_GET_ITEM(pool, 0); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1908 Py_INCREF(elem); |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1909 PyTuple_SET_ITEM(result, i, elem); |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1910 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1911 } else { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1912 Py_ssize_t *indices = lz->indices; |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1913 |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1914 /* Copy the previous result tuple or re-use it if available */ |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1915 if (Py_REFCNT(result) > 1) { |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1916 PyObject *old_result = result; |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1917 result = PyTuple_New(npools); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1918 if (result == NULL) |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1919 goto empty; |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1920 lz->result = result; |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1921 for (i=0; i < npools; i++) { |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1922 elem = PyTuple_GET_ITEM(old_result, i); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1923 Py_INCREF(elem); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1924 PyTuple_SET_ITEM(result, i, elem); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1925 } |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1926 Py_DECREF(old_result); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1927 } |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1928 /* Now, we've got the only copy so we can update it in-place */ |
|
45607
96ca8c7cedc4
Handle 0-tuples which can be singletons.
Raymond Hettinger <python@rcn.com>
parents:
45606
diff
changeset
|
1929 assert (npools==0 || Py_REFCNT(result) == 1); |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1930 |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1931 /* Update the pool indices right-to-left. Only advance to the |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1932 next pool when the previous one rolls-over */ |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1933 for (i=npools-1 ; i >= 0 ; i--) { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1934 pool = PyTuple_GET_ITEM(pools, i); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1935 indices[i]++; |
|
45606
f72b2de997b9
Simplify code for itertools.product().
Raymond Hettinger <python@rcn.com>
parents:
45567
diff
changeset
|
1936 if (indices[i] == PyTuple_GET_SIZE(pool)) { |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1937 /* Roll-over and advance to next pool */ |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1938 indices[i] = 0; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1939 elem = PyTuple_GET_ITEM(pool, 0); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1940 Py_INCREF(elem); |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1941 oldelem = PyTuple_GET_ITEM(result, i); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1942 PyTuple_SET_ITEM(result, i, elem); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1943 Py_DECREF(oldelem); |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1944 } else { |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1945 /* No rollover. Just increment and stop here. */ |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1946 elem = PyTuple_GET_ITEM(pool, indices[i]); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1947 Py_INCREF(elem); |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1948 oldelem = PyTuple_GET_ITEM(result, i); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1949 PyTuple_SET_ITEM(result, i, elem); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1950 Py_DECREF(oldelem); |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1951 break; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1952 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1953 } |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1954 |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1955 /* If i is negative, then the indices have all rolled-over |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1956 and we're done. */ |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1957 if (i < 0) |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1958 goto empty; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1959 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1960 |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1961 Py_INCREF(result); |
|
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1962 return result; |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1963 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1964 empty: |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1965 lz->stopped = 1; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1966 return NULL; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1967 } |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1968 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1969 PyDoc_STRVAR(product_doc, |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1970 "product(*iterables) --> product object\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1971 \n\ |
|
45438
11a73fbbf86f
Improve the implementation of itertools.product()
Raymond Hettinger <python@rcn.com>
parents:
45425
diff
changeset
|
1972 Cartesian product of input iterables. Equivalent to nested for-loops.\n\n\ |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1973 For example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1974 The leftmost iterators are in the outermost for-loop, so the output tuples\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1975 cycle in a manner similar to an odometer (with the rightmost element changing\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1976 on every iteration).\n\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1977 product('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\n\ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1978 product((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ..."); |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1979 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1980 static PyTypeObject product_type = { |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1981 PyVarObject_HEAD_INIT(NULL, 0) |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1982 "itertools.product", /* tp_name */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1983 sizeof(productobject), /* tp_basicsize */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1984 0, /* tp_itemsize */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1985 /* methods */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1986 (destructor)product_dealloc, /* tp_dealloc */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1987 0, /* tp_print */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1988 0, /* tp_getattr */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1989 0, /* tp_setattr */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1990 0, /* tp_compare */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1991 0, /* tp_repr */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1992 0, /* tp_as_number */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1993 0, /* tp_as_sequence */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1994 0, /* tp_as_mapping */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1995 0, /* tp_hash */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1996 0, /* tp_call */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1997 0, /* tp_str */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1998 PyObject_GenericGetAttr, /* tp_getattro */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
1999 0, /* tp_setattro */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2000 0, /* tp_as_buffer */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2001 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2002 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2003 product_doc, /* tp_doc */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2004 (traverseproc)product_traverse, /* tp_traverse */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2005 0, /* tp_clear */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2006 0, /* tp_richcompare */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2007 0, /* tp_weaklistoffset */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2008 PyObject_SelfIter, /* tp_iter */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2009 (iternextfunc)product_next, /* tp_iternext */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2010 0, /* tp_methods */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2011 0, /* tp_members */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2012 0, /* tp_getset */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2013 0, /* tp_base */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2014 0, /* tp_dict */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2015 0, /* tp_descr_get */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2016 0, /* tp_descr_set */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2017 0, /* tp_dictoffset */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2018 0, /* tp_init */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2019 0, /* tp_alloc */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2020 product_new, /* tp_new */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2021 PyObject_GC_Del, /* tp_free */ |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2022 }; |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2023 |
|
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
2024 |
|
45539
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2025 /* combinations object ************************************************************/ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2026 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2027 typedef struct { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2028 PyObject_HEAD |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2029 PyObject *pool; /* input converted to a tuple */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2030 Py_ssize_t *indices; /* one index per result element */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2031 PyObject *result; /* most recently returned result tuple */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2032 Py_ssize_t r; /* size of result tuple */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2033 int stopped; /* set to 1 when the combinations iterator is exhausted */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2034 } combinationsobject; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2035 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2036 static PyTypeObject combinations_type; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2037 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2038 static PyObject * |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2039 combinations_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2040 { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2041 combinationsobject *co; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2042 Py_ssize_t n; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2043 Py_ssize_t r; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2044 PyObject *pool = NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2045 PyObject *iterable = NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2046 Py_ssize_t *indices = NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2047 Py_ssize_t i; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2048 static char *kwargs[] = {"iterable", "r", NULL}; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2049 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2050 if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:combinations", kwargs, |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2051 &iterable, &r)) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2052 return NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2053 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2054 pool = PySequence_Tuple(iterable); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2055 if (pool == NULL) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2056 goto error; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2057 n = PyTuple_GET_SIZE(pool); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2058 if (r < 0) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2059 PyErr_SetString(PyExc_ValueError, "r must be non-negative"); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2060 goto error; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2061 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2062 if (r > n) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2063 PyErr_SetString(PyExc_ValueError, "r cannot be bigger than the iterable"); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2064 goto error; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2065 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2066 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2067 indices = PyMem_Malloc(r * sizeof(Py_ssize_t)); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2068 if (indices == NULL) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2069 PyErr_NoMemory(); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2070 goto error; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2071 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2072 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2073 for (i=0 ; i<r ; i++) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2074 indices[i] = i; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2075 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2076 /* create combinationsobject structure */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2077 co = (combinationsobject *)type->tp_alloc(type, 0); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2078 if (co == NULL) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2079 goto error; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2080 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2081 co->pool = pool; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2082 co->indices = indices; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2083 co->result = NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2084 co->r = r; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2085 co->stopped = 0; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2086 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2087 return (PyObject *)co; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2088 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2089 error: |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2090 if (indices != NULL) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2091 PyMem_Free(indices); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2092 Py_XDECREF(pool); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2093 return NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2094 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2095 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2096 static void |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2097 combinations_dealloc(combinationsobject *co) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2098 { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2099 PyObject_GC_UnTrack(co); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2100 Py_XDECREF(co->pool); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2101 Py_XDECREF(co->result); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2102 PyMem_Free(co->indices); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2103 Py_TYPE(co)->tp_free(co); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2104 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2105 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2106 static int |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2107 combinations_traverse(combinationsobject *co, visitproc visit, void *arg) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2108 { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2109 Py_VISIT(co->pool); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2110 Py_VISIT(co->result); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2111 return 0; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2112 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2113 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2114 static PyObject * |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2115 combinations_next(combinationsobject *co) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2116 { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2117 PyObject *elem; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2118 PyObject *oldelem; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2119 PyObject *pool = co->pool; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2120 Py_ssize_t *indices = co->indices; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2121 PyObject *result = co->result; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2122 Py_ssize_t n = PyTuple_GET_SIZE(pool); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2123 Py_ssize_t r = co->r; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2124 Py_ssize_t i, j, index; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2125 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2126 if (co->stopped) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2127 return NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2128 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2129 if (result == NULL) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2130 /* On the first pass, initialize result tuple using the indices */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2131 result = PyTuple_New(r); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2132 if (result == NULL) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2133 goto empty; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2134 co->result = result; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2135 for (i=0; i<r ; i++) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2136 index = indices[i]; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2137 elem = PyTuple_GET_ITEM(pool, index); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2138 Py_INCREF(elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2139 PyTuple_SET_ITEM(result, i, elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2140 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2141 } else { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2142 /* Copy the previous result tuple or re-use it if available */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2143 if (Py_REFCNT(result) > 1) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2144 PyObject *old_result = result; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2145 result = PyTuple_New(r); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2146 if (result == NULL) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2147 goto empty; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2148 co->result = result; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2149 for (i=0; i<r ; i++) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2150 elem = PyTuple_GET_ITEM(old_result, i); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2151 Py_INCREF(elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2152 PyTuple_SET_ITEM(result, i, elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2153 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2154 Py_DECREF(old_result); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2155 } |
|
45547
96d5a157316e
The empty tuple is usually a singleton with a much higher refcnt than 1
Christian Heimes <christian@cheimes.de>
parents:
45540
diff
changeset
|
2156 /* Now, we've got the only copy so we can update it in-place |
|
96d5a157316e
The empty tuple is usually a singleton with a much higher refcnt than 1
Christian Heimes <christian@cheimes.de>
parents:
45540
diff
changeset
|
2157 * CPython's empty tuple is a singleton and cached in |
|
96d5a157316e
The empty tuple is usually a singleton with a much higher refcnt than 1
Christian Heimes <christian@cheimes.de>
parents:
45540
diff
changeset
|
2158 * PyTuple's freelist. |
|
96d5a157316e
The empty tuple is usually a singleton with a much higher refcnt than 1
Christian Heimes <christian@cheimes.de>
parents:
45540
diff
changeset
|
2159 */ |
|
96d5a157316e
The empty tuple is usually a singleton with a much higher refcnt than 1
Christian Heimes <christian@cheimes.de>
parents:
45540
diff
changeset
|
2160 assert(r == 0 || Py_REFCNT(result) == 1); |
|
45539
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2161 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2162 /* Scan indices right-to-left until finding one that is not |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2163 at its maximum (i + n - r). */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2164 for (i=r-1 ; i >= 0 && indices[i] == i+n-r ; i--) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2165 ; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2166 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2167 /* If i is negative, then the indices are all at |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2168 their maximum value and we're done. */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2169 if (i < 0) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2170 goto empty; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2171 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2172 /* Increment the current index which we know is not at its |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2173 maximum. Then move back to the right setting each index |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2174 to its lowest possible value (one higher than the index |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2175 to its left -- this maintains the sort order invariant). */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2176 indices[i]++; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2177 for (j=i+1 ; j<r ; j++) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2178 indices[j] = indices[j-1] + 1; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2179 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2180 /* Update the result tuple for the new indices |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2181 starting with i, the leftmost index that changed */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2182 for ( ; i<r ; i++) { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2183 index = indices[i]; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2184 elem = PyTuple_GET_ITEM(pool, index); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2185 Py_INCREF(elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2186 oldelem = PyTuple_GET_ITEM(result, i); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2187 PyTuple_SET_ITEM(result, i, elem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2188 Py_DECREF(oldelem); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2189 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2190 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2191 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2192 Py_INCREF(result); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2193 return result; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2194 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2195 empty: |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2196 co->stopped = 1; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2197 return NULL; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2198 } |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2199 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2200 PyDoc_STRVAR(combinations_doc, |
|
47544
f4989516b4d6
#2536: fix itertools.permutations and itertools.combinations docstrings.
Georg Brandl <georg@python.org>
parents:
47527
diff
changeset
|
2201 "combinations(iterable[, r]) --> combinations object\n\ |
|
45539
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2202 \n\ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2203 Return successive r-length combinations of elements in the iterable.\n\n\ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2204 combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)"); |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2205 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2206 static PyTypeObject combinations_type = { |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2207 PyVarObject_HEAD_INIT(NULL, 0) |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2208 "itertools.combinations", /* tp_name */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2209 sizeof(combinationsobject), /* tp_basicsize */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2210 0, /* tp_itemsize */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2211 /* methods */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2212 (destructor)combinations_dealloc, /* tp_dealloc */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2213 0, /* tp_print */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2214 0, /* tp_getattr */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2215 0, /* tp_setattr */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2216 0, /* tp_compare */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2217 0, /* tp_repr */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2218 0, /* tp_as_number */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2219 0, /* tp_as_sequence */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2220 0, /* tp_as_mapping */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2221 0, /* tp_hash */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2222 0, /* tp_call */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2223 0, /* tp_str */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2224 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2225 0, /* tp_setattro */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2226 0, /* tp_as_buffer */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2227 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2228 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2229 combinations_doc, /* tp_doc */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2230 (traverseproc)combinations_traverse, /* tp_traverse */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2231 0, /* tp_clear */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2232 0, /* tp_richcompare */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2233 0, /* tp_weaklistoffset */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2234 PyObject_SelfIter, /* tp_iter */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2235 (iternextfunc)combinations_next, /* tp_iternext */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2236 0, /* tp_methods */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2237 0, /* tp_members */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2238 0, /* tp_getset */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2239 0, /* tp_base */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2240 0, /* tp_dict */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2241 0, /* tp_descr_get */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2242 0, /* tp_descr_set */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2243 0, /* tp_dictoffset */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2244 0, /* tp_init */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2245 0, /* tp_alloc */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2246 combinations_new, /* tp_new */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2247 PyObject_GC_Del, /* tp_free */ |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2248 }; |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2249 |
|
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
2250 |
|
45675
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2251 /* permutations object ************************************************************ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2252 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2253 def permutations(iterable, r=None): |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2254 'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)' |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2255 pool = tuple(iterable) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2256 n = len(pool) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2257 r = n if r is None else r |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2258 indices = range(n) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2259 cycles = range(n-r+1, n+1)[::-1] |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2260 yield tuple(pool[i] for i in indices[:r]) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2261 while n: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2262 for i in reversed(range(r)): |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2263 cycles[i] -= 1 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2264 if cycles[i] == 0: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2265 indices[i:] = indices[i+1:] + indices[i:i+1] |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2266 cycles[i] = n - i |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2267 else: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2268 j = cycles[i] |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2269 indices[i], indices[-j] = indices[-j], indices[i] |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2270 yield tuple(pool[i] for i in indices[:r]) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2271 break |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2272 else: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2273 return |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2274 */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2275 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2276 typedef struct { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2277 PyObject_HEAD |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2278 PyObject *pool; /* input converted to a tuple */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2279 Py_ssize_t *indices; /* one index per element in the pool */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2280 Py_ssize_t *cycles; /* one rollover counter per element in the result */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2281 PyObject *result; /* most recently returned result tuple */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2282 Py_ssize_t r; /* size of result tuple */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2283 int stopped; /* set to 1 when the permutations iterator is exhausted */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2284 } permutationsobject; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2285 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2286 static PyTypeObject permutations_type; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2287 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2288 static PyObject * |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2289 permutations_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2290 { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2291 permutationsobject *po; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2292 Py_ssize_t n; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2293 Py_ssize_t r; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2294 PyObject *robj = Py_None; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2295 PyObject *pool = NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2296 PyObject *iterable = NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2297 Py_ssize_t *indices = NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2298 Py_ssize_t *cycles = NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2299 Py_ssize_t i; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2300 static char *kwargs[] = {"iterable", "r", NULL}; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2301 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2302 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:permutations", kwargs, |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2303 &iterable, &robj)) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2304 return NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2305 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2306 pool = PySequence_Tuple(iterable); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2307 if (pool == NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2308 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2309 n = PyTuple_GET_SIZE(pool); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2310 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2311 r = n; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2312 if (robj != Py_None) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2313 r = PyInt_AsSsize_t(robj); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2314 if (r == -1 && PyErr_Occurred()) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2315 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2316 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2317 if (r < 0) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2318 PyErr_SetString(PyExc_ValueError, "r must be non-negative"); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2319 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2320 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2321 if (r > n) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2322 PyErr_SetString(PyExc_ValueError, "r cannot be bigger than the iterable"); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2323 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2324 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2325 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2326 indices = PyMem_Malloc(n * sizeof(Py_ssize_t)); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2327 cycles = PyMem_Malloc(r * sizeof(Py_ssize_t)); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2328 if (indices == NULL || cycles == NULL) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2329 PyErr_NoMemory(); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2330 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2331 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2332 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2333 for (i=0 ; i<n ; i++) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2334 indices[i] = i; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2335 for (i=0 ; i<r ; i++) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2336 cycles[i] = n - i; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2337 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2338 /* create permutationsobject structure */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2339 po = (permutationsobject *)type->tp_alloc(type, 0); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2340 if (po == NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2341 goto error; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2342 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2343 po->pool = pool; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2344 po->indices = indices; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2345 po->cycles = cycles; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2346 po->result = NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2347 po->r = r; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2348 po->stopped = 0; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2349 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2350 return (PyObject *)po; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2351 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2352 error: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2353 if (indices != NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2354 PyMem_Free(indices); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2355 if (cycles != NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2356 PyMem_Free(cycles); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2357 Py_XDECREF(pool); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2358 return NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2359 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2360 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2361 static void |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2362 permutations_dealloc(permutationsobject *po) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2363 { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2364 PyObject_GC_UnTrack(po); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2365 Py_XDECREF(po->pool); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2366 Py_XDECREF(po->result); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2367 PyMem_Free(po->indices); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2368 PyMem_Free(po->cycles); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2369 Py_TYPE(po)->tp_free(po); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2370 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2371 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2372 static int |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2373 permutations_traverse(permutationsobject *po, visitproc visit, void *arg) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2374 { |
| 45676 | 2375 Py_VISIT(po->pool); |
| 2376 Py_VISIT(po->result); | |
|
45675
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2377 return 0; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2378 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2379 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2380 static PyObject * |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2381 permutations_next(permutationsobject *po) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2382 { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2383 PyObject *elem; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2384 PyObject *oldelem; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2385 PyObject *pool = po->pool; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2386 Py_ssize_t *indices = po->indices; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2387 Py_ssize_t *cycles = po->cycles; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2388 PyObject *result = po->result; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2389 Py_ssize_t n = PyTuple_GET_SIZE(pool); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2390 Py_ssize_t r = po->r; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2391 Py_ssize_t i, j, k, index; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2392 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2393 if (po->stopped) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2394 return NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2395 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2396 if (result == NULL) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2397 /* On the first pass, initialize result tuple using the indices */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2398 result = PyTuple_New(r); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2399 if (result == NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2400 goto empty; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2401 po->result = result; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2402 for (i=0; i<r ; i++) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2403 index = indices[i]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2404 elem = PyTuple_GET_ITEM(pool, index); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2405 Py_INCREF(elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2406 PyTuple_SET_ITEM(result, i, elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2407 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2408 } else { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2409 if (n == 0) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2410 goto empty; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2411 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2412 /* Copy the previous result tuple or re-use it if available */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2413 if (Py_REFCNT(result) > 1) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2414 PyObject *old_result = result; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2415 result = PyTuple_New(r); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2416 if (result == NULL) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2417 goto empty; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2418 po->result = result; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2419 for (i=0; i<r ; i++) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2420 elem = PyTuple_GET_ITEM(old_result, i); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2421 Py_INCREF(elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2422 PyTuple_SET_ITEM(result, i, elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2423 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2424 Py_DECREF(old_result); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2425 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2426 /* Now, we've got the only copy so we can update it in-place */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2427 assert(r == 0 || Py_REFCNT(result) == 1); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2428 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2429 /* Decrement rightmost cycle, moving leftward upon zero rollover */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2430 for (i=r-1 ; i>=0 ; i--) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2431 cycles[i] -= 1; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2432 if (cycles[i] == 0) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2433 /* rotatation: indices[i:] = indices[i+1:] + indices[i:i+1] */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2434 index = indices[i]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2435 for (j=i ; j<n-1 ; j++) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2436 indices[j] = indices[j+1]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2437 indices[n-1] = index; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2438 cycles[i] = n - i; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2439 } else { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2440 j = cycles[i]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2441 index = indices[i]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2442 indices[i] = indices[n-j]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2443 indices[n-j] = index; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2444 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2445 for (k=i; k<r ; k++) { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2446 /* start with i, the leftmost element that changed */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2447 /* yield tuple(pool[k] for k in indices[:r]) */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2448 index = indices[k]; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2449 elem = PyTuple_GET_ITEM(pool, index); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2450 Py_INCREF(elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2451 oldelem = PyTuple_GET_ITEM(result, k); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2452 PyTuple_SET_ITEM(result, k, elem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2453 Py_DECREF(oldelem); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2454 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2455 break; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2456 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2457 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2458 /* If i is negative, then the cycles have all |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2459 rolled-over and we're done. */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2460 if (i < 0) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2461 goto empty; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2462 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2463 Py_INCREF(result); |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2464 return result; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2465 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2466 empty: |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2467 po->stopped = 1; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2468 return NULL; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2469 } |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2470 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2471 PyDoc_STRVAR(permutations_doc, |
|
47544
f4989516b4d6
#2536: fix itertools.permutations and itertools.combinations docstrings.
Georg Brandl <georg@python.org>
parents:
47527
diff
changeset
|
2472 "permutations(iterable[, r]) --> permutations object\n\ |
|
45675
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2473 \n\ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2474 Return successive r-length permutations of elements in the iterable.\n\n\ |
|
47544
f4989516b4d6
#2536: fix itertools.permutations and itertools.combinations docstrings.
Georg Brandl <georg@python.org>
parents:
47527
diff
changeset
|
2475 permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)"); |
|
45675
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2476 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2477 static PyTypeObject permutations_type = { |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2478 PyVarObject_HEAD_INIT(NULL, 0) |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2479 "itertools.permutations", /* tp_name */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2480 sizeof(permutationsobject), /* tp_basicsize */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2481 0, /* tp_itemsize */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2482 /* methods */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2483 (destructor)permutations_dealloc, /* tp_dealloc */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2484 0, /* tp_print */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2485 0, /* tp_getattr */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2486 0, /* tp_setattr */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2487 0, /* tp_compare */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2488 0, /* tp_repr */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2489 0, /* tp_as_number */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2490 0, /* tp_as_sequence */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2491 0, /* tp_as_mapping */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2492 0, /* tp_hash */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2493 0, /* tp_call */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2494 0, /* tp_str */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2495 PyObject_GenericGetAttr, /* tp_getattro */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2496 0, /* tp_setattro */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2497 0, /* tp_as_buffer */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2498 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2499 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2500 permutations_doc, /* tp_doc */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2501 (traverseproc)permutations_traverse, /* tp_traverse */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2502 0, /* tp_clear */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2503 0, /* tp_richcompare */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2504 0, /* tp_weaklistoffset */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2505 PyObject_SelfIter, /* tp_iter */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2506 (iternextfunc)permutations_next, /* tp_iternext */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2507 0, /* tp_methods */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2508 0, /* tp_members */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2509 0, /* tp_getset */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2510 0, /* tp_base */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2511 0, /* tp_dict */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2512 0, /* tp_descr_get */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2513 0, /* tp_descr_set */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2514 0, /* tp_dictoffset */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2515 0, /* tp_init */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2516 0, /* tp_alloc */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2517 permutations_new, /* tp_new */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2518 PyObject_GC_Del, /* tp_free */ |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2519 }; |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2520 |
|
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
2521 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2522 /* ifilter object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2523 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2524 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2525 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2526 PyObject *func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2527 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2528 } ifilterobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2529 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2530 static PyTypeObject ifilter_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2531 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2532 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2533 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
|
2534 { |
| 27769 | 2535 PyObject *func, *seq; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2536 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2537 ifilterobject *lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2538 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
2539 if (type == &ifilter_type && !_PyArg_NoKeywords("ifilter()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2540 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2541 |
| 27769 | 2542 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
|
2543 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2544 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2545 /* Get iterator. */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2546 it = PyObject_GetIter(seq); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2547 if (it == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2548 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2549 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2550 /* create ifilterobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2551 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
|
2552 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2553 Py_DECREF(it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2554 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2555 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2556 Py_INCREF(func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2557 lz->func = func; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2558 lz->it = it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2559 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2560 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2561 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2562 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2563 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2564 ifilter_dealloc(ifilterobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2565 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2566 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2567 Py_XDECREF(lz->func); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2568 Py_XDECREF(lz->it); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
2569 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2570 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2571 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2572 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2573 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
|
2574 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2575 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2576 Py_VISIT(lz->func); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2577 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2578 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2579 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2580 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2581 ifilter_next(ifilterobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2582 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2583 PyObject *item; |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2584 PyObject *it = lz->it; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2585 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2586 PyObject *(*iternext)(PyObject *); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2587 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2588 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
2589 iternext = *Py_TYPE(it)->tp_iternext; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2590 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2591 item = iternext(it); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2592 if (item == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2593 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2594 |
|
45526
9b381ed1db14
Coerced PyBool_Type to be able to compare it.
Facundo Batista <facundobatista@gmail.com>
parents:
45524
diff
changeset
|
2595 if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) { |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2596 ok = PyObject_IsTrue(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2597 } else { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2598 PyObject *good; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2599 good = PyObject_CallFunctionObjArgs(lz->func, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2600 item, NULL); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2601 if (good == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2602 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2603 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2604 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2605 ok = PyObject_IsTrue(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2606 Py_DECREF(good); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2607 } |
| 27769 | 2608 if (ok) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2609 return item; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2610 Py_DECREF(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2611 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2612 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2613 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2614 PyDoc_STRVAR(ifilter_doc, |
| 27769 | 2615 "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
|
2616 \n\ |
| 27769 | 2617 Return those items of sequence for which function(item) is true.\n\ |
| 2618 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
|
2619 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2620 static PyTypeObject ifilter_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
2621 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 2622 "itertools.ifilter", /* tp_name */ |
| 2623 sizeof(ifilterobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2624 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2625 /* methods */ |
| 27769 | 2626 (destructor)ifilter_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2627 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2628 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2629 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2630 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2631 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2632 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2633 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2634 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2635 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2636 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2637 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2638 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2639 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2640 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2641 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
|
2642 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 2643 ifilter_doc, /* tp_doc */ |
| 2644 (traverseproc)ifilter_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2645 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2646 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2647 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2648 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2649 (iternextfunc)ifilter_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2650 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2651 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2652 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2653 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2654 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2655 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2656 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2657 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2658 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2659 0, /* tp_alloc */ |
| 27769 | 2660 ifilter_new, /* tp_new */ |
| 2661 PyObject_GC_Del, /* tp_free */ | |
| 2662 }; | |
| 2663 | |
| 2664 | |
| 2665 /* ifilterfalse object ************************************************************/ | |
| 2666 | |
| 2667 typedef struct { | |
| 2668 PyObject_HEAD | |
| 2669 PyObject *func; | |
| 2670 PyObject *it; | |
| 2671 } ifilterfalseobject; | |
| 2672 | |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2673 static PyTypeObject ifilterfalse_type; |
| 27769 | 2674 |
| 2675 static PyObject * | |
| 2676 ifilterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |
| 2677 { | |
|
27770
2c389a0448a4
Remove unused variable.
Guido van Rossum <guido@python.org>
parents:
27769
diff
changeset
|
2678 PyObject *func, *seq; |
| 27769 | 2679 PyObject *it; |
| 2680 ifilterfalseobject *lz; | |
| 2681 | |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
2682 if (type == &ifilterfalse_type && |
|
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
2683 !_PyArg_NoKeywords("ifilterfalse()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2684 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2685 |
| 27769 | 2686 if (!PyArg_UnpackTuple(args, "ifilterfalse", 2, 2, &func, &seq)) |
| 2687 return NULL; | |
| 2688 | |
| 2689 /* Get iterator. */ | |
| 2690 it = PyObject_GetIter(seq); | |
| 2691 if (it == NULL) | |
| 2692 return NULL; | |
| 2693 | |
| 2694 /* create ifilterfalseobject structure */ | |
| 2695 lz = (ifilterfalseobject *)type->tp_alloc(type, 0); | |
| 2696 if (lz == NULL) { | |
| 2697 Py_DECREF(it); | |
| 2698 return NULL; | |
| 2699 } | |
| 2700 Py_INCREF(func); | |
| 2701 lz->func = func; | |
| 2702 lz->it = it; | |
| 2703 | |
| 2704 return (PyObject *)lz; | |
| 2705 } | |
| 2706 | |
| 2707 static void | |
| 2708 ifilterfalse_dealloc(ifilterfalseobject *lz) | |
| 2709 { | |
| 2710 PyObject_GC_UnTrack(lz); | |
| 2711 Py_XDECREF(lz->func); | |
| 2712 Py_XDECREF(lz->it); | |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
2713 Py_TYPE(lz)->tp_free(lz); |
| 27769 | 2714 } |
| 2715 | |
| 2716 static int | |
| 2717 ifilterfalse_traverse(ifilterfalseobject *lz, visitproc visit, void *arg) | |
| 2718 { | |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2719 Py_VISIT(lz->it); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
2720 Py_VISIT(lz->func); |
| 27769 | 2721 return 0; |
| 2722 } | |
| 2723 | |
| 2724 static PyObject * | |
| 2725 ifilterfalse_next(ifilterfalseobject *lz) | |
| 2726 { | |
| 2727 PyObject *item; | |
|
28117
9b4eed4bb3e2
Several of the tools can make direct calls the inner iterators.
Raymond Hettinger <python@rcn.com>
parents:
28024
diff
changeset
|
2728 PyObject *it = lz->it; |
| 27769 | 2729 long ok; |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2730 PyObject *(*iternext)(PyObject *); |
| 27769 | 2731 |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2732 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
2733 iternext = *Py_TYPE(it)->tp_iternext; |
| 27769 | 2734 for (;;) { |
|
31675
f7374e3b279a
Speedup the inner loops for dropwhile(), islice(), ifilter(), and
Raymond Hettinger <python@rcn.com>
parents:
31508
diff
changeset
|
2735 item = iternext(it); |
| 27769 | 2736 if (item == NULL) |
| 2737 return NULL; | |
| 2738 | |
|
45526
9b381ed1db14
Coerced PyBool_Type to be able to compare it.
Facundo Batista <facundobatista@gmail.com>
parents:
45524
diff
changeset
|
2739 if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) { |
| 27769 | 2740 ok = PyObject_IsTrue(item); |
| 2741 } else { | |
| 2742 PyObject *good; | |
| 2743 good = PyObject_CallFunctionObjArgs(lz->func, | |
| 2744 item, NULL); | |
| 2745 if (good == NULL) { | |
| 2746 Py_DECREF(item); | |
| 2747 return NULL; | |
| 2748 } | |
| 2749 ok = PyObject_IsTrue(good); | |
| 2750 Py_DECREF(good); | |
| 2751 } | |
| 2752 if (!ok) | |
| 2753 return item; | |
| 2754 Py_DECREF(item); | |
| 2755 } | |
| 2756 } | |
| 2757 | |
| 2758 PyDoc_STRVAR(ifilterfalse_doc, | |
| 2759 "ifilterfalse(function or None, sequence) --> ifilterfalse object\n\ | |
| 2760 \n\ | |
| 2761 Return those items of sequence for which function(item) is false.\n\ | |
| 2762 If function is None, return the items that are false."); | |
| 2763 | |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2764 static PyTypeObject ifilterfalse_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
2765 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 2766 "itertools.ifilterfalse", /* tp_name */ |
| 2767 sizeof(ifilterfalseobject), /* tp_basicsize */ | |
| 2768 0, /* tp_itemsize */ | |
| 2769 /* methods */ | |
| 2770 (destructor)ifilterfalse_dealloc, /* tp_dealloc */ | |
| 2771 0, /* tp_print */ | |
| 2772 0, /* tp_getattr */ | |
| 2773 0, /* tp_setattr */ | |
| 2774 0, /* tp_compare */ | |
| 2775 0, /* tp_repr */ | |
| 2776 0, /* tp_as_number */ | |
| 2777 0, /* tp_as_sequence */ | |
| 2778 0, /* tp_as_mapping */ | |
| 2779 0, /* tp_hash */ | |
| 2780 0, /* tp_call */ | |
| 2781 0, /* tp_str */ | |
| 2782 PyObject_GenericGetAttr, /* tp_getattro */ | |
| 2783 0, /* tp_setattro */ | |
| 2784 0, /* tp_as_buffer */ | |
| 2785 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | | |
| 2786 Py_TPFLAGS_BASETYPE, /* tp_flags */ | |
| 2787 ifilterfalse_doc, /* tp_doc */ | |
| 2788 (traverseproc)ifilterfalse_traverse, /* tp_traverse */ | |
| 2789 0, /* tp_clear */ | |
| 2790 0, /* tp_richcompare */ | |
| 2791 0, /* tp_weaklistoffset */ | |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2792 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2793 (iternextfunc)ifilterfalse_next, /* tp_iternext */ |
| 2794 0, /* tp_methods */ | |
| 2795 0, /* tp_members */ | |
| 2796 0, /* tp_getset */ | |
| 2797 0, /* tp_base */ | |
| 2798 0, /* tp_dict */ | |
| 2799 0, /* tp_descr_get */ | |
| 2800 0, /* tp_descr_set */ | |
| 2801 0, /* tp_dictoffset */ | |
| 2802 0, /* tp_init */ | |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2803 0, /* tp_alloc */ |
| 27769 | 2804 ifilterfalse_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2805 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2806 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2807 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2808 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2809 /* count object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2810 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2811 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2812 PyObject_HEAD |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
2813 Py_ssize_t cnt; |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2814 PyObject *long_cnt; /* Arbitrarily large count when cnt >= PY_SSIZE_T_MAX */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2815 } countobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2816 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2817 static PyTypeObject count_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2818 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2819 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2820 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
|
2821 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2822 countobject *lz; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
2823 Py_ssize_t cnt = 0; |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2824 PyObject *cnt_arg = NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2825 PyObject *long_cnt = NULL; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2826 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
2827 if (type == &count_type && !_PyArg_NoKeywords("count()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2828 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2829 |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2830 if (!PyArg_UnpackTuple(args, "count", 0, 1, &cnt_arg)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2831 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2832 |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2833 if (cnt_arg != NULL) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2834 cnt = PyInt_AsSsize_t(cnt_arg); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2835 if (cnt == -1 && PyErr_Occurred()) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2836 PyErr_Clear(); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2837 if (!PyLong_Check(cnt_arg)) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2838 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2839 return NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2840 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2841 long_cnt = cnt_arg; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2842 Py_INCREF(long_cnt); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2843 cnt = PY_SSIZE_T_MAX; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2844 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2845 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2846 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2847 /* create countobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2848 lz = (countobject *)PyObject_New(countobject, &count_type); |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2849 if (lz == NULL) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2850 Py_XDECREF(long_cnt); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2851 return NULL; |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2852 } |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2853 lz->cnt = cnt; |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2854 lz->long_cnt = long_cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2855 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2856 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2857 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2858 |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2859 static void |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2860 count_dealloc(countobject *lz) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2861 { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2862 Py_XDECREF(lz->long_cnt); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2863 PyObject_Del(lz); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2864 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2865 |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2866 static PyObject * |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2867 count_nextlong(countobject *lz) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2868 { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2869 static PyObject *one = NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2870 PyObject *cnt; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2871 PyObject *stepped_up; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2872 |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2873 if (lz->long_cnt == NULL) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2874 lz->long_cnt = PyInt_FromSsize_t(PY_SSIZE_T_MAX); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2875 if (lz->long_cnt == NULL) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2876 return NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2877 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2878 if (one == NULL) { |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2879 one = PyInt_FromLong(1); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2880 if (one == NULL) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2881 return NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2882 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2883 cnt = lz->long_cnt; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2884 assert(cnt != NULL); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2885 stepped_up = PyNumber_Add(cnt, one); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2886 if (stepped_up == NULL) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2887 return NULL; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2888 lz->long_cnt = stepped_up; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2889 return cnt; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2890 } |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2891 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2892 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2893 count_next(countobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2894 { |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2895 if (lz->cnt == PY_SSIZE_T_MAX) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2896 return count_nextlong(lz); |
|
39866
69530aa21b8a
* regression bug, count_next was coercing a Py_ssize_t to an unsigned Py_size_t
Jack Diederich <jackdied@gmail.com>
parents:
39720
diff
changeset
|
2897 return PyInt_FromSsize_t(lz->cnt++); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2898 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2899 |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2900 static PyObject * |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2901 count_repr(countobject *lz) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2902 { |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2903 PyObject *cnt_repr; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2904 PyObject *result; |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2905 |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2906 if (lz->cnt != PY_SSIZE_T_MAX) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
2907 return PyString_FromFormat("count(%zd)", lz->cnt); |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2908 |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2909 cnt_repr = PyObject_Repr(lz->long_cnt); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2910 if (cnt_repr == NULL) |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2911 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
2912 result = PyString_FromFormat("count(%s)", PyString_AS_STRING(cnt_repr)); |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2913 Py_DECREF(cnt_repr); |
|
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2914 return result; |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2915 } |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2916 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2917 PyDoc_STRVAR(count_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2918 "count([firstval]) --> count object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2919 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2920 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
|
2921 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
|
2922 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2923 static PyTypeObject count_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
2924 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 2925 "itertools.count", /* tp_name */ |
| 2926 sizeof(countobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2927 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2928 /* methods */ |
|
43458
333b052e9da9
itertools.count() no longer limited to sys.maxint.
Raymond Hettinger <python@rcn.com>
parents:
42333
diff
changeset
|
2929 (destructor)count_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2930 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2931 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2932 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2933 0, /* tp_compare */ |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
2934 (reprfunc)count_repr, /* tp_repr */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2935 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2936 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2937 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2938 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2939 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2940 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2941 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2942 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2943 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2944 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
| 27769 | 2945 count_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2946 0, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2947 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2948 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2949 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
2950 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 2951 (iternextfunc)count_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2952 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2953 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2954 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2955 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2956 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2957 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2958 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2959 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2960 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
2961 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2962 count_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2963 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2964 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2965 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2966 /* izip object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2967 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2968 #include "Python.h" |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2969 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2970 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2971 PyObject_HEAD |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
2972 Py_ssize_t tuplesize; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2973 PyObject *ittuple; /* tuple of iterators */ |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2974 PyObject *result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2975 } izipobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2976 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
2977 static PyTypeObject izip_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2978 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2979 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2980 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
|
2981 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2982 izipobject *lz; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
2983 Py_ssize_t i; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2984 PyObject *ittuple; /* tuple of iterators */ |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
2985 PyObject *result; |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
2986 Py_ssize_t tuplesize = PySequence_Length(args); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2987 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
2988 if (type == &izip_type && !_PyArg_NoKeywords("izip()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2989 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
2990 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2991 /* args must be a tuple */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2992 assert(PyTuple_Check(args)); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2993 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2994 /* obtain iterators */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2995 ittuple = PyTuple_New(tuplesize); |
|
38420
499cf7c2f777
Fix compiler warning (and whitespace) on Mac OS 10.4. (A lot of this code looked duplicated, I wonder if a utility function could help reduce the duplication here.)
Neal Norwitz <nnorwitz@gmail.com>
parents:
38341
diff
changeset
|
2996 if (ittuple == NULL) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2997 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2998 for (i=0; i < tuplesize; ++i) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2999 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
|
3000 PyObject *it = PyObject_GetIter(item); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3001 if (it == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3002 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3003 PyErr_Format(PyExc_TypeError, |
|
38420
499cf7c2f777
Fix compiler warning (and whitespace) on Mac OS 10.4. (A lot of this code looked duplicated, I wonder if a utility function could help reduce the duplication here.)
Neal Norwitz <nnorwitz@gmail.com>
parents:
38341
diff
changeset
|
3004 "izip argument #%zd must support iteration", |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3005 i+1); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3006 Py_DECREF(ittuple); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3007 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3008 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3009 PyTuple_SET_ITEM(ittuple, i, it); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3010 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3011 |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3012 /* create a result holder */ |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3013 result = PyTuple_New(tuplesize); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3014 if (result == NULL) { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3015 Py_DECREF(ittuple); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3016 return NULL; |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3017 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3018 for (i=0 ; i < tuplesize ; i++) { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3019 Py_INCREF(Py_None); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3020 PyTuple_SET_ITEM(result, i, Py_None); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3021 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3022 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3023 /* create izipobject structure */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3024 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
|
3025 if (lz == NULL) { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3026 Py_DECREF(ittuple); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3027 Py_DECREF(result); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3028 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3029 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3030 lz->ittuple = ittuple; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3031 lz->tuplesize = tuplesize; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3032 lz->result = result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3033 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3034 return (PyObject *)lz; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3035 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3036 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3037 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3038 izip_dealloc(izipobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3039 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3040 PyObject_GC_UnTrack(lz); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3041 Py_XDECREF(lz->ittuple); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3042 Py_XDECREF(lz->result); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3043 Py_TYPE(lz)->tp_free(lz); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3044 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3045 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3046 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3047 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
|
3048 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
3049 Py_VISIT(lz->ittuple); |
|
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
3050 Py_VISIT(lz->result); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3051 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3052 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3053 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3054 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3055 izip_next(izipobject *lz) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3056 { |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
3057 Py_ssize_t i; |
|
36518
9f3f87e920a6
Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
3058 Py_ssize_t tuplesize = lz->tuplesize; |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3059 PyObject *result = lz->result; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3060 PyObject *it; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3061 PyObject *item; |
|
30240
f1ea311127cf
For safety, replace a tuple entry before decreffing it.
Raymond Hettinger <python@rcn.com>
parents:
30238
diff
changeset
|
3062 PyObject *olditem; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3063 |
|
30093
0ac4396b1894
Modified itertools.izip() to match the behavior of __builtin__.zip()
Raymond Hettinger <python@rcn.com>
parents:
29850
diff
changeset
|
3064 if (tuplesize == 0) |
|
0ac4396b1894
Modified itertools.izip() to match the behavior of __builtin__.zip()
Raymond Hettinger <python@rcn.com>
parents:
29850
diff
changeset
|
3065 return NULL; |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3066 if (Py_REFCNT(result) == 1) { |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
3067 Py_INCREF(result); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3068 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
|
3069 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
|
3070 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3071 item = (*Py_TYPE(it)->tp_iternext)(it); |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
3072 if (item == NULL) { |
|
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
3073 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
|
3074 return NULL; |
|
30238
a570bb9f133f
SF bug #793826: using itertools.izip to mutate tuples
Raymond Hettinger <python@rcn.com>
parents:
30093
diff
changeset
|
3075 } |
|
30240
f1ea311127cf
For safety, replace a tuple entry before decreffing it.
Raymond Hettinger <python@rcn.com>
parents:
30238
diff
changeset
|
3076 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
|
3077 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
|
3078 Py_DECREF(olditem); |
|
27747
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3079 } |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3080 } else { |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3081 result = PyTuple_New(tuplesize); |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3082 if (result == NULL) |
|
941de791b17a
SF bug #681003: itertools issues
Raymond Hettinger <python@rcn.com>
parents:
27570
diff
changeset
|
3083 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
|
3084 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
|
3085 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
|
3086 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3087 item = (*Py_TYPE(it)->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
|
3088 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
|
3089 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
|
3090 return NULL; |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
3091 } |
|
59ae41e04ffb
* Eliminated tuple re-use in imap(). Doing it correctly made the code
Raymond Hettinger <python@rcn.com>
parents:
27747
diff
changeset
|
3092 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
|
3093 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3094 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3095 return result; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3096 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3097 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3098 PyDoc_STRVAR(izip_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3099 "izip(iter1 [,iter2 [...]]) --> izip object\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3100 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3101 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
|
3102 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
|
3103 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
|
3104 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
|
3105 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
|
3106 a list."); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3107 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
3108 static PyTypeObject izip_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
3109 PyVarObject_HEAD_INIT(NULL, 0) |
| 27769 | 3110 "itertools.izip", /* tp_name */ |
| 3111 sizeof(izipobject), /* tp_basicsize */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3112 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3113 /* methods */ |
| 27769 | 3114 (destructor)izip_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3115 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3116 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3117 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3118 0, /* tp_compare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3119 0, /* tp_repr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3120 0, /* tp_as_number */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3121 0, /* tp_as_sequence */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3122 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3123 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3124 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3125 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3126 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3127 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3128 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3129 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
|
3130 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 3131 izip_doc, /* tp_doc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3132 (traverseproc)izip_traverse, /* tp_traverse */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3133 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3134 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3135 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
3136 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 3137 (iternextfunc)izip_next, /* tp_iternext */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3138 0, /* tp_methods */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3139 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3140 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3141 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3142 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3143 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3144 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3145 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3146 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
3147 0, /* tp_alloc */ |
| 27769 | 3148 izip_new, /* tp_new */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3149 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3150 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3151 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3152 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3153 /* repeat object ************************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3154 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3155 typedef struct { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3156 PyObject_HEAD |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3157 PyObject *element; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
3158 Py_ssize_t cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3159 } repeatobject; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3160 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
3161 static PyTypeObject repeat_type; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3162 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3163 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3164 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
|
3165 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3166 repeatobject *ro; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3167 PyObject *element; |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
3168 Py_ssize_t cnt = -1; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3169 |
|
40682
77e0f4718a7c
Bug #1486663: don't reject keyword arguments for subclasses of builtin
Georg Brandl <georg@python.org>
parents:
39866
diff
changeset
|
3170 if (type == &repeat_type && !_PyArg_NoKeywords("repeat()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
3171 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34108
diff
changeset
|
3172 |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
3173 if (!PyArg_ParseTuple(args, "O|n:repeat", &element, &cnt)) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3174 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3175 |
|
28945
001a90555780
* Added a substantial number of edge case and argument tests for
Raymond Hettinger <python@rcn.com>
parents:
28930
diff
changeset
|
3176 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
|
3177 cnt = 0; |
|
001a90555780
* Added a substantial number of edge case and argument tests for
Raymond Hettinger <python@rcn.com>
parents:
28930
diff
changeset
|
3178 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3179 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
|
3180 if (ro == NULL) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3181 return NULL; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3182 Py_INCREF(element); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3183 ro->element = element; |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3184 ro->cnt = cnt; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3185 return (PyObject *)ro; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3186 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3187 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3188 static void |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3189 repeat_dealloc(repeatobject *ro) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3190 { |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3191 PyObject_GC_UnTrack(ro); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3192 Py_XDECREF(ro->element); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3193 Py_TYPE(ro)->tp_free(ro); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3194 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3195 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3196 static int |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3197 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
|
3198 { |
|
32682
bc4dd31c73fd
Exercise Jim's VISIT macro.
Raymond Hettinger <python@rcn.com>
parents:
32010
diff
changeset
|
3199 Py_VISIT(ro->element); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3200 return 0; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3201 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3202 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3203 static PyObject * |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3204 repeat_next(repeatobject *ro) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3205 { |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3206 if (ro->cnt == 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3207 return NULL; |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3208 if (ro->cnt > 0) |
|
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3209 ro->cnt--; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3210 Py_INCREF(ro->element); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3211 return ro->element; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3212 } |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3213 |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3214 static PyObject * |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3215 repeat_repr(repeatobject *ro) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3216 { |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3217 PyObject *result, *objrepr; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3218 |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3219 objrepr = PyObject_Repr(ro->element); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3220 if (objrepr == NULL) |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3221 return NULL; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3222 |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3223 if (ro->cnt == -1) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
3224 result = PyString_FromFormat("repeat(%s)", |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
3225 PyString_AS_STRING(objrepr)); |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3226 else |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
3227 result = PyString_FromFormat("repeat(%s, %zd)", |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
3228 PyString_AS_STRING(objrepr), ro->cnt); |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3229 Py_DECREF(objrepr); |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3230 return result; |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3231 } |
|
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3232 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3233 static PyObject * |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3234 repeat_len(repeatobject *ro) |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3235 { |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3236 if (ro->cnt == -1) { |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3237 PyErr_SetString(PyExc_TypeError, "len() of unsized object"); |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3238 return NULL; |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3239 } |
|
38341
a654d61d36d5
use Py_ssize_t in places that may need it
Jack Diederich <jackdied@gmail.com>
parents:
37757
diff
changeset
|
3240 return PyInt_FromSize_t(ro->cnt); |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3241 } |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3242 |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
36324
diff
changeset
|
3243 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3244 |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3245 static PyMethodDef repeat_methods[] = { |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
36324
diff
changeset
|
3246 {"__length_hint__", (PyCFunction)repeat_len, METH_NOARGS, length_hint_doc}, |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3247 {NULL, NULL} /* sentinel */ |
|
31501
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3248 }; |
|
14f860b03be2
Give itertools.repeat() a length method.
Raymond Hettinger <python@rcn.com>
parents:
31136
diff
changeset
|
3249 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3250 PyDoc_STRVAR(repeat_doc, |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3251 "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
|
3252 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
|
3253 endlessly."); |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3254 |
|
29850
45dc33433323
SF patch #770521: make itertools type declarations static
Raymond Hettinger <python@rcn.com>
parents:
29535
diff
changeset
|
3255 static PyTypeObject repeat_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
3256 PyVarObject_HEAD_INIT(NULL, 0) |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3257 "itertools.repeat", /* tp_name */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3258 sizeof(repeatobject), /* tp_basicsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3259 0, /* tp_itemsize */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3260 /* methods */ |
| 27769 | 3261 (destructor)repeat_dealloc, /* tp_dealloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3262 0, /* tp_print */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3263 0, /* tp_getattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3264 0, /* tp_setattr */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3265 0, /* tp_compare */ |
|
31890
848bce2215d3
Provide more information representations of repeat() and count().
Raymond Hettinger <python@rcn.com>
parents:
31675
diff
changeset
|
3266 (reprfunc)repeat_repr, /* tp_repr */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3267 0, /* tp_as_number */ |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3268 0, /* tp_as_sequence */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3269 0, /* tp_as_mapping */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3270 0, /* tp_hash */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3271 0, /* tp_call */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3272 0, /* tp_str */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3273 PyObject_GenericGetAttr, /* tp_getattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3274 0, /* tp_setattro */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3275 0, /* tp_as_buffer */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3276 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
|
3277 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
| 27769 | 3278 repeat_doc, /* tp_doc */ |
| 3279 (traverseproc)repeat_traverse, /* tp_traverse */ | |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3280 0, /* tp_clear */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3281 0, /* tp_richcompare */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3282 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
3283 PyObject_SelfIter, /* tp_iter */ |
| 27769 | 3284 (iternextfunc)repeat_next, /* tp_iternext */ |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
3285 repeat_methods, /* tp_methods */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3286 0, /* tp_members */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3287 0, /* tp_getset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3288 0, /* tp_base */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3289 0, /* tp_dict */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3290 0, /* tp_descr_get */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3291 0, /* tp_descr_set */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3292 0, /* tp_dictoffset */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3293 0, /* tp_init */ |
|
29242
d72ad07c739e
PyType_GenericAlloc is inherited from object.
Raymond Hettinger <python@rcn.com>
parents:
29225
diff
changeset
|
3294 0, /* tp_alloc */ |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3295 repeat_new, /* tp_new */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3296 PyObject_GC_Del, /* tp_free */ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3297 }; |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3298 |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3299 /* iziplongest object ************************************************************/ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3300 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3301 #include "Python.h" |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3302 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3303 typedef struct { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3304 PyObject_HEAD |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3305 Py_ssize_t tuplesize; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3306 Py_ssize_t numactive; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3307 PyObject *ittuple; /* tuple of iterators */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3308 PyObject *result; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3309 PyObject *fillvalue; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3310 } iziplongestobject; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3311 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3312 static PyTypeObject iziplongest_type; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3313 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3314 static PyObject * |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3315 izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3316 { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3317 iziplongestobject *lz; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3318 Py_ssize_t i; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3319 PyObject *ittuple; /* tuple of iterators */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3320 PyObject *result; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3321 PyObject *fillvalue = Py_None; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3322 Py_ssize_t tuplesize = PySequence_Length(args); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3323 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3324 if (kwds != NULL && PyDict_CheckExact(kwds) && PyDict_Size(kwds) > 0) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3325 fillvalue = PyDict_GetItemString(kwds, "fillvalue"); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3326 if (fillvalue == NULL || PyDict_Size(kwds) > 1) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3327 PyErr_SetString(PyExc_TypeError, |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3328 "izip_longest() got an unexpected keyword argument"); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3329 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3330 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3331 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3332 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3333 /* args must be a tuple */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3334 assert(PyTuple_Check(args)); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3335 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3336 /* obtain iterators */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3337 ittuple = PyTuple_New(tuplesize); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3338 if (ittuple == NULL) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3339 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3340 for (i=0; i < tuplesize; ++i) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3341 PyObject *item = PyTuple_GET_ITEM(args, i); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3342 PyObject *it = PyObject_GetIter(item); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3343 if (it == NULL) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3344 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3345 PyErr_Format(PyExc_TypeError, |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3346 "izip_longest argument #%zd must support iteration", |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3347 i+1); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3348 Py_DECREF(ittuple); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3349 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3350 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3351 PyTuple_SET_ITEM(ittuple, i, it); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3352 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3353 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3354 /* create a result holder */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3355 result = PyTuple_New(tuplesize); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3356 if (result == NULL) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3357 Py_DECREF(ittuple); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3358 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3359 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3360 for (i=0 ; i < tuplesize ; i++) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3361 Py_INCREF(Py_None); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3362 PyTuple_SET_ITEM(result, i, Py_None); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3363 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3364 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3365 /* create iziplongestobject structure */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3366 lz = (iziplongestobject *)type->tp_alloc(type, 0); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3367 if (lz == NULL) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3368 Py_DECREF(ittuple); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3369 Py_DECREF(result); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3370 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3371 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3372 lz->ittuple = ittuple; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3373 lz->tuplesize = tuplesize; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3374 lz->numactive = tuplesize; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3375 lz->result = result; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3376 Py_INCREF(fillvalue); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3377 lz->fillvalue = fillvalue; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3378 return (PyObject *)lz; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3379 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3380 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3381 static void |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3382 izip_longest_dealloc(iziplongestobject *lz) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3383 { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3384 PyObject_GC_UnTrack(lz); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3385 Py_XDECREF(lz->ittuple); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3386 Py_XDECREF(lz->result); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3387 Py_XDECREF(lz->fillvalue); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3388 Py_TYPE(lz)->tp_free(lz); |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3389 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3390 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3391 static int |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3392 izip_longest_traverse(iziplongestobject *lz, visitproc visit, void *arg) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3393 { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3394 Py_VISIT(lz->ittuple); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3395 Py_VISIT(lz->result); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3396 Py_VISIT(lz->fillvalue); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3397 return 0; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3398 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3399 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3400 static PyObject * |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3401 izip_longest_next(iziplongestobject *lz) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3402 { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3403 Py_ssize_t i; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3404 Py_ssize_t tuplesize = lz->tuplesize; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3405 PyObject *result = lz->result; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3406 PyObject *it; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3407 PyObject *item; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3408 PyObject *olditem; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3409 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3410 if (tuplesize == 0) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3411 return NULL; |
|
40878
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3412 if (lz->numactive == 0) |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3413 return NULL; |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3414 if (Py_REFCNT(result) == 1) { |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3415 Py_INCREF(result); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3416 for (i=0 ; i < tuplesize ; i++) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3417 it = PyTuple_GET_ITEM(lz->ittuple, i); |
|
40878
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3418 if (it == NULL) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3419 Py_INCREF(lz->fillvalue); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3420 item = lz->fillvalue; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3421 } else { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3422 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3423 item = (*Py_TYPE(it)->tp_iternext)(it); |
|
40878
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3424 if (item == NULL) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3425 lz->numactive -= 1; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3426 if (lz->numactive == 0) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3427 Py_DECREF(result); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3428 return NULL; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3429 } else { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3430 Py_INCREF(lz->fillvalue); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3431 item = lz->fillvalue; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3432 PyTuple_SET_ITEM(lz->ittuple, i, NULL); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3433 Py_DECREF(it); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3434 } |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3435 } |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3436 } |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3437 olditem = PyTuple_GET_ITEM(result, i); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3438 PyTuple_SET_ITEM(result, i, item); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3439 Py_DECREF(olditem); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3440 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3441 } else { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3442 result = PyTuple_New(tuplesize); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3443 if (result == NULL) |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3444 return NULL; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3445 for (i=0 ; i < tuplesize ; i++) { |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3446 it = PyTuple_GET_ITEM(lz->ittuple, i); |
|
40878
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3447 if (it == NULL) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3448 Py_INCREF(lz->fillvalue); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3449 item = lz->fillvalue; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3450 } else { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3451 assert(PyIter_Check(it)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3452 item = (*Py_TYPE(it)->tp_iternext)(it); |
|
40878
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3453 if (item == NULL) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3454 lz->numactive -= 1; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3455 if (lz->numactive == 0) { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3456 Py_DECREF(result); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3457 return NULL; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3458 } else { |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3459 Py_INCREF(lz->fillvalue); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3460 item = lz->fillvalue; |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3461 PyTuple_SET_ITEM(lz->ittuple, i, NULL); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3462 Py_DECREF(it); |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3463 } |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3464 } |
|
8128619e984d
Remove filler struct item and fix leak.
Raymond Hettinger <python@rcn.com>
parents:
40877
diff
changeset
|
3465 } |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3466 PyTuple_SET_ITEM(result, i, item); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3467 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3468 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3469 return result; |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3470 } |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3471 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3472 PyDoc_STRVAR(izip_longest_doc, |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3473 "izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3474 \n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3475 Return an izip_longest object whose .next() method returns a tuple where\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3476 the i-th element comes from the i-th iterable argument. The .next()\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3477 method continues until the longest iterable in the argument sequence\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3478 is exhausted and then it raises StopIteration. When the shorter iterables\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3479 are exhausted, the fillvalue is substituted in their place. The fillvalue\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3480 defaults to None or can be specified by a keyword argument.\n\ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3481 "); |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3482 |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3483 static PyTypeObject iziplongest_type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41590
diff
changeset
|
3484 PyVarObject_HEAD_INIT(NULL, 0) |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3485 "itertools.izip_longest", /* tp_name */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3486 sizeof(iziplongestobject), /* tp_basicsize */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3487 0, /* tp_itemsize */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3488 /* methods */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3489 (destructor)izip_longest_dealloc, /* tp_dealloc */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3490 0, /* tp_print */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3491 0, /* tp_getattr */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3492 0, /* tp_setattr */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3493 0, /* tp_compare */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3494 0, /* tp_repr */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3495 0, /* tp_as_number */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3496 0, /* tp_as_sequence */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3497 0, /* tp_as_mapping */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3498 0, /* tp_hash */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3499 0, /* tp_call */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3500 0, /* tp_str */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3501 PyObject_GenericGetAttr, /* tp_getattro */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3502 0, /* tp_setattro */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3503 0, /* tp_as_buffer */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3504 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3505 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3506 izip_longest_doc, /* tp_doc */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3507 (traverseproc)izip_longest_traverse, /* tp_traverse */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3508 0, /* tp_clear */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3509 0, /* tp_richcompare */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3510 0, /* tp_weaklistoffset */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3511 PyObject_SelfIter, /* tp_iter */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3512 (iternextfunc)izip_longest_next, /* tp_iternext */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3513 0, /* tp_methods */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3514 0, /* tp_members */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3515 0, /* tp_getset */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3516 0, /* tp_base */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3517 0, /* tp_dict */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3518 0, /* tp_descr_get */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3519 0, /* tp_descr_set */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3520 0, /* tp_dictoffset */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3521 0, /* tp_init */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3522 0, /* tp_alloc */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3523 izip_longest_new, /* tp_new */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3524 PyObject_GC_Del, /* tp_free */ |
|
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3525 }; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3526 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3527 /* module level code ********************************************************/ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3528 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3529 PyDoc_STRVAR(module_doc, |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3530 "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
|
3531 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3532 Infinite iterators:\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3533 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
|
3534 cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\ |
| 28601 | 3535 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
|
3536 \n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3537 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
|
3538 izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ |
|
40877
6fa0d682e1e5
Add itertools.izip_longest().
Raymond Hettinger <python@rcn.com>
parents:
40766
diff
changeset
|
3539 izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ |
| 27769 | 3540 ifilter(pred, seq) --> elements of seq where pred(elem) is True\n\ |
| 3541 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
|
3542 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
|
3543 seq[start:stop:step]\n\ |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3544 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
|
3545 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
|
3546 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
|
3547 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
|
3548 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
|
3549 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
|
3550 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
|
3551 "); |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3552 |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3553 |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3554 static PyMethodDef module_methods[] = { |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3555 {"tee", (PyCFunction)tee, METH_VARARGS, tee_doc}, |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3556 {NULL, NULL} /* sentinel */ |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3557 }; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3558 |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3559 PyMODINIT_FUNC |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3560 inititertools(void) |
|
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3561 { |
| 27769 | 3562 int i; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3563 PyObject *m; |
| 27769 | 3564 char *name; |
| 3565 PyTypeObject *typelist[] = { | |
|
45539
ca45eb71f2d2
Add itertools.combinations().
Raymond Hettinger <python@rcn.com>
parents:
45526
diff
changeset
|
3566 &combinations_type, |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3567 &cycle_type, |
| 27769 | 3568 &dropwhile_type, |
| 3569 &takewhile_type, | |
| 3570 &islice_type, | |
| 3571 &starmap_type, | |
| 3572 &imap_type, | |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3573 &chain_type, |
| 27769 | 3574 &ifilter_type, |
| 3575 &ifilterfalse_type, | |
| 3576 &count_type, | |
| 3577 &izip_type, | |
|
45425
3cc57fd87d0e
First draft for itertools.product(). Docs and other updates forthcoming.
Raymond Hettinger <python@rcn.com>
parents:
44717
diff
changeset
|
3578 &iziplongest_type, |
|
45675
c197e18449b4
C implementation of itertools.permutations().
Raymond Hettinger <python@rcn.com>
parents:
45658
diff
changeset
|
3579 &permutations_type, |
|
45899
4ca7119d1700
Added zip, map, filter to future_bultins (#2171)
David Wolever <david@wolever.net>
parents:
45746
diff
changeset
|
3580 &product_type, |
| 27769 | 3581 &repeat_type, |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
3582 &groupby_type, |
| 27769 | 3583 NULL |
| 3584 }; | |
| 3585 | |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43458
diff
changeset
|
3586 Py_TYPE(&teedataobject_type) = &PyType_Type; |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3587 m = Py_InitModule3("itertools", module_methods, module_doc); |
|
36324
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
3588 if (m == NULL) |
|
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
3589 return; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3590 |
| 27769 | 3591 for (i=0 ; typelist[i] != NULL ; i++) { |
| 3592 if (PyType_Ready(typelist[i]) < 0) | |
| 3593 return; | |
|
29225
f3f306457b43
Fixed dotted name assertion.
Raymond Hettinger <python@rcn.com>
parents:
28945
diff
changeset
|
3594 name = strchr(typelist[i]->tp_name, '.'); |
|
28024
61fa6b55c1de
User requested changes to the itertools module.
Raymond Hettinger <python@rcn.com>
parents:
27770
diff
changeset
|
3595 assert (name != NULL); |
| 27769 | 3596 Py_INCREF(typelist[i]); |
|
29225
f3f306457b43
Fixed dotted name assertion.
Raymond Hettinger <python@rcn.com>
parents:
28945
diff
changeset
|
3597 PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); |
| 27769 | 3598 } |
|
30900
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3599 |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3600 if (PyType_Ready(&teedataobject_type) < 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3601 return; |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3602 if (PyType_Ready(&tee_type) < 0) |
|
3096fab2a19c
Improve the implementation of itertools.tee().
Raymond Hettinger <python@rcn.com>
parents:
30800
diff
changeset
|
3603 return; |
|
31136
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
3604 if (PyType_Ready(&_grouper_type) < 0) |
|
fde74fadf780
Implement itertools.groupby()
Raymond Hettinger <python@rcn.com>
parents:
30900
diff
changeset
|
3605 return; |
|
27570
ba57c3daf6e9
Move itertools module from the sandbox and into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3606 } |
