7 long en_index
; /* current index of enumeration */
8 PyObject
* en_sit
; /* secondary iterator of enumeration */
11 PyTypeObject PyEnum_Type
;
14 enum_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
18 static char *kwlist
[] = {"sequence", 0};
20 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "O:enumerate", kwlist
,
24 en
= (enumobject
*)type
->tp_alloc(type
, 0);
28 en
->en_sit
= PyObject_GetIter(seq
);
29 if (en
->en_sit
== NULL
) {
33 return (PyObject
*)en
;
37 enum_dealloc(enumobject
*en
)
39 PyObject_GC_UnTrack(en
);
40 Py_XDECREF(en
->en_sit
);
41 en
->ob_type
->tp_free(en
);
45 enum_traverse(enumobject
*en
, visitproc visit
, void *arg
)
48 return visit(en
->en_sit
, arg
);
53 enum_next(enumobject
*en
)
59 result
= PyTuple_New(2);
63 next_index
= PyInt_FromLong(en
->en_index
);
64 if (next_index
== NULL
) {
68 PyTuple_SET_ITEM(result
, 0, next_index
);
70 next_item
= PyIter_Next(en
->en_sit
);
71 if (next_item
== NULL
) {
77 PyTuple_SET_ITEM(result
, 1, next_item
);
82 enum_getiter(PyObject
*en
)
88 PyDoc_STRVAR(enum_doc
,
89 "enumerate(iterable) -> create an enumerating-iterator");
91 PyTypeObject PyEnum_Type
= {
92 PyObject_HEAD_INIT(&PyType_Type
)
94 "enumerate", /* tp_name */
95 sizeof(enumobject
), /* tp_basicsize */
98 (destructor
)enum_dealloc
, /* tp_dealloc */
104 0, /* tp_as_number */
105 0, /* tp_as_sequence */
106 0, /* tp_as_mapping */
110 PyObject_GenericGetAttr
, /* tp_getattro */
112 0, /* tp_as_buffer */
113 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
114 Py_TPFLAGS_BASETYPE
, /* tp_flags */
115 enum_doc
, /* tp_doc */
116 (traverseproc
)enum_traverse
, /* tp_traverse */
118 0, /* tp_richcompare */
119 0, /* tp_weaklistoffset */
120 (getiterfunc
)enum_getiter
, /* tp_iter */
121 (iternextfunc
)enum_next
, /* tp_iternext */
127 0, /* tp_descr_get */
128 0, /* tp_descr_set */
129 0, /* tp_dictoffset */
131 PyType_GenericAlloc
, /* tp_alloc */
132 enum_new
, /* tp_new */
133 PyObject_GC_Del
, /* tp_free */