17dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum/* enumerate object */
27dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
37dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum#include "Python.h"
47dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
57dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumtypedef struct {
6f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_HEAD
7f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t en_index;           /* current index of enumeration */
8f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject* en_sit;          /* secondary iterator of enumeration */
9f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject* en_result;           /* result tuple  */
10f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject* en_longindex;        /* index for sequences >= PY_SSIZE_T_MAX */
117dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} enumobject;
127dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
137dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic PyObject *
147dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
157dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{
16f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    enumobject *en;
17f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *seq = NULL;
18f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *start = NULL;
19f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    static char *kwlist[] = {"iterable", "start", 0};
20f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
21f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist,
22f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                     &seq, &start))
23f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
24f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
25f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    en = (enumobject *)type->tp_alloc(type, 0);
26f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (en == NULL)
27f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
28f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (start != NULL) {
29f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        start = PyNumber_Index(start);
30f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (start == NULL) {
31f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(en);
32f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
33f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
34f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        assert(PyLong_Check(start));
35f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        en->en_index = PyLong_AsSsize_t(start);
36f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (en->en_index == -1 && PyErr_Occurred()) {
37f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
38f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            en->en_index = PY_SSIZE_T_MAX;
39f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            en->en_longindex = start;
40f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
41f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            en->en_longindex = NULL;
42f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(start);
43f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
44f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
45f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        en->en_index = 0;
46f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        en->en_longindex = NULL;
47f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
48f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    en->en_sit = PyObject_GetIter(seq);
49f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (en->en_sit == NULL) {
50f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(en);
51f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
52f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
53f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    en->en_result = PyTuple_Pack(2, Py_None, Py_None);
54f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (en->en_result == NULL) {
55f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(en);
56f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
57f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
58f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (PyObject *)en;
597dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum}
607dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
617dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic void
627dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_dealloc(enumobject *en)
637dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{
64f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GC_UnTrack(en);
65f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(en->en_sit);
66f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(en->en_result);
67f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(en->en_longindex);
68f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_TYPE(en)->tp_free(en);
697dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum}
707dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
717dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic int
727dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_traverse(enumobject *en, visitproc visit, void *arg)
737dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{
74f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_VISIT(en->en_sit);
75f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_VISIT(en->en_result);
76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_VISIT(en->en_longindex);
77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
787dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum}
797dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
807dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic PyObject *
818ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossumenum_next_long(enumobject *en, PyObject* next_item)
828ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum{
83f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    static PyObject *one = NULL;
84f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = en->en_result;
85f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *next_index;
86f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *stepped_up;
87f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (en->en_longindex == NULL) {
89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        en->en_longindex = PyLong_FromSsize_t(PY_SSIZE_T_MAX);
90f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (en->en_longindex == NULL)
91f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
92f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
93f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (one == NULL) {
94f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        one = PyLong_FromLong(1);
95f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (one == NULL)
96f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
97f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
98f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    next_index = en->en_longindex;
99f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    assert(next_index != NULL);
100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stepped_up = PyNumber_Add(next_index, one);
101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (stepped_up == NULL)
102f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    en->en_longindex = stepped_up;
104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result->ob_refcnt == 1) {
106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(result);
107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(PyTuple_GET_ITEM(result, 0));
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(PyTuple_GET_ITEM(result, 1));
109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = PyTuple_New(2);
111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result == NULL) {
112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(next_index);
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(next_item);
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTuple_SET_ITEM(result, 0, next_index);
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTuple_SET_ITEM(result, 1, next_item);
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1208ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum}
1218ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum
1228ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossumstatic PyObject *
1237dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_next(enumobject *en)
1247dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{
125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *next_index;
126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *next_item;
127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = en->en_result;
128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *it = en->en_sit;
129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    next_item = (*Py_TYPE(it)->tp_iternext)(it);
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (next_item == NULL)
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (en->en_index == PY_SSIZE_T_MAX)
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return enum_next_long(en, next_item);
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    next_index = PyLong_FromSsize_t(en->en_index);
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (next_index == NULL) {
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(next_item);
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    en->en_index++;
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result->ob_refcnt == 1) {
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(result);
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(PyTuple_GET_ITEM(result, 0));
147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(PyTuple_GET_ITEM(result, 1));
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = PyTuple_New(2);
150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result == NULL) {
151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(next_index);
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(next_item);
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTuple_SET_ITEM(result, 0, next_index);
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTuple_SET_ITEM(result, 1, next_item);
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1597dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum}
1607dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
16131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject *
16231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonenum_reduce(enumobject *en)
16331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{
16431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    if (en->en_longindex != NULL)
16531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        return Py_BuildValue("O(OO)", Py_TYPE(en), en->en_sit, en->en_longindex);
16631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    else
16731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        return Py_BuildValue("O(On)", Py_TYPE(en), en->en_sit, en->en_index);
16831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson}
16931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
17031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur JónssonPyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
17131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
17231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyMethodDef enum_methods[] = {
17331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc},
17431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    {NULL,              NULL}           /* sentinel */
17531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson};
17631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
17714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(enum_doc,
1783e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"enumerate(iterable[, start]) -> iterator for index, value of iterable\n"
179fbbe34789e62725cac074a188826e53d8cc95e16Jeremy Hylton"\n"
180ed61093277b3e987f9856e8a04498ce103362ff6Ezio Melotti"Return an enumerate object.  iterable must be another object that supports\n"
181fbbe34789e62725cac074a188826e53d8cc95e16Jeremy Hylton"iteration.  The enumerate object yields pairs containing a count (from\n"
1823e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"start, which defaults to zero) and a value yielded by the iterable argument.\n"
1833e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"enumerate is useful for obtaining an indexed list:\n"
1843e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"    (0, seq[0]), (1, seq[1]), (2, seq[2]), ...");
1857dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum
1867dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van RossumPyTypeObject PyEnum_Type = {
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyVarObject_HEAD_INIT(&PyType_Type, 0)
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "enumerate",                    /* tp_name */
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sizeof(enumobject),             /* tp_basicsize */
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_itemsize */
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* methods */
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (destructor)enum_dealloc,       /* tp_dealloc */
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_print */
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_getattr */
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_setattr */
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_reserved */
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_repr */
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_number */
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_sequence */
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_mapping */
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_hash */
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_call */
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_str */
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GenericGetAttr,        /* tp_getattro */
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_setattro */
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_buffer */
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_TPFLAGS_BASETYPE,    /* tp_flags */
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    enum_doc,                       /* tp_doc */
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (traverseproc)enum_traverse,    /* tp_traverse */
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_clear */
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_richcompare */
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_weaklistoffset */
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_SelfIter,                  /* tp_iter */
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (iternextfunc)enum_next,        /* tp_iternext */
21631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    enum_methods,                   /* tp_methods */
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_members */
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_getset */
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_base */
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_dict */
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_descr_get */
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_descr_set */
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_dictoffset */
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_init */
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyType_GenericAlloc,            /* tp_alloc */
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    enum_new,                       /* tp_new */
227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GC_Del,                /* tp_free */
2287dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum};
22985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
23085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger/* Reversed Object ***************************************************************/
23185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
23285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingertypedef struct {
233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_HEAD
234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t      index;
235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject* seq;
23685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} reversedobject;
23785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
23885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject *
23985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
24085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{
241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t n;
242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *seq, *reversed_meth;
243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    reversedobject *ro;
244ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    _Py_IDENTIFIER(__reversed__);
245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds))
247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
249f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
250f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
251f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
252ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    reversed_meth = _PyObject_LookupSpecial(seq, &PyId___reversed__);
25397c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum    if (reversed_meth == Py_None) {
25497c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum        Py_DECREF(reversed_meth);
25597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum        PyErr_Format(PyExc_TypeError,
25697c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum                     "'%.200s' object is not reversible",
25797c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum                     Py_TYPE(seq)->tp_name);
25897c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum        return NULL;
25997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum    }
260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (reversed_meth != NULL) {
261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
262f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(reversed_meth);
263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return res;
264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (PyErr_Occurred())
266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
267f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PySequence_Check(seq)) {
26997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum        PyErr_Format(PyExc_TypeError,
27097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum                     "'%.200s' object is not reversible",
27197c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum                     Py_TYPE(seq)->tp_name);
272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    n = PySequence_Size(seq);
276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == -1)
277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ro = (reversedobject *)type->tp_alloc(type, 0);
280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (ro == NULL)
281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ro->index = n-1;
284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(seq);
285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ro->seq = seq;
286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (PyObject *)ro;
28785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}
28885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
28985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic void
29085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_dealloc(reversedobject *ro)
29185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{
292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GC_UnTrack(ro);
293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(ro->seq);
294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_TYPE(ro)->tp_free(ro);
29585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}
29685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
29785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic int
29885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_traverse(reversedobject *ro, visitproc visit, void *arg)
29985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{
300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_VISIT(ro->seq);
301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
30285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}
30385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
30485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject *
30585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_next(reversedobject *ro)
30685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{
307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *item;
308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t index = ro->index;
309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (index >= 0) {
311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        item = PySequence_GetItem(ro->seq, index);
312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (item != NULL) {
313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ro->index--;
314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return item;
315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyErr_ExceptionMatches(PyExc_IndexError) ||
317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_ExceptionMatches(PyExc_StopIteration))
318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ro->index = -1;
321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(ro->seq);
322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
323029dba5a4078bc1e9dc262d24aaa481936af49d3Raymond Hettinger}
324029dba5a4078bc1e9dc262d24aaa481936af49d3Raymond Hettinger
32585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyDoc_STRVAR(reversed_doc,
326d2afee47b13854c265a5fb8eb5a53daf7b27ecf9Raymond Hettinger"reversed(sequence) -> reverse iterator over values of the sequence\n"
32785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"\n"
32885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"Return a reverse iterator");
32985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger
3306b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyObject *
331ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettingerreversed_len(reversedobject *ro)
332ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger{
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t position, seqsize;
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (ro->seq == NULL)
336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyLong_FromLong(0);
337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    seqsize = PySequence_Size(ro->seq);
338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (seqsize == -1)
339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    position = ro->index + 1;
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyLong_FromSsize_t((seqsize < position)  ?  0  :  position);
342ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger}
343ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger
344f5b3e36493da275334e29afdbd238863697dca35Armin RigoPyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
3456b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger
34631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject *
34731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonreversed_reduce(reversedobject *ro)
34831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{
34931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    if (ro->seq)
35031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        return Py_BuildValue("O(O)n", Py_TYPE(ro), ro->seq, ro->index);
35131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    else
35231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        return Py_BuildValue("O(())", Py_TYPE(ro));
35331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson}
35431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
35531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject *
35631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonreversed_setstate(reversedobject *ro, PyObject *state)
35731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{
35831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    Py_ssize_t index = PyLong_AsSsize_t(state);
35931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    if (index == -1 && PyErr_Occurred())
36031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        return NULL;
36131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    if (ro->seq != 0) {
36231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        Py_ssize_t n = PySequence_Size(ro->seq);
36331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        if (n < 0)
36431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson            return NULL;
36531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        if (index < -1)
36631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson            index = -1;
36731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        else if (index > n-1)
36831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson            index = n-1;
36931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson        ro->index = index;
37031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    }
37131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    Py_RETURN_NONE;
37231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson}
37331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
37431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur JónssonPyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
37531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson
3766b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyMethodDef reversediter_methods[] = {
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"__length_hint__", (PyCFunction)reversed_len, METH_NOARGS, length_hint_doc},
37831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    {"__reduce__", (PyCFunction)reversed_reduce, METH_NOARGS, reduce_doc},
37931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson    {"__setstate__", (PyCFunction)reversed_setstate, METH_O, setstate_doc},
380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {NULL,              NULL}           /* sentinel */
38106353f76beab69a538d3a55ca9b6df7e9754b999Raymond Hettinger};
38206353f76beab69a538d3a55ca9b6df7e9754b999Raymond Hettinger
38385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyTypeObject PyReversed_Type = {
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyVarObject_HEAD_INIT(&PyType_Type, 0)
385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "reversed",                     /* tp_name */
386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sizeof(reversedobject),         /* tp_basicsize */
387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_itemsize */
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* methods */
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (destructor)reversed_dealloc,   /* tp_dealloc */
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_print */
391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_getattr */
392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_setattr */
393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_reserved */
394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_repr */
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_number */
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                                  /* tp_as_sequence */
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_mapping */
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_hash */
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_call */
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_str */
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GenericGetAttr,        /* tp_getattro */
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_setattro */
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_as_buffer */
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_TPFLAGS_BASETYPE,    /* tp_flags */
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    reversed_doc,                   /* tp_doc */
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (traverseproc)reversed_traverse,/* tp_traverse */
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_clear */
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_richcompare */
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_weaklistoffset */
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_SelfIter,                  /* tp_iter */
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (iternextfunc)reversed_next,    /* tp_iternext */
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    reversediter_methods,               /* tp_methods */
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_members */
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_getset */
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_base */
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_dict */
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_descr_get */
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_descr_set */
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_dictoffset */
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                              /* tp_init */
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyType_GenericAlloc,            /* tp_alloc */
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    reversed_new,                   /* tp_new */
424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject_GC_Del,                /* tp_free */
42585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger};
426