3 #include "structmember.h"
5 /* Itertools module written and maintained
6 by Raymond D. Hettinger <python@rcn.com>
7 Copyright (c) 2003 Python Software Foundation.
12 /* groupby object ***********************************************************/
23 static PyTypeObject groupby_type
;
24 static PyObject
*_grouper_create(groupbyobject
*, PyObject
*);
27 groupby_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
29 static char *kwargs
[] = {"iterable", "key", NULL
};
31 PyObject
*it
, *keyfunc
= Py_None
;
33 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "O|O:groupby", kwargs
,
37 gbo
= (groupbyobject
*)type
->tp_alloc(type
, 0);
42 gbo
->currvalue
= NULL
;
43 gbo
->keyfunc
= keyfunc
;
45 gbo
->it
= PyObject_GetIter(it
);
46 if (gbo
->it
== NULL
) {
50 return (PyObject
*)gbo
;
54 groupby_dealloc(groupbyobject
*gbo
)
56 PyObject_GC_UnTrack(gbo
);
58 Py_XDECREF(gbo
->keyfunc
);
59 Py_XDECREF(gbo
->tgtkey
);
60 Py_XDECREF(gbo
->currkey
);
61 Py_XDECREF(gbo
->currvalue
);
62 Py_TYPE(gbo
)->tp_free(gbo
);
66 groupby_traverse(groupbyobject
*gbo
, visitproc visit
, void *arg
)
69 Py_VISIT(gbo
->keyfunc
);
70 Py_VISIT(gbo
->tgtkey
);
71 Py_VISIT(gbo
->currkey
);
72 Py_VISIT(gbo
->currvalue
);
77 groupby_next(groupbyobject
*gbo
)
79 PyObject
*newvalue
, *newkey
, *r
, *grouper
, *tmp
;
81 /* skip to next iteration group */
83 if (gbo
->currkey
== NULL
)
85 else if (gbo
->tgtkey
== NULL
)
90 rcmp
= PyObject_RichCompareBool(gbo
->tgtkey
,
98 newvalue
= PyIter_Next(gbo
->it
);
102 if (gbo
->keyfunc
== Py_None
) {
106 newkey
= PyObject_CallFunctionObjArgs(gbo
->keyfunc
,
108 if (newkey
== NULL
) {
115 gbo
->currkey
= newkey
;
118 tmp
= gbo
->currvalue
;
119 gbo
->currvalue
= newvalue
;
123 Py_INCREF(gbo
->currkey
);
125 gbo
->tgtkey
= gbo
->currkey
;
128 grouper
= _grouper_create(gbo
, gbo
->tgtkey
);
132 r
= PyTuple_Pack(2, gbo
->currkey
, grouper
);
137 PyDoc_STRVAR(groupby_doc
,
138 "groupby(iterable[, keyfunc]) -> create an iterator which returns\n\
139 (key, sub-iterator) grouped by each value of key(value).\n");
141 static PyTypeObject groupby_type
= {
142 PyVarObject_HEAD_INIT(NULL
, 0)
143 "itertools.groupby", /* tp_name */
144 sizeof(groupbyobject
), /* tp_basicsize */
147 (destructor
)groupby_dealloc
, /* tp_dealloc */
153 0, /* tp_as_number */
154 0, /* tp_as_sequence */
155 0, /* tp_as_mapping */
159 PyObject_GenericGetAttr
, /* tp_getattro */
161 0, /* tp_as_buffer */
162 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
163 Py_TPFLAGS_BASETYPE
, /* tp_flags */
164 groupby_doc
, /* tp_doc */
165 (traverseproc
)groupby_traverse
, /* tp_traverse */
167 0, /* tp_richcompare */
168 0, /* tp_weaklistoffset */
169 PyObject_SelfIter
, /* tp_iter */
170 (iternextfunc
)groupby_next
, /* tp_iternext */
176 0, /* tp_descr_get */
177 0, /* tp_descr_set */
178 0, /* tp_dictoffset */
181 groupby_new
, /* tp_new */
182 PyObject_GC_Del
, /* tp_free */
186 /* _grouper object (internal) ************************************************/
194 static PyTypeObject _grouper_type
;
197 _grouper_create(groupbyobject
*parent
, PyObject
*tgtkey
)
201 igo
= PyObject_New(_grouperobject
, &_grouper_type
);
204 igo
->parent
= (PyObject
*)parent
;
206 igo
->tgtkey
= tgtkey
;
209 return (PyObject
*)igo
;
213 _grouper_dealloc(_grouperobject
*igo
)
215 Py_DECREF(igo
->parent
);
216 Py_DECREF(igo
->tgtkey
);
221 _grouper_next(_grouperobject
*igo
)
223 groupbyobject
*gbo
= (groupbyobject
*)igo
->parent
;
224 PyObject
*newvalue
, *newkey
, *r
;
227 if (gbo
->currvalue
== NULL
) {
228 newvalue
= PyIter_Next(gbo
->it
);
229 if (newvalue
== NULL
)
232 if (gbo
->keyfunc
== Py_None
) {
236 newkey
= PyObject_CallFunctionObjArgs(gbo
->keyfunc
,
238 if (newkey
== NULL
) {
244 assert(gbo
->currkey
== NULL
);
245 gbo
->currkey
= newkey
;
246 gbo
->currvalue
= newvalue
;
249 assert(gbo
->currkey
!= NULL
);
250 rcmp
= PyObject_RichCompareBool(igo
->tgtkey
, gbo
->currkey
, Py_EQ
);
252 /* got any error or current group is end */
256 gbo
->currvalue
= NULL
;
257 Py_CLEAR(gbo
->currkey
);
262 static PyTypeObject _grouper_type
= {
263 PyVarObject_HEAD_INIT(NULL
, 0)
264 "itertools._grouper", /* tp_name */
265 sizeof(_grouperobject
), /* tp_basicsize */
268 (destructor
)_grouper_dealloc
, /* tp_dealloc */
274 0, /* tp_as_number */
275 0, /* tp_as_sequence */
276 0, /* tp_as_mapping */
280 PyObject_GenericGetAttr
, /* tp_getattro */
282 0, /* tp_as_buffer */
283 Py_TPFLAGS_DEFAULT
, /* tp_flags */
287 0, /* tp_richcompare */
288 0, /* tp_weaklistoffset */
289 PyObject_SelfIter
, /* tp_iter */
290 (iternextfunc
)_grouper_next
, /* tp_iternext */
296 0, /* tp_descr_get */
297 0, /* tp_descr_set */
298 0, /* tp_dictoffset */
302 PyObject_Del
, /* tp_free */
307 /* tee object and with supporting function and objects ***************/
309 /* The teedataobject pre-allocates space for LINKCELLS number of objects.
310 To help the object fit neatly inside cache lines (space for 16 to 32
311 pointers), the value should be a multiple of 16 minus space for
312 the other structure members including PyHEAD overhead. The larger the
313 value, the less memory overhead per object and the less time spent
314 allocating/deallocating new links. The smaller the number, the less
315 wasted space and the more rapid freeing of older data.
324 PyObject
*(values
[LINKCELLS
]);
329 teedataobject
*dataobj
;
331 PyObject
*weakreflist
;
334 static PyTypeObject teedataobject_type
;
337 teedataobject_new(PyObject
*it
)
341 tdo
= PyObject_GC_New(teedataobject
, &teedataobject_type
);
346 tdo
->nextlink
= NULL
;
349 PyObject_GC_Track(tdo
);
350 return (PyObject
*)tdo
;
354 teedataobject_jumplink(teedataobject
*tdo
)
356 if (tdo
->nextlink
== NULL
)
357 tdo
->nextlink
= teedataobject_new(tdo
->it
);
358 Py_XINCREF(tdo
->nextlink
);
359 return tdo
->nextlink
;
363 teedataobject_getitem(teedataobject
*tdo
, int i
)
367 assert(i
< LINKCELLS
);
368 if (i
< tdo
->numread
)
369 value
= tdo
->values
[i
];
371 /* this is the lead iterator, so fetch more data */
372 assert(i
== tdo
->numread
);
373 value
= PyIter_Next(tdo
->it
);
377 tdo
->values
[i
] = value
;
384 teedataobject_traverse(teedataobject
*tdo
, visitproc visit
, void * arg
)
388 for (i
= 0; i
< tdo
->numread
; i
++)
389 Py_VISIT(tdo
->values
[i
]);
390 Py_VISIT(tdo
->nextlink
);
395 teedataobject_clear(teedataobject
*tdo
)
399 for (i
=0 ; i
<tdo
->numread
; i
++)
400 Py_CLEAR(tdo
->values
[i
]);
401 Py_CLEAR(tdo
->nextlink
);
406 teedataobject_dealloc(teedataobject
*tdo
)
408 PyObject_GC_UnTrack(tdo
);
409 teedataobject_clear(tdo
);
410 PyObject_GC_Del(tdo
);
413 PyDoc_STRVAR(teedataobject_doc
, "Data container common to multiple tee objects.");
415 static PyTypeObject teedataobject_type
= {
416 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
417 "itertools.tee_dataobject", /* tp_name */
418 sizeof(teedataobject
), /* tp_basicsize */
421 (destructor
)teedataobject_dealloc
, /* tp_dealloc */
427 0, /* tp_as_number */
428 0, /* tp_as_sequence */
429 0, /* tp_as_mapping */
433 PyObject_GenericGetAttr
, /* tp_getattro */
435 0, /* tp_as_buffer */
436 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
, /* tp_flags */
437 teedataobject_doc
, /* tp_doc */
438 (traverseproc
)teedataobject_traverse
, /* tp_traverse */
439 (inquiry
)teedataobject_clear
, /* tp_clear */
440 0, /* tp_richcompare */
441 0, /* tp_weaklistoffset */
449 0, /* tp_descr_get */
450 0, /* tp_descr_set */
451 0, /* tp_dictoffset */
455 PyObject_GC_Del
, /* tp_free */
459 static PyTypeObject tee_type
;
462 tee_next(teeobject
*to
)
464 PyObject
*value
, *link
;
466 if (to
->index
>= LINKCELLS
) {
467 link
= teedataobject_jumplink(to
->dataobj
);
468 Py_DECREF(to
->dataobj
);
469 to
->dataobj
= (teedataobject
*)link
;
472 value
= teedataobject_getitem(to
->dataobj
, to
->index
);
480 tee_traverse(teeobject
*to
, visitproc visit
, void *arg
)
482 Py_VISIT((PyObject
*)to
->dataobj
);
487 tee_copy(teeobject
*to
)
491 newto
= PyObject_GC_New(teeobject
, &tee_type
);
494 Py_INCREF(to
->dataobj
);
495 newto
->dataobj
= to
->dataobj
;
496 newto
->index
= to
->index
;
497 newto
->weakreflist
= NULL
;
498 PyObject_GC_Track(newto
);
499 return (PyObject
*)newto
;
502 PyDoc_STRVAR(teecopy_doc
, "Returns an independent iterator.");
505 tee_fromiterable(PyObject
*iterable
)
510 it
= PyObject_GetIter(iterable
);
513 if (PyObject_TypeCheck(it
, &tee_type
)) {
514 to
= (teeobject
*)tee_copy((teeobject
*)it
);
518 to
= PyObject_GC_New(teeobject
, &tee_type
);
521 to
->dataobj
= (teedataobject
*)teedataobject_new(it
);
529 to
->weakreflist
= NULL
;
530 PyObject_GC_Track(to
);
533 return (PyObject
*)to
;
537 tee_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kw
)
541 if (!PyArg_UnpackTuple(args
, "tee", 1, 1, &iterable
))
543 return tee_fromiterable(iterable
);
547 tee_clear(teeobject
*to
)
549 if (to
->weakreflist
!= NULL
)
550 PyObject_ClearWeakRefs((PyObject
*) to
);
551 Py_CLEAR(to
->dataobj
);
556 tee_dealloc(teeobject
*to
)
558 PyObject_GC_UnTrack(to
);
563 PyDoc_STRVAR(teeobject_doc
,
564 "Iterator wrapped to make it copyable");
566 static PyMethodDef tee_methods
[] = {
567 {"__copy__", (PyCFunction
)tee_copy
, METH_NOARGS
, teecopy_doc
},
568 {NULL
, NULL
} /* sentinel */
571 static PyTypeObject tee_type
= {
572 PyVarObject_HEAD_INIT(NULL
, 0)
573 "itertools.tee", /* tp_name */
574 sizeof(teeobject
), /* tp_basicsize */
577 (destructor
)tee_dealloc
, /* tp_dealloc */
583 0, /* tp_as_number */
584 0, /* tp_as_sequence */
585 0, /* tp_as_mapping */
591 0, /* tp_as_buffer */
592 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
, /* tp_flags */
593 teeobject_doc
, /* tp_doc */
594 (traverseproc
)tee_traverse
, /* tp_traverse */
595 (inquiry
)tee_clear
, /* tp_clear */
596 0, /* tp_richcompare */
597 offsetof(teeobject
, weakreflist
), /* tp_weaklistoffset */
598 PyObject_SelfIter
, /* tp_iter */
599 (iternextfunc
)tee_next
, /* tp_iternext */
600 tee_methods
, /* tp_methods */
605 0, /* tp_descr_get */
606 0, /* tp_descr_set */
607 0, /* tp_dictoffset */
610 tee_new
, /* tp_new */
611 PyObject_GC_Del
, /* tp_free */
615 tee(PyObject
*self
, PyObject
*args
)
618 PyObject
*it
, *iterable
, *copyable
, *result
;
620 if (!PyArg_ParseTuple(args
, "O|n", &iterable
, &n
))
623 PyErr_SetString(PyExc_ValueError
, "n must be >= 0");
626 result
= PyTuple_New(n
);
631 it
= PyObject_GetIter(iterable
);
636 if (!PyObject_HasAttrString(it
, "__copy__")) {
637 copyable
= tee_fromiterable(it
);
639 if (copyable
== NULL
) {
645 PyTuple_SET_ITEM(result
, 0, copyable
);
646 for (i
=1 ; i
<n
; i
++) {
647 copyable
= PyObject_CallMethod(copyable
, "__copy__", NULL
);
648 if (copyable
== NULL
) {
652 PyTuple_SET_ITEM(result
, i
, copyable
);
657 PyDoc_STRVAR(tee_doc
,
658 "tee(iterable, n=2) --> tuple of n independent iterators.");
661 /* cycle object **********************************************************/
670 static PyTypeObject cycle_type
;
673 cycle_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
680 if (type
== &cycle_type
&& !_PyArg_NoKeywords("cycle()", kwds
))
683 if (!PyArg_UnpackTuple(args
, "cycle", 1, 1, &iterable
))
687 it
= PyObject_GetIter(iterable
);
691 saved
= PyList_New(0);
697 /* create cycleobject structure */
698 lz
= (cycleobject
*)type
->tp_alloc(type
, 0);
708 return (PyObject
*)lz
;
712 cycle_dealloc(cycleobject
*lz
)
714 PyObject_GC_UnTrack(lz
);
715 Py_XDECREF(lz
->saved
);
717 Py_TYPE(lz
)->tp_free(lz
);
721 cycle_traverse(cycleobject
*lz
, visitproc visit
, void *arg
)
729 cycle_next(cycleobject
*lz
)
736 item
= PyIter_Next(lz
->it
);
739 PyList_Append(lz
->saved
, item
);
742 if (PyErr_Occurred()) {
743 if (PyErr_ExceptionMatches(PyExc_StopIteration
))
748 if (PyList_Size(lz
->saved
) == 0)
750 it
= PyObject_GetIter(lz
->saved
);
760 PyDoc_STRVAR(cycle_doc
,
761 "cycle(iterable) --> cycle object\n\
763 Return elements from the iterable until it is exhausted.\n\
764 Then repeat the sequence indefinitely.");
766 static PyTypeObject cycle_type
= {
767 PyVarObject_HEAD_INIT(NULL
, 0)
768 "itertools.cycle", /* tp_name */
769 sizeof(cycleobject
), /* tp_basicsize */
772 (destructor
)cycle_dealloc
, /* tp_dealloc */
778 0, /* tp_as_number */
779 0, /* tp_as_sequence */
780 0, /* tp_as_mapping */
784 PyObject_GenericGetAttr
, /* tp_getattro */
786 0, /* tp_as_buffer */
787 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
788 Py_TPFLAGS_BASETYPE
, /* tp_flags */
789 cycle_doc
, /* tp_doc */
790 (traverseproc
)cycle_traverse
, /* tp_traverse */
792 0, /* tp_richcompare */
793 0, /* tp_weaklistoffset */
794 PyObject_SelfIter
, /* tp_iter */
795 (iternextfunc
)cycle_next
, /* tp_iternext */
801 0, /* tp_descr_get */
802 0, /* tp_descr_set */
803 0, /* tp_dictoffset */
806 cycle_new
, /* tp_new */
807 PyObject_GC_Del
, /* tp_free */
811 /* dropwhile object **********************************************************/
820 static PyTypeObject dropwhile_type
;
823 dropwhile_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
825 PyObject
*func
, *seq
;
829 if (type
== &dropwhile_type
&& !_PyArg_NoKeywords("dropwhile()", kwds
))
832 if (!PyArg_UnpackTuple(args
, "dropwhile", 2, 2, &func
, &seq
))
836 it
= PyObject_GetIter(seq
);
840 /* create dropwhileobject structure */
841 lz
= (dropwhileobject
*)type
->tp_alloc(type
, 0);
851 return (PyObject
*)lz
;
855 dropwhile_dealloc(dropwhileobject
*lz
)
857 PyObject_GC_UnTrack(lz
);
858 Py_XDECREF(lz
->func
);
860 Py_TYPE(lz
)->tp_free(lz
);
864 dropwhile_traverse(dropwhileobject
*lz
, visitproc visit
, void *arg
)
872 dropwhile_next(dropwhileobject
*lz
)
874 PyObject
*item
, *good
;
875 PyObject
*it
= lz
->it
;
877 PyObject
*(*iternext
)(PyObject
*);
879 assert(PyIter_Check(it
));
880 iternext
= *Py_TYPE(it
)->tp_iternext
;
888 good
= PyObject_CallFunctionObjArgs(lz
->func
, item
, NULL
);
893 ok
= PyObject_IsTrue(good
);
903 PyDoc_STRVAR(dropwhile_doc
,
904 "dropwhile(predicate, iterable) --> dropwhile object\n\
906 Drop items from the iterable while predicate(item) is true.\n\
907 Afterwards, return every element until the iterable is exhausted.");
909 static PyTypeObject dropwhile_type
= {
910 PyVarObject_HEAD_INIT(NULL
, 0)
911 "itertools.dropwhile", /* tp_name */
912 sizeof(dropwhileobject
), /* tp_basicsize */
915 (destructor
)dropwhile_dealloc
, /* tp_dealloc */
921 0, /* tp_as_number */
922 0, /* tp_as_sequence */
923 0, /* tp_as_mapping */
927 PyObject_GenericGetAttr
, /* tp_getattro */
929 0, /* tp_as_buffer */
930 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
931 Py_TPFLAGS_BASETYPE
, /* tp_flags */
932 dropwhile_doc
, /* tp_doc */
933 (traverseproc
)dropwhile_traverse
, /* tp_traverse */
935 0, /* tp_richcompare */
936 0, /* tp_weaklistoffset */
937 PyObject_SelfIter
, /* tp_iter */
938 (iternextfunc
)dropwhile_next
, /* tp_iternext */
944 0, /* tp_descr_get */
945 0, /* tp_descr_set */
946 0, /* tp_dictoffset */
949 dropwhile_new
, /* tp_new */
950 PyObject_GC_Del
, /* tp_free */
954 /* takewhile object **********************************************************/
963 static PyTypeObject takewhile_type
;
966 takewhile_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
968 PyObject
*func
, *seq
;
972 if (type
== &takewhile_type
&& !_PyArg_NoKeywords("takewhile()", kwds
))
975 if (!PyArg_UnpackTuple(args
, "takewhile", 2, 2, &func
, &seq
))
979 it
= PyObject_GetIter(seq
);
983 /* create takewhileobject structure */
984 lz
= (takewhileobject
*)type
->tp_alloc(type
, 0);
994 return (PyObject
*)lz
;
998 takewhile_dealloc(takewhileobject
*lz
)
1000 PyObject_GC_UnTrack(lz
);
1001 Py_XDECREF(lz
->func
);
1003 Py_TYPE(lz
)->tp_free(lz
);
1007 takewhile_traverse(takewhileobject
*lz
, visitproc visit
, void *arg
)
1015 takewhile_next(takewhileobject
*lz
)
1017 PyObject
*item
, *good
;
1018 PyObject
*it
= lz
->it
;
1024 assert(PyIter_Check(it
));
1025 item
= (*Py_TYPE(it
)->tp_iternext
)(it
);
1029 good
= PyObject_CallFunctionObjArgs(lz
->func
, item
, NULL
);
1034 ok
= PyObject_IsTrue(good
);
1043 PyDoc_STRVAR(takewhile_doc
,
1044 "takewhile(predicate, iterable) --> takewhile object\n\
1046 Return successive entries from an iterable as long as the \n\
1047 predicate evaluates to true for each entry.");
1049 static PyTypeObject takewhile_type
= {
1050 PyVarObject_HEAD_INIT(NULL
, 0)
1051 "itertools.takewhile", /* tp_name */
1052 sizeof(takewhileobject
), /* tp_basicsize */
1053 0, /* tp_itemsize */
1055 (destructor
)takewhile_dealloc
, /* tp_dealloc */
1061 0, /* tp_as_number */
1062 0, /* tp_as_sequence */
1063 0, /* tp_as_mapping */
1067 PyObject_GenericGetAttr
, /* tp_getattro */
1068 0, /* tp_setattro */
1069 0, /* tp_as_buffer */
1070 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1071 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1072 takewhile_doc
, /* tp_doc */
1073 (traverseproc
)takewhile_traverse
, /* tp_traverse */
1075 0, /* tp_richcompare */
1076 0, /* tp_weaklistoffset */
1077 PyObject_SelfIter
, /* tp_iter */
1078 (iternextfunc
)takewhile_next
, /* tp_iternext */
1084 0, /* tp_descr_get */
1085 0, /* tp_descr_set */
1086 0, /* tp_dictoffset */
1089 takewhile_new
, /* tp_new */
1090 PyObject_GC_Del
, /* tp_free */
1094 /* islice object ************************************************************/
1105 static PyTypeObject islice_type
;
1108 islice_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1111 Py_ssize_t start
=0, stop
=-1, step
=1;
1112 PyObject
*it
, *a1
=NULL
, *a2
=NULL
, *a3
=NULL
;
1116 if (type
== &islice_type
&& !_PyArg_NoKeywords("islice()", kwds
))
1119 if (!PyArg_UnpackTuple(args
, "islice", 2, 4, &seq
, &a1
, &a2
, &a3
))
1122 numargs
= PyTuple_Size(args
);
1124 if (a1
!= Py_None
) {
1125 stop
= PyInt_AsSsize_t(a1
);
1127 if (PyErr_Occurred())
1129 PyErr_SetString(PyExc_ValueError
,
1130 "Stop argument for islice() must be a non-negative integer or None.");
1136 start
= PyInt_AsSsize_t(a1
);
1137 if (start
== -1 && PyErr_Occurred())
1139 if (a2
!= Py_None
) {
1140 stop
= PyInt_AsSsize_t(a2
);
1142 if (PyErr_Occurred())
1144 PyErr_SetString(PyExc_ValueError
,
1145 "Stop argument for islice() must be a non-negative integer or None.");
1150 if (start
<0 || stop
<-1) {
1151 PyErr_SetString(PyExc_ValueError
,
1152 "Indices for islice() must be non-negative integers or None.");
1158 step
= PyInt_AsSsize_t(a3
);
1159 if (step
== -1 && PyErr_Occurred())
1163 PyErr_SetString(PyExc_ValueError
,
1164 "Step for islice() must be a positive integer or None.");
1169 it
= PyObject_GetIter(seq
);
1173 /* create isliceobject structure */
1174 lz
= (isliceobject
*)type
->tp_alloc(type
, 0);
1185 return (PyObject
*)lz
;
1189 islice_dealloc(isliceobject
*lz
)
1191 PyObject_GC_UnTrack(lz
);
1193 Py_TYPE(lz
)->tp_free(lz
);
1197 islice_traverse(isliceobject
*lz
, visitproc visit
, void *arg
)
1204 islice_next(isliceobject
*lz
)
1207 PyObject
*it
= lz
->it
;
1209 PyObject
*(*iternext
)(PyObject
*);
1211 assert(PyIter_Check(it
));
1212 iternext
= *Py_TYPE(it
)->tp_iternext
;
1213 while (lz
->cnt
< lz
->next
) {
1214 item
= iternext(it
);
1220 if (lz
->stop
!= -1 && lz
->cnt
>= lz
->stop
)
1222 assert(PyIter_Check(it
));
1223 item
= iternext(it
);
1228 lz
->next
+= lz
->step
;
1229 if (lz
->next
< oldnext
) /* Check for overflow */
1230 lz
->next
= lz
->stop
;
1234 PyDoc_STRVAR(islice_doc
,
1235 "islice(iterable, [start,] stop [, step]) --> islice object\n\
1237 Return an iterator whose next() method returns selected values from an\n\
1238 iterable. If start is specified, will skip all preceding elements;\n\
1239 otherwise, start defaults to zero. Step defaults to one. If\n\
1240 specified as another value, step determines how many values are \n\
1241 skipped between successive calls. Works like a slice() on a list\n\
1242 but returns an iterator.");
1244 static PyTypeObject islice_type
= {
1245 PyVarObject_HEAD_INIT(NULL
, 0)
1246 "itertools.islice", /* tp_name */
1247 sizeof(isliceobject
), /* tp_basicsize */
1248 0, /* tp_itemsize */
1250 (destructor
)islice_dealloc
, /* tp_dealloc */
1256 0, /* tp_as_number */
1257 0, /* tp_as_sequence */
1258 0, /* tp_as_mapping */
1262 PyObject_GenericGetAttr
, /* tp_getattro */
1263 0, /* tp_setattro */
1264 0, /* tp_as_buffer */
1265 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1266 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1267 islice_doc
, /* tp_doc */
1268 (traverseproc
)islice_traverse
, /* tp_traverse */
1270 0, /* tp_richcompare */
1271 0, /* tp_weaklistoffset */
1272 PyObject_SelfIter
, /* tp_iter */
1273 (iternextfunc
)islice_next
, /* tp_iternext */
1279 0, /* tp_descr_get */
1280 0, /* tp_descr_set */
1281 0, /* tp_dictoffset */
1284 islice_new
, /* tp_new */
1285 PyObject_GC_Del
, /* tp_free */
1289 /* starmap object ************************************************************/
1297 static PyTypeObject starmap_type
;
1300 starmap_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1302 PyObject
*func
, *seq
;
1306 if (type
== &starmap_type
&& !_PyArg_NoKeywords("starmap()", kwds
))
1309 if (!PyArg_UnpackTuple(args
, "starmap", 2, 2, &func
, &seq
))
1313 it
= PyObject_GetIter(seq
);
1317 /* create starmapobject structure */
1318 lz
= (starmapobject
*)type
->tp_alloc(type
, 0);
1327 return (PyObject
*)lz
;
1331 starmap_dealloc(starmapobject
*lz
)
1333 PyObject_GC_UnTrack(lz
);
1334 Py_XDECREF(lz
->func
);
1336 Py_TYPE(lz
)->tp_free(lz
);
1340 starmap_traverse(starmapobject
*lz
, visitproc visit
, void *arg
)
1348 starmap_next(starmapobject
*lz
)
1352 PyObject
*it
= lz
->it
;
1354 assert(PyIter_Check(it
));
1355 args
= (*Py_TYPE(it
)->tp_iternext
)(it
);
1358 if (!PyTuple_CheckExact(args
)) {
1359 PyObject
*newargs
= PySequence_Tuple(args
);
1361 if (newargs
== NULL
)
1365 result
= PyObject_Call(lz
->func
, args
, NULL
);
1370 PyDoc_STRVAR(starmap_doc
,
1371 "starmap(function, sequence) --> starmap object\n\
1373 Return an iterator whose values are returned from the function evaluated\n\
1374 with a argument tuple taken from the given sequence.");
1376 static PyTypeObject starmap_type
= {
1377 PyVarObject_HEAD_INIT(NULL
, 0)
1378 "itertools.starmap", /* tp_name */
1379 sizeof(starmapobject
), /* tp_basicsize */
1380 0, /* tp_itemsize */
1382 (destructor
)starmap_dealloc
, /* tp_dealloc */
1388 0, /* tp_as_number */
1389 0, /* tp_as_sequence */
1390 0, /* tp_as_mapping */
1394 PyObject_GenericGetAttr
, /* tp_getattro */
1395 0, /* tp_setattro */
1396 0, /* tp_as_buffer */
1397 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1398 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1399 starmap_doc
, /* tp_doc */
1400 (traverseproc
)starmap_traverse
, /* tp_traverse */
1402 0, /* tp_richcompare */
1403 0, /* tp_weaklistoffset */
1404 PyObject_SelfIter
, /* tp_iter */
1405 (iternextfunc
)starmap_next
, /* tp_iternext */
1411 0, /* tp_descr_get */
1412 0, /* tp_descr_set */
1413 0, /* tp_dictoffset */
1416 starmap_new
, /* tp_new */
1417 PyObject_GC_Del
, /* tp_free */
1421 /* imap object ************************************************************/
1429 static PyTypeObject imap_type
;
1432 imap_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1434 PyObject
*it
, *iters
, *func
;
1436 Py_ssize_t numargs
, i
;
1438 if (type
== &imap_type
&& !_PyArg_NoKeywords("imap()", kwds
))
1441 numargs
= PyTuple_Size(args
);
1443 PyErr_SetString(PyExc_TypeError
,
1444 "imap() must have at least two arguments.");
1448 iters
= PyTuple_New(numargs
-1);
1452 for (i
=1 ; i
<numargs
; i
++) {
1454 it
= PyObject_GetIter(PyTuple_GET_ITEM(args
, i
));
1459 PyTuple_SET_ITEM(iters
, i
-1, it
);
1462 /* create imapobject structure */
1463 lz
= (imapobject
*)type
->tp_alloc(type
, 0);
1469 func
= PyTuple_GET_ITEM(args
, 0);
1473 return (PyObject
*)lz
;
1477 imap_dealloc(imapobject
*lz
)
1479 PyObject_GC_UnTrack(lz
);
1480 Py_XDECREF(lz
->iters
);
1481 Py_XDECREF(lz
->func
);
1482 Py_TYPE(lz
)->tp_free(lz
);
1486 imap_traverse(imapobject
*lz
, visitproc visit
, void *arg
)
1488 Py_VISIT(lz
->iters
);
1494 imap() is an iterator version of __builtins__.map() except that it does
1495 not have the None fill-in feature. That was intentionally left out for
1496 the following reasons:
1498 1) Itertools are designed to be easily combined and chained together.
1499 Having all tools stop with the shortest input is a unifying principle
1500 that makes it easier to combine finite iterators (supplying data) with
1501 infinite iterators like count() and repeat() (for supplying sequential
1502 or constant arguments to a function).
1504 2) In typical use cases for combining itertools, having one finite data
1505 supplier run out before another is likely to be an error condition which
1506 should not pass silently by automatically supplying None.
1508 3) The use cases for automatic None fill-in are rare -- not many functions
1509 do something useful when a parameter suddenly switches type and becomes
1512 4) If a need does arise, it can be met by __builtins__.map() or by
1513 writing: chain(iterable, repeat(None)).
1515 5) Similar toolsets in Haskell and SML do not have automatic None fill-in.
1519 imap_next(imapobject
*lz
)
1524 Py_ssize_t numargs
, i
;
1526 numargs
= PyTuple_Size(lz
->iters
);
1527 argtuple
= PyTuple_New(numargs
);
1528 if (argtuple
== NULL
)
1531 for (i
=0 ; i
<numargs
; i
++) {
1532 val
= PyIter_Next(PyTuple_GET_ITEM(lz
->iters
, i
));
1534 Py_DECREF(argtuple
);
1537 PyTuple_SET_ITEM(argtuple
, i
, val
);
1539 if (lz
->func
== Py_None
)
1541 result
= PyObject_Call(lz
->func
, argtuple
, NULL
);
1542 Py_DECREF(argtuple
);
1546 PyDoc_STRVAR(imap_doc
,
1547 "imap(func, *iterables) --> imap object\n\
1549 Make an iterator that computes the function using arguments from\n\
1550 each of the iterables. Like map() except that it returns\n\
1551 an iterator instead of a list and that it stops when the shortest\n\
1552 iterable is exhausted instead of filling in None for shorter\n\
1555 static PyTypeObject imap_type
= {
1556 PyVarObject_HEAD_INIT(NULL
, 0)
1557 "itertools.imap", /* tp_name */
1558 sizeof(imapobject
), /* tp_basicsize */
1559 0, /* tp_itemsize */
1561 (destructor
)imap_dealloc
, /* tp_dealloc */
1567 0, /* tp_as_number */
1568 0, /* tp_as_sequence */
1569 0, /* tp_as_mapping */
1573 PyObject_GenericGetAttr
, /* tp_getattro */
1574 0, /* tp_setattro */
1575 0, /* tp_as_buffer */
1576 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1577 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1578 imap_doc
, /* tp_doc */
1579 (traverseproc
)imap_traverse
, /* tp_traverse */
1581 0, /* tp_richcompare */
1582 0, /* tp_weaklistoffset */
1583 PyObject_SelfIter
, /* tp_iter */
1584 (iternextfunc
)imap_next
, /* tp_iternext */
1590 0, /* tp_descr_get */
1591 0, /* tp_descr_set */
1592 0, /* tp_dictoffset */
1595 imap_new
, /* tp_new */
1596 PyObject_GC_Del
, /* tp_free */
1600 /* chain object ************************************************************/
1604 PyObject
*source
; /* Iterator over input iterables */
1605 PyObject
*active
; /* Currently running input iterator */
1608 static PyTypeObject chain_type
;
1611 chain_new_internal(PyTypeObject
*type
, PyObject
*source
)
1615 lz
= (chainobject
*)type
->tp_alloc(type
, 0);
1621 lz
->source
= source
;
1623 return (PyObject
*)lz
;
1627 chain_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1631 if (type
== &chain_type
&& !_PyArg_NoKeywords("chain()", kwds
))
1634 source
= PyObject_GetIter(args
);
1638 return chain_new_internal(type
, source
);
1642 chain_new_from_iterable(PyTypeObject
*type
, PyObject
*arg
)
1646 source
= PyObject_GetIter(arg
);
1650 return chain_new_internal(type
, source
);
1654 chain_dealloc(chainobject
*lz
)
1656 PyObject_GC_UnTrack(lz
);
1657 Py_XDECREF(lz
->active
);
1658 Py_XDECREF(lz
->source
);
1659 Py_TYPE(lz
)->tp_free(lz
);
1663 chain_traverse(chainobject
*lz
, visitproc visit
, void *arg
)
1665 Py_VISIT(lz
->source
);
1666 Py_VISIT(lz
->active
);
1671 chain_next(chainobject
*lz
)
1675 if (lz
->source
== NULL
)
1676 return NULL
; /* already stopped */
1678 if (lz
->active
== NULL
) {
1679 PyObject
*iterable
= PyIter_Next(lz
->source
);
1680 if (iterable
== NULL
) {
1681 Py_CLEAR(lz
->source
);
1682 return NULL
; /* no more input sources */
1684 lz
->active
= PyObject_GetIter(iterable
);
1685 if (lz
->active
== NULL
) {
1686 Py_DECREF(iterable
);
1687 Py_CLEAR(lz
->source
);
1688 return NULL
; /* input not iterable */
1691 item
= PyIter_Next(lz
->active
);
1694 if (PyErr_Occurred()) {
1695 if (PyErr_ExceptionMatches(PyExc_StopIteration
))
1698 return NULL
; /* input raised an exception */
1700 Py_CLEAR(lz
->active
);
1701 return chain_next(lz
); /* recurse and use next active */
1704 PyDoc_STRVAR(chain_doc
,
1705 "chain(*iterables) --> chain object\n\
1707 Return a chain object whose .next() method returns elements from the\n\
1708 first iterable until it is exhausted, then elements from the next\n\
1709 iterable, until all of the iterables are exhausted.");
1711 PyDoc_STRVAR(chain_from_iterable_doc
,
1712 "chain.from_iterable(iterable) --> chain object\n\
1714 Alternate chain() contructor taking a single iterable argument\n\
1715 that evaluates lazily.");
1717 static PyMethodDef chain_methods
[] = {
1718 {"from_iterable", (PyCFunction
) chain_new_from_iterable
, METH_O
| METH_CLASS
,
1719 chain_from_iterable_doc
},
1720 {NULL
, NULL
} /* sentinel */
1723 static PyTypeObject chain_type
= {
1724 PyVarObject_HEAD_INIT(NULL
, 0)
1725 "itertools.chain", /* tp_name */
1726 sizeof(chainobject
), /* tp_basicsize */
1727 0, /* tp_itemsize */
1729 (destructor
)chain_dealloc
, /* tp_dealloc */
1735 0, /* tp_as_number */
1736 0, /* tp_as_sequence */
1737 0, /* tp_as_mapping */
1741 PyObject_GenericGetAttr
, /* tp_getattro */
1742 0, /* tp_setattro */
1743 0, /* tp_as_buffer */
1744 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1745 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1746 chain_doc
, /* tp_doc */
1747 (traverseproc
)chain_traverse
, /* tp_traverse */
1749 0, /* tp_richcompare */
1750 0, /* tp_weaklistoffset */
1751 PyObject_SelfIter
, /* tp_iter */
1752 (iternextfunc
)chain_next
, /* tp_iternext */
1753 chain_methods
, /* tp_methods */
1758 0, /* tp_descr_get */
1759 0, /* tp_descr_set */
1760 0, /* tp_dictoffset */
1763 chain_new
, /* tp_new */
1764 PyObject_GC_Del
, /* tp_free */
1768 /* product object ************************************************************/
1772 PyObject
*pools
; /* tuple of pool tuples */
1773 Py_ssize_t
*indices
; /* one index per pool */
1774 PyObject
*result
; /* most recently returned result tuple */
1775 int stopped
; /* set to 1 when the product iterator is exhausted */
1778 static PyTypeObject product_type
;
1781 product_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
1784 Py_ssize_t nargs
, npools
, repeat
=1;
1785 PyObject
*pools
= NULL
;
1786 Py_ssize_t
*indices
= NULL
;
1790 char *kwlist
[] = {"repeat", 0};
1791 PyObject
*tmpargs
= PyTuple_New(0);
1792 if (tmpargs
== NULL
)
1794 if (!PyArg_ParseTupleAndKeywords(tmpargs
, kwds
, "|n:product", kwlist
, &repeat
)) {
1800 PyErr_SetString(PyExc_ValueError
,
1801 "repeat argument cannot be negative");
1806 assert(PyTuple_Check(args
));
1807 nargs
= (repeat
== 0) ? 0 : PyTuple_GET_SIZE(args
);
1808 npools
= nargs
* repeat
;
1810 indices
= PyMem_Malloc(npools
* sizeof(Py_ssize_t
));
1811 if (indices
== NULL
) {
1816 pools
= PyTuple_New(npools
);
1820 for (i
=0; i
< nargs
; ++i
) {
1821 PyObject
*item
= PyTuple_GET_ITEM(args
, i
);
1822 PyObject
*pool
= PySequence_Tuple(item
);
1825 PyTuple_SET_ITEM(pools
, i
, pool
);
1828 for ( ; i
< npools
; ++i
) {
1829 PyObject
*pool
= PyTuple_GET_ITEM(pools
, i
- nargs
);
1831 PyTuple_SET_ITEM(pools
, i
, pool
);
1835 /* create productobject structure */
1836 lz
= (productobject
*)type
->tp_alloc(type
, 0);
1841 lz
->indices
= indices
;
1845 return (PyObject
*)lz
;
1848 if (indices
!= NULL
)
1849 PyMem_Free(indices
);
1855 product_dealloc(productobject
*lz
)
1857 PyObject_GC_UnTrack(lz
);
1858 Py_XDECREF(lz
->pools
);
1859 Py_XDECREF(lz
->result
);
1860 PyMem_Free(lz
->indices
);
1861 Py_TYPE(lz
)->tp_free(lz
);
1865 product_traverse(productobject
*lz
, visitproc visit
, void *arg
)
1867 Py_VISIT(lz
->pools
);
1868 Py_VISIT(lz
->result
);
1873 product_next(productobject
*lz
)
1878 PyObject
*pools
= lz
->pools
;
1879 PyObject
*result
= lz
->result
;
1880 Py_ssize_t npools
= PyTuple_GET_SIZE(pools
);
1886 if (result
== NULL
) {
1887 /* On the first pass, return an initial tuple filled with the
1888 first element from each pool. If any pool is empty, then
1889 whole product is empty and we're already done */
1892 result
= PyTuple_New(npools
);
1895 lz
->result
= result
;
1896 for (i
=0; i
< npools
; i
++) {
1897 pool
= PyTuple_GET_ITEM(pools
, i
);
1898 if (PyTuple_GET_SIZE(pool
) == 0)
1900 elem
= PyTuple_GET_ITEM(pool
, 0);
1902 PyTuple_SET_ITEM(result
, i
, elem
);
1905 Py_ssize_t
*indices
= lz
->indices
;
1907 /* Copy the previous result tuple or re-use it if available */
1908 if (Py_REFCNT(result
) > 1) {
1909 PyObject
*old_result
= result
;
1910 result
= PyTuple_New(npools
);
1913 lz
->result
= result
;
1914 for (i
=0; i
< npools
; i
++) {
1915 elem
= PyTuple_GET_ITEM(old_result
, i
);
1917 PyTuple_SET_ITEM(result
, i
, elem
);
1919 Py_DECREF(old_result
);
1921 /* Now, we've got the only copy so we can update it in-place */
1922 assert (Py_REFCNT(result
) == 1);
1924 /* Update the pool indices right-to-left. Only advance to the
1925 next pool when the previous one rolls-over */
1926 for (i
=npools
-1 ; i
>= 0 ; i
--) {
1927 pool
= PyTuple_GET_ITEM(pools
, i
);
1929 if (indices
[i
] == PyTuple_GET_SIZE(pool
)) {
1930 /* Roll-over and advance to next pool */
1932 elem
= PyTuple_GET_ITEM(pool
, 0);
1934 oldelem
= PyTuple_GET_ITEM(result
, i
);
1935 PyTuple_SET_ITEM(result
, i
, elem
);
1938 /* No rollover. Just increment and stop here. */
1939 elem
= PyTuple_GET_ITEM(pool
, indices
[i
]);
1941 oldelem
= PyTuple_GET_ITEM(result
, i
);
1942 PyTuple_SET_ITEM(result
, i
, elem
);
1948 /* If i is negative, then the indices have all rolled-over
1962 PyDoc_STRVAR(product_doc
,
1963 "product(*iterables) --> product object\n\
1965 Cartesian product of input iterables. Equivalent to nested for-loops.\n\n\
1966 For example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\n\
1967 The leftmost iterators are in the outermost for-loop, so the output tuples\n\
1968 cycle in a manner similar to an odometer (with the rightmost element changing\n\
1969 on every iteration).\n\n\
1970 product('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\n\
1971 product((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...");
1973 static PyTypeObject product_type
= {
1974 PyVarObject_HEAD_INIT(NULL
, 0)
1975 "itertools.product", /* tp_name */
1976 sizeof(productobject
), /* tp_basicsize */
1977 0, /* tp_itemsize */
1979 (destructor
)product_dealloc
, /* tp_dealloc */
1985 0, /* tp_as_number */
1986 0, /* tp_as_sequence */
1987 0, /* tp_as_mapping */
1991 PyObject_GenericGetAttr
, /* tp_getattro */
1992 0, /* tp_setattro */
1993 0, /* tp_as_buffer */
1994 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
1995 Py_TPFLAGS_BASETYPE
, /* tp_flags */
1996 product_doc
, /* tp_doc */
1997 (traverseproc
)product_traverse
, /* tp_traverse */
1999 0, /* tp_richcompare */
2000 0, /* tp_weaklistoffset */
2001 PyObject_SelfIter
, /* tp_iter */
2002 (iternextfunc
)product_next
, /* tp_iternext */
2008 0, /* tp_descr_get */
2009 0, /* tp_descr_set */
2010 0, /* tp_dictoffset */
2013 product_new
, /* tp_new */
2014 PyObject_GC_Del
, /* tp_free */
2018 /* combinations object ************************************************************/
2022 PyObject
*pool
; /* input converted to a tuple */
2023 Py_ssize_t
*indices
; /* one index per result element */
2024 PyObject
*result
; /* most recently returned result tuple */
2025 Py_ssize_t r
; /* size of result tuple */
2026 int stopped
; /* set to 1 when the combinations iterator is exhausted */
2027 } combinationsobject
;
2029 static PyTypeObject combinations_type
;
2032 combinations_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2034 combinationsobject
*co
;
2037 PyObject
*pool
= NULL
;
2038 PyObject
*iterable
= NULL
;
2039 Py_ssize_t
*indices
= NULL
;
2041 static char *kwargs
[] = {"iterable", "r", NULL
};
2043 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "On:combinations", kwargs
,
2047 pool
= PySequence_Tuple(iterable
);
2050 n
= PyTuple_GET_SIZE(pool
);
2052 PyErr_SetString(PyExc_ValueError
, "r must be non-negative");
2056 PyErr_SetString(PyExc_ValueError
, "r cannot be bigger than the iterable");
2060 indices
= PyMem_Malloc(r
* sizeof(Py_ssize_t
));
2061 if (indices
== NULL
) {
2066 for (i
=0 ; i
<r
; i
++)
2069 /* create combinationsobject structure */
2070 co
= (combinationsobject
*)type
->tp_alloc(type
, 0);
2075 co
->indices
= indices
;
2080 return (PyObject
*)co
;
2083 if (indices
!= NULL
)
2084 PyMem_Free(indices
);
2090 combinations_dealloc(combinationsobject
*co
)
2092 PyObject_GC_UnTrack(co
);
2093 Py_XDECREF(co
->pool
);
2094 Py_XDECREF(co
->result
);
2095 PyMem_Free(co
->indices
);
2096 Py_TYPE(co
)->tp_free(co
);
2100 combinations_traverse(combinationsobject
*co
, visitproc visit
, void *arg
)
2103 Py_VISIT(co
->result
);
2108 combinations_next(combinationsobject
*co
)
2112 PyObject
*pool
= co
->pool
;
2113 Py_ssize_t
*indices
= co
->indices
;
2114 PyObject
*result
= co
->result
;
2115 Py_ssize_t n
= PyTuple_GET_SIZE(pool
);
2116 Py_ssize_t r
= co
->r
;
2117 Py_ssize_t i
, j
, index
;
2122 if (result
== NULL
) {
2123 /* On the first pass, initialize result tuple using the indices */
2124 result
= PyTuple_New(r
);
2127 co
->result
= result
;
2128 for (i
=0; i
<r
; i
++) {
2130 elem
= PyTuple_GET_ITEM(pool
, index
);
2132 PyTuple_SET_ITEM(result
, i
, elem
);
2135 /* Copy the previous result tuple or re-use it if available */
2136 if (Py_REFCNT(result
) > 1) {
2137 PyObject
*old_result
= result
;
2138 result
= PyTuple_New(r
);
2141 co
->result
= result
;
2142 for (i
=0; i
<r
; i
++) {
2143 elem
= PyTuple_GET_ITEM(old_result
, i
);
2145 PyTuple_SET_ITEM(result
, i
, elem
);
2147 Py_DECREF(old_result
);
2149 /* Now, we've got the only copy so we can update it in-place
2150 * CPython's empty tuple is a singleton and cached in
2151 * PyTuple's freelist.
2153 assert(r
== 0 || Py_REFCNT(result
) == 1);
2155 /* Scan indices right-to-left until finding one that is not
2156 at its maximum (i + n - r). */
2157 for (i
=r
-1 ; i
>= 0 && indices
[i
] == i
+n
-r
; i
--)
2160 /* If i is negative, then the indices are all at
2161 their maximum value and we're done. */
2165 /* Increment the current index which we know is not at its
2166 maximum. Then move back to the right setting each index
2167 to its lowest possible value (one higher than the index
2168 to its left -- this maintains the sort order invariant). */
2170 for (j
=i
+1 ; j
<r
; j
++)
2171 indices
[j
] = indices
[j
-1] + 1;
2173 /* Update the result tuple for the new indices
2174 starting with i, the leftmost index that changed */
2175 for ( ; i
<r
; i
++) {
2177 elem
= PyTuple_GET_ITEM(pool
, index
);
2179 oldelem
= PyTuple_GET_ITEM(result
, i
);
2180 PyTuple_SET_ITEM(result
, i
, elem
);
2193 PyDoc_STRVAR(combinations_doc
,
2194 "combinations(iterables) --> combinations object\n\
2196 Return successive r-length combinations of elements in the iterable.\n\n\
2197 combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)");
2199 static PyTypeObject combinations_type
= {
2200 PyVarObject_HEAD_INIT(NULL
, 0)
2201 "itertools.combinations", /* tp_name */
2202 sizeof(combinationsobject
), /* tp_basicsize */
2203 0, /* tp_itemsize */
2205 (destructor
)combinations_dealloc
, /* tp_dealloc */
2211 0, /* tp_as_number */
2212 0, /* tp_as_sequence */
2213 0, /* tp_as_mapping */
2217 PyObject_GenericGetAttr
, /* tp_getattro */
2218 0, /* tp_setattro */
2219 0, /* tp_as_buffer */
2220 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2221 Py_TPFLAGS_BASETYPE
, /* tp_flags */
2222 combinations_doc
, /* tp_doc */
2223 (traverseproc
)combinations_traverse
, /* tp_traverse */
2225 0, /* tp_richcompare */
2226 0, /* tp_weaklistoffset */
2227 PyObject_SelfIter
, /* tp_iter */
2228 (iternextfunc
)combinations_next
, /* tp_iternext */
2234 0, /* tp_descr_get */
2235 0, /* tp_descr_set */
2236 0, /* tp_dictoffset */
2239 combinations_new
, /* tp_new */
2240 PyObject_GC_Del
, /* tp_free */
2244 /* ifilter object ************************************************************/
2252 static PyTypeObject ifilter_type
;
2255 ifilter_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2257 PyObject
*func
, *seq
;
2261 if (type
== &ifilter_type
&& !_PyArg_NoKeywords("ifilter()", kwds
))
2264 if (!PyArg_UnpackTuple(args
, "ifilter", 2, 2, &func
, &seq
))
2268 it
= PyObject_GetIter(seq
);
2272 /* create ifilterobject structure */
2273 lz
= (ifilterobject
*)type
->tp_alloc(type
, 0);
2282 return (PyObject
*)lz
;
2286 ifilter_dealloc(ifilterobject
*lz
)
2288 PyObject_GC_UnTrack(lz
);
2289 Py_XDECREF(lz
->func
);
2291 Py_TYPE(lz
)->tp_free(lz
);
2295 ifilter_traverse(ifilterobject
*lz
, visitproc visit
, void *arg
)
2303 ifilter_next(ifilterobject
*lz
)
2306 PyObject
*it
= lz
->it
;
2308 PyObject
*(*iternext
)(PyObject
*);
2310 assert(PyIter_Check(it
));
2311 iternext
= *Py_TYPE(it
)->tp_iternext
;
2313 item
= iternext(it
);
2317 if (lz
->func
== Py_None
|| lz
->func
== (PyObject
*)&PyBool_Type
) {
2318 ok
= PyObject_IsTrue(item
);
2321 good
= PyObject_CallFunctionObjArgs(lz
->func
,
2327 ok
= PyObject_IsTrue(good
);
2336 PyDoc_STRVAR(ifilter_doc
,
2337 "ifilter(function or None, sequence) --> ifilter object\n\
2339 Return those items of sequence for which function(item) is true.\n\
2340 If function is None, return the items that are true.");
2342 static PyTypeObject ifilter_type
= {
2343 PyVarObject_HEAD_INIT(NULL
, 0)
2344 "itertools.ifilter", /* tp_name */
2345 sizeof(ifilterobject
), /* tp_basicsize */
2346 0, /* tp_itemsize */
2348 (destructor
)ifilter_dealloc
, /* tp_dealloc */
2354 0, /* tp_as_number */
2355 0, /* tp_as_sequence */
2356 0, /* tp_as_mapping */
2360 PyObject_GenericGetAttr
, /* tp_getattro */
2361 0, /* tp_setattro */
2362 0, /* tp_as_buffer */
2363 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2364 Py_TPFLAGS_BASETYPE
, /* tp_flags */
2365 ifilter_doc
, /* tp_doc */
2366 (traverseproc
)ifilter_traverse
, /* tp_traverse */
2368 0, /* tp_richcompare */
2369 0, /* tp_weaklistoffset */
2370 PyObject_SelfIter
, /* tp_iter */
2371 (iternextfunc
)ifilter_next
, /* tp_iternext */
2377 0, /* tp_descr_get */
2378 0, /* tp_descr_set */
2379 0, /* tp_dictoffset */
2382 ifilter_new
, /* tp_new */
2383 PyObject_GC_Del
, /* tp_free */
2387 /* ifilterfalse object ************************************************************/
2393 } ifilterfalseobject
;
2395 static PyTypeObject ifilterfalse_type
;
2398 ifilterfalse_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2400 PyObject
*func
, *seq
;
2402 ifilterfalseobject
*lz
;
2404 if (type
== &ifilterfalse_type
&&
2405 !_PyArg_NoKeywords("ifilterfalse()", kwds
))
2408 if (!PyArg_UnpackTuple(args
, "ifilterfalse", 2, 2, &func
, &seq
))
2412 it
= PyObject_GetIter(seq
);
2416 /* create ifilterfalseobject structure */
2417 lz
= (ifilterfalseobject
*)type
->tp_alloc(type
, 0);
2426 return (PyObject
*)lz
;
2430 ifilterfalse_dealloc(ifilterfalseobject
*lz
)
2432 PyObject_GC_UnTrack(lz
);
2433 Py_XDECREF(lz
->func
);
2435 Py_TYPE(lz
)->tp_free(lz
);
2439 ifilterfalse_traverse(ifilterfalseobject
*lz
, visitproc visit
, void *arg
)
2447 ifilterfalse_next(ifilterfalseobject
*lz
)
2450 PyObject
*it
= lz
->it
;
2452 PyObject
*(*iternext
)(PyObject
*);
2454 assert(PyIter_Check(it
));
2455 iternext
= *Py_TYPE(it
)->tp_iternext
;
2457 item
= iternext(it
);
2461 if (lz
->func
== Py_None
|| lz
->func
== (PyObject
*)&PyBool_Type
) {
2462 ok
= PyObject_IsTrue(item
);
2465 good
= PyObject_CallFunctionObjArgs(lz
->func
,
2471 ok
= PyObject_IsTrue(good
);
2480 PyDoc_STRVAR(ifilterfalse_doc
,
2481 "ifilterfalse(function or None, sequence) --> ifilterfalse object\n\
2483 Return those items of sequence for which function(item) is false.\n\
2484 If function is None, return the items that are false.");
2486 static PyTypeObject ifilterfalse_type
= {
2487 PyVarObject_HEAD_INIT(NULL
, 0)
2488 "itertools.ifilterfalse", /* tp_name */
2489 sizeof(ifilterfalseobject
), /* tp_basicsize */
2490 0, /* tp_itemsize */
2492 (destructor
)ifilterfalse_dealloc
, /* tp_dealloc */
2498 0, /* tp_as_number */
2499 0, /* tp_as_sequence */
2500 0, /* tp_as_mapping */
2504 PyObject_GenericGetAttr
, /* tp_getattro */
2505 0, /* tp_setattro */
2506 0, /* tp_as_buffer */
2507 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2508 Py_TPFLAGS_BASETYPE
, /* tp_flags */
2509 ifilterfalse_doc
, /* tp_doc */
2510 (traverseproc
)ifilterfalse_traverse
, /* tp_traverse */
2512 0, /* tp_richcompare */
2513 0, /* tp_weaklistoffset */
2514 PyObject_SelfIter
, /* tp_iter */
2515 (iternextfunc
)ifilterfalse_next
, /* tp_iternext */
2521 0, /* tp_descr_get */
2522 0, /* tp_descr_set */
2523 0, /* tp_dictoffset */
2526 ifilterfalse_new
, /* tp_new */
2527 PyObject_GC_Del
, /* tp_free */
2531 /* count object ************************************************************/
2536 PyObject
*long_cnt
; /* Arbitrarily large count when cnt >= PY_SSIZE_T_MAX */
2539 static PyTypeObject count_type
;
2542 count_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2546 PyObject
*cnt_arg
= NULL
;
2547 PyObject
*long_cnt
= NULL
;
2549 if (type
== &count_type
&& !_PyArg_NoKeywords("count()", kwds
))
2552 if (!PyArg_UnpackTuple(args
, "count", 0, 1, &cnt_arg
))
2555 if (cnt_arg
!= NULL
) {
2556 cnt
= PyInt_AsSsize_t(cnt_arg
);
2557 if (cnt
== -1 && PyErr_Occurred()) {
2559 if (!PyLong_Check(cnt_arg
)) {
2560 PyErr_SetString(PyExc_TypeError
, "an integer is required");
2564 Py_INCREF(long_cnt
);
2565 cnt
= PY_SSIZE_T_MAX
;
2569 /* create countobject structure */
2570 lz
= (countobject
*)PyObject_New(countobject
, &count_type
);
2572 Py_XDECREF(long_cnt
);
2576 lz
->long_cnt
= long_cnt
;
2578 return (PyObject
*)lz
;
2582 count_dealloc(countobject
*lz
)
2584 Py_XDECREF(lz
->long_cnt
);
2589 count_nextlong(countobject
*lz
)
2591 static PyObject
*one
= NULL
;
2593 PyObject
*stepped_up
;
2595 if (lz
->long_cnt
== NULL
) {
2596 lz
->long_cnt
= PyInt_FromSsize_t(PY_SSIZE_T_MAX
);
2597 if (lz
->long_cnt
== NULL
)
2601 one
= PyInt_FromLong(1);
2606 assert(cnt
!= NULL
);
2607 stepped_up
= PyNumber_Add(cnt
, one
);
2608 if (stepped_up
== NULL
)
2610 lz
->long_cnt
= stepped_up
;
2615 count_next(countobject
*lz
)
2617 if (lz
->cnt
== PY_SSIZE_T_MAX
)
2618 return count_nextlong(lz
);
2619 return PyInt_FromSsize_t(lz
->cnt
++);
2623 count_repr(countobject
*lz
)
2628 if (lz
->cnt
!= PY_SSIZE_T_MAX
)
2629 return PyString_FromFormat("count(%zd)", lz
->cnt
);
2631 cnt_repr
= PyObject_Repr(lz
->long_cnt
);
2632 if (cnt_repr
== NULL
)
2634 result
= PyString_FromFormat("count(%s)", PyString_AS_STRING(cnt_repr
));
2635 Py_DECREF(cnt_repr
);
2639 PyDoc_STRVAR(count_doc
,
2640 "count([firstval]) --> count object\n\
2642 Return a count object whose .next() method returns consecutive\n\
2643 integers starting from zero or, if specified, from firstval.");
2645 static PyTypeObject count_type
= {
2646 PyVarObject_HEAD_INIT(NULL
, 0)
2647 "itertools.count", /* tp_name */
2648 sizeof(countobject
), /* tp_basicsize */
2649 0, /* tp_itemsize */
2651 (destructor
)count_dealloc
, /* tp_dealloc */
2656 (reprfunc
)count_repr
, /* tp_repr */
2657 0, /* tp_as_number */
2658 0, /* tp_as_sequence */
2659 0, /* tp_as_mapping */
2663 PyObject_GenericGetAttr
, /* tp_getattro */
2664 0, /* tp_setattro */
2665 0, /* tp_as_buffer */
2666 Py_TPFLAGS_DEFAULT
, /* tp_flags */
2667 count_doc
, /* tp_doc */
2668 0, /* tp_traverse */
2670 0, /* tp_richcompare */
2671 0, /* tp_weaklistoffset */
2672 PyObject_SelfIter
, /* tp_iter */
2673 (iternextfunc
)count_next
, /* tp_iternext */
2679 0, /* tp_descr_get */
2680 0, /* tp_descr_set */
2681 0, /* tp_dictoffset */
2684 count_new
, /* tp_new */
2688 /* izip object ************************************************************/
2694 Py_ssize_t tuplesize
;
2695 PyObject
*ittuple
; /* tuple of iterators */
2699 static PyTypeObject izip_type
;
2702 izip_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2706 PyObject
*ittuple
; /* tuple of iterators */
2708 Py_ssize_t tuplesize
= PySequence_Length(args
);
2710 if (type
== &izip_type
&& !_PyArg_NoKeywords("izip()", kwds
))
2713 /* args must be a tuple */
2714 assert(PyTuple_Check(args
));
2716 /* obtain iterators */
2717 ittuple
= PyTuple_New(tuplesize
);
2718 if (ittuple
== NULL
)
2720 for (i
=0; i
< tuplesize
; ++i
) {
2721 PyObject
*item
= PyTuple_GET_ITEM(args
, i
);
2722 PyObject
*it
= PyObject_GetIter(item
);
2724 if (PyErr_ExceptionMatches(PyExc_TypeError
))
2725 PyErr_Format(PyExc_TypeError
,
2726 "izip argument #%zd must support iteration",
2731 PyTuple_SET_ITEM(ittuple
, i
, it
);
2734 /* create a result holder */
2735 result
= PyTuple_New(tuplesize
);
2736 if (result
== NULL
) {
2740 for (i
=0 ; i
< tuplesize
; i
++) {
2742 PyTuple_SET_ITEM(result
, i
, Py_None
);
2745 /* create izipobject structure */
2746 lz
= (izipobject
*)type
->tp_alloc(type
, 0);
2752 lz
->ittuple
= ittuple
;
2753 lz
->tuplesize
= tuplesize
;
2754 lz
->result
= result
;
2756 return (PyObject
*)lz
;
2760 izip_dealloc(izipobject
*lz
)
2762 PyObject_GC_UnTrack(lz
);
2763 Py_XDECREF(lz
->ittuple
);
2764 Py_XDECREF(lz
->result
);
2765 Py_TYPE(lz
)->tp_free(lz
);
2769 izip_traverse(izipobject
*lz
, visitproc visit
, void *arg
)
2771 Py_VISIT(lz
->ittuple
);
2772 Py_VISIT(lz
->result
);
2777 izip_next(izipobject
*lz
)
2780 Py_ssize_t tuplesize
= lz
->tuplesize
;
2781 PyObject
*result
= lz
->result
;
2788 if (Py_REFCNT(result
) == 1) {
2790 for (i
=0 ; i
< tuplesize
; i
++) {
2791 it
= PyTuple_GET_ITEM(lz
->ittuple
, i
);
2792 assert(PyIter_Check(it
));
2793 item
= (*Py_TYPE(it
)->tp_iternext
)(it
);
2798 olditem
= PyTuple_GET_ITEM(result
, i
);
2799 PyTuple_SET_ITEM(result
, i
, item
);
2803 result
= PyTuple_New(tuplesize
);
2806 for (i
=0 ; i
< tuplesize
; i
++) {
2807 it
= PyTuple_GET_ITEM(lz
->ittuple
, i
);
2808 assert(PyIter_Check(it
));
2809 item
= (*Py_TYPE(it
)->tp_iternext
)(it
);
2814 PyTuple_SET_ITEM(result
, i
, item
);
2820 PyDoc_STRVAR(izip_doc
,
2821 "izip(iter1 [,iter2 [...]]) --> izip object\n\
2823 Return a izip object whose .next() method returns a tuple where\n\
2824 the i-th element comes from the i-th iterable argument. The .next()\n\
2825 method continues until the shortest iterable in the argument sequence\n\
2826 is exhausted and then it raises StopIteration. Works like the zip()\n\
2827 function but consumes less memory by returning an iterator instead of\n\
2830 static PyTypeObject izip_type
= {
2831 PyVarObject_HEAD_INIT(NULL
, 0)
2832 "itertools.izip", /* tp_name */
2833 sizeof(izipobject
), /* tp_basicsize */
2834 0, /* tp_itemsize */
2836 (destructor
)izip_dealloc
, /* tp_dealloc */
2842 0, /* tp_as_number */
2843 0, /* tp_as_sequence */
2844 0, /* tp_as_mapping */
2848 PyObject_GenericGetAttr
, /* tp_getattro */
2849 0, /* tp_setattro */
2850 0, /* tp_as_buffer */
2851 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2852 Py_TPFLAGS_BASETYPE
, /* tp_flags */
2853 izip_doc
, /* tp_doc */
2854 (traverseproc
)izip_traverse
, /* tp_traverse */
2856 0, /* tp_richcompare */
2857 0, /* tp_weaklistoffset */
2858 PyObject_SelfIter
, /* tp_iter */
2859 (iternextfunc
)izip_next
, /* tp_iternext */
2865 0, /* tp_descr_get */
2866 0, /* tp_descr_set */
2867 0, /* tp_dictoffset */
2870 izip_new
, /* tp_new */
2871 PyObject_GC_Del
, /* tp_free */
2875 /* repeat object ************************************************************/
2883 static PyTypeObject repeat_type
;
2886 repeat_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
2890 Py_ssize_t cnt
= -1;
2892 if (type
== &repeat_type
&& !_PyArg_NoKeywords("repeat()", kwds
))
2895 if (!PyArg_ParseTuple(args
, "O|n:repeat", &element
, &cnt
))
2898 if (PyTuple_Size(args
) == 2 && cnt
< 0)
2901 ro
= (repeatobject
*)type
->tp_alloc(type
, 0);
2905 ro
->element
= element
;
2907 return (PyObject
*)ro
;
2911 repeat_dealloc(repeatobject
*ro
)
2913 PyObject_GC_UnTrack(ro
);
2914 Py_XDECREF(ro
->element
);
2915 Py_TYPE(ro
)->tp_free(ro
);
2919 repeat_traverse(repeatobject
*ro
, visitproc visit
, void *arg
)
2921 Py_VISIT(ro
->element
);
2926 repeat_next(repeatobject
*ro
)
2932 Py_INCREF(ro
->element
);
2937 repeat_repr(repeatobject
*ro
)
2939 PyObject
*result
, *objrepr
;
2941 objrepr
= PyObject_Repr(ro
->element
);
2942 if (objrepr
== NULL
)
2946 result
= PyString_FromFormat("repeat(%s)",
2947 PyString_AS_STRING(objrepr
));
2949 result
= PyString_FromFormat("repeat(%s, %zd)",
2950 PyString_AS_STRING(objrepr
), ro
->cnt
);
2956 repeat_len(repeatobject
*ro
)
2958 if (ro
->cnt
== -1) {
2959 PyErr_SetString(PyExc_TypeError
, "len() of unsized object");
2962 return PyInt_FromSize_t(ro
->cnt
);
2965 PyDoc_STRVAR(length_hint_doc
, "Private method returning an estimate of len(list(it)).");
2967 static PyMethodDef repeat_methods
[] = {
2968 {"__length_hint__", (PyCFunction
)repeat_len
, METH_NOARGS
, length_hint_doc
},
2969 {NULL
, NULL
} /* sentinel */
2972 PyDoc_STRVAR(repeat_doc
,
2973 "repeat(element [,times]) -> create an iterator which returns the element\n\
2974 for the specified number of times. If not specified, returns the element\n\
2977 static PyTypeObject repeat_type
= {
2978 PyVarObject_HEAD_INIT(NULL
, 0)
2979 "itertools.repeat", /* tp_name */
2980 sizeof(repeatobject
), /* tp_basicsize */
2981 0, /* tp_itemsize */
2983 (destructor
)repeat_dealloc
, /* tp_dealloc */
2988 (reprfunc
)repeat_repr
, /* tp_repr */
2989 0, /* tp_as_number */
2990 0, /* tp_as_sequence */
2991 0, /* tp_as_mapping */
2995 PyObject_GenericGetAttr
, /* tp_getattro */
2996 0, /* tp_setattro */
2997 0, /* tp_as_buffer */
2998 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2999 Py_TPFLAGS_BASETYPE
, /* tp_flags */
3000 repeat_doc
, /* tp_doc */
3001 (traverseproc
)repeat_traverse
, /* tp_traverse */
3003 0, /* tp_richcompare */
3004 0, /* tp_weaklistoffset */
3005 PyObject_SelfIter
, /* tp_iter */
3006 (iternextfunc
)repeat_next
, /* tp_iternext */
3007 repeat_methods
, /* tp_methods */
3012 0, /* tp_descr_get */
3013 0, /* tp_descr_set */
3014 0, /* tp_dictoffset */
3017 repeat_new
, /* tp_new */
3018 PyObject_GC_Del
, /* tp_free */
3021 /* iziplongest object ************************************************************/
3027 Py_ssize_t tuplesize
;
3028 Py_ssize_t numactive
;
3029 PyObject
*ittuple
; /* tuple of iterators */
3031 PyObject
*fillvalue
;
3032 } iziplongestobject
;
3034 static PyTypeObject iziplongest_type
;
3037 izip_longest_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
3039 iziplongestobject
*lz
;
3041 PyObject
*ittuple
; /* tuple of iterators */
3043 PyObject
*fillvalue
= Py_None
;
3044 Py_ssize_t tuplesize
= PySequence_Length(args
);
3046 if (kwds
!= NULL
&& PyDict_CheckExact(kwds
) && PyDict_Size(kwds
) > 0) {
3047 fillvalue
= PyDict_GetItemString(kwds
, "fillvalue");
3048 if (fillvalue
== NULL
|| PyDict_Size(kwds
) > 1) {
3049 PyErr_SetString(PyExc_TypeError
,
3050 "izip_longest() got an unexpected keyword argument");
3055 /* args must be a tuple */
3056 assert(PyTuple_Check(args
));
3058 /* obtain iterators */
3059 ittuple
= PyTuple_New(tuplesize
);
3060 if (ittuple
== NULL
)
3062 for (i
=0; i
< tuplesize
; ++i
) {
3063 PyObject
*item
= PyTuple_GET_ITEM(args
, i
);
3064 PyObject
*it
= PyObject_GetIter(item
);
3066 if (PyErr_ExceptionMatches(PyExc_TypeError
))
3067 PyErr_Format(PyExc_TypeError
,
3068 "izip_longest argument #%zd must support iteration",
3073 PyTuple_SET_ITEM(ittuple
, i
, it
);
3076 /* create a result holder */
3077 result
= PyTuple_New(tuplesize
);
3078 if (result
== NULL
) {
3082 for (i
=0 ; i
< tuplesize
; i
++) {
3084 PyTuple_SET_ITEM(result
, i
, Py_None
);
3087 /* create iziplongestobject structure */
3088 lz
= (iziplongestobject
*)type
->tp_alloc(type
, 0);
3094 lz
->ittuple
= ittuple
;
3095 lz
->tuplesize
= tuplesize
;
3096 lz
->numactive
= tuplesize
;
3097 lz
->result
= result
;
3098 Py_INCREF(fillvalue
);
3099 lz
->fillvalue
= fillvalue
;
3100 return (PyObject
*)lz
;
3104 izip_longest_dealloc(iziplongestobject
*lz
)
3106 PyObject_GC_UnTrack(lz
);
3107 Py_XDECREF(lz
->ittuple
);
3108 Py_XDECREF(lz
->result
);
3109 Py_XDECREF(lz
->fillvalue
);
3110 Py_TYPE(lz
)->tp_free(lz
);
3114 izip_longest_traverse(iziplongestobject
*lz
, visitproc visit
, void *arg
)
3116 Py_VISIT(lz
->ittuple
);
3117 Py_VISIT(lz
->result
);
3118 Py_VISIT(lz
->fillvalue
);
3123 izip_longest_next(iziplongestobject
*lz
)
3126 Py_ssize_t tuplesize
= lz
->tuplesize
;
3127 PyObject
*result
= lz
->result
;
3134 if (lz
->numactive
== 0)
3136 if (Py_REFCNT(result
) == 1) {
3138 for (i
=0 ; i
< tuplesize
; i
++) {
3139 it
= PyTuple_GET_ITEM(lz
->ittuple
, i
);
3141 Py_INCREF(lz
->fillvalue
);
3142 item
= lz
->fillvalue
;
3144 assert(PyIter_Check(it
));
3145 item
= (*Py_TYPE(it
)->tp_iternext
)(it
);
3148 if (lz
->numactive
== 0) {
3152 Py_INCREF(lz
->fillvalue
);
3153 item
= lz
->fillvalue
;
3154 PyTuple_SET_ITEM(lz
->ittuple
, i
, NULL
);
3159 olditem
= PyTuple_GET_ITEM(result
, i
);
3160 PyTuple_SET_ITEM(result
, i
, item
);
3164 result
= PyTuple_New(tuplesize
);
3167 for (i
=0 ; i
< tuplesize
; i
++) {
3168 it
= PyTuple_GET_ITEM(lz
->ittuple
, i
);
3170 Py_INCREF(lz
->fillvalue
);
3171 item
= lz
->fillvalue
;
3173 assert(PyIter_Check(it
));
3174 item
= (*Py_TYPE(it
)->tp_iternext
)(it
);
3177 if (lz
->numactive
== 0) {
3181 Py_INCREF(lz
->fillvalue
);
3182 item
= lz
->fillvalue
;
3183 PyTuple_SET_ITEM(lz
->ittuple
, i
, NULL
);
3188 PyTuple_SET_ITEM(result
, i
, item
);
3194 PyDoc_STRVAR(izip_longest_doc
,
3195 "izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\n\
3197 Return an izip_longest object whose .next() method returns a tuple where\n\
3198 the i-th element comes from the i-th iterable argument. The .next()\n\
3199 method continues until the longest iterable in the argument sequence\n\
3200 is exhausted and then it raises StopIteration. When the shorter iterables\n\
3201 are exhausted, the fillvalue is substituted in their place. The fillvalue\n\
3202 defaults to None or can be specified by a keyword argument.\n\
3205 static PyTypeObject iziplongest_type
= {
3206 PyVarObject_HEAD_INIT(NULL
, 0)
3207 "itertools.izip_longest", /* tp_name */
3208 sizeof(iziplongestobject
), /* tp_basicsize */
3209 0, /* tp_itemsize */
3211 (destructor
)izip_longest_dealloc
, /* tp_dealloc */
3217 0, /* tp_as_number */
3218 0, /* tp_as_sequence */
3219 0, /* tp_as_mapping */
3223 PyObject_GenericGetAttr
, /* tp_getattro */
3224 0, /* tp_setattro */
3225 0, /* tp_as_buffer */
3226 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
3227 Py_TPFLAGS_BASETYPE
, /* tp_flags */
3228 izip_longest_doc
, /* tp_doc */
3229 (traverseproc
)izip_longest_traverse
, /* tp_traverse */
3231 0, /* tp_richcompare */
3232 0, /* tp_weaklistoffset */
3233 PyObject_SelfIter
, /* tp_iter */
3234 (iternextfunc
)izip_longest_next
, /* tp_iternext */
3240 0, /* tp_descr_get */
3241 0, /* tp_descr_set */
3242 0, /* tp_dictoffset */
3245 izip_longest_new
, /* tp_new */
3246 PyObject_GC_Del
, /* tp_free */
3249 /* module level code ********************************************************/
3251 PyDoc_STRVAR(module_doc
,
3252 "Functional tools for creating and using iterators.\n\
3254 Infinite iterators:\n\
3255 count([n]) --> n, n+1, n+2, ...\n\
3256 cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\
3257 repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times\n\
3259 Iterators terminating on the shortest input sequence:\n\
3260 izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\
3261 izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\
3262 ifilter(pred, seq) --> elements of seq where pred(elem) is True\n\
3263 ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\
3264 islice(seq, [start,] stop [, step]) --> elements from\n\
3265 seq[start:stop:step]\n\
3266 imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ...\n\
3267 starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ...\n\
3268 tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n\n\
3269 chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... \n\
3270 takewhile(pred, seq) --> seq[0], seq[1], until pred fails\n\
3271 dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails\n\
3272 groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)\n\
3276 static PyMethodDef module_methods
[] = {
3277 {"tee", (PyCFunction
)tee
, METH_VARARGS
, tee_doc
},
3278 {NULL
, NULL
} /* sentinel */
3287 PyTypeObject
*typelist
[] = {
3307 Py_TYPE(&teedataobject_type
) = &PyType_Type
;
3308 m
= Py_InitModule3("itertools", module_methods
, module_doc
);
3312 for (i
=0 ; typelist
[i
] != NULL
; i
++) {
3313 if (PyType_Ready(typelist
[i
]) < 0)
3315 name
= strchr(typelist
[i
]->tp_name
, '.');
3316 assert (name
!= NULL
);
3317 Py_INCREF(typelist
[i
]);
3318 PyModule_AddObject(m
, name
+1, (PyObject
*)typelist
[i
]);
3321 if (PyType_Ready(&teedataobject_type
) < 0)
3323 if (PyType_Ready(&tee_type
) < 0)
3325 if (PyType_Ready(&_grouper_type
) < 0)