]> granicus.if.org Git - python/commitdiff
Make iterators length transparent where possible.
authorRaymond Hettinger <python@rcn.com>
Thu, 18 Mar 2004 22:43:10 +0000 (22:43 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 18 Mar 2004 22:43:10 +0000 (22:43 +0000)
Objects/iterobject.c
Objects/listobject.c
Objects/tupleobject.c

index abcf8db1fe35fa8ec6d63dd2cad18d569347442b..a407dd597fd4fac95e13e2fd4d0e5bfb309ffb1c 100644 (file)
@@ -71,6 +71,19 @@ iter_iternext(PyObject *iterator)
        return NULL;
 }
 
+static int
+iter_len(seqiterobject *it)
+{
+       if (it->it_seq)
+               return PyObject_Size(it->it_seq) - it->it_index;
+       return 0;
+}
+
+static PySequenceMethods iter_as_sequence = {
+       (inquiry)iter_len,              /* sq_length */
+       0,                              /* sq_concat */
+};
+
 PyTypeObject PySeqIter_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0,                                      /* ob_size */
@@ -85,7 +98,7 @@ PyTypeObject PySeqIter_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &iter_as_sequence,                      /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */
index 3bda2453038b935572bdf84ad779576e9dd57ac9..f34ca70abcbea874c676a912953131ff9ae151c1 100644 (file)
@@ -2707,6 +2707,19 @@ listiter_next(listiterobject *it)
        return NULL;
 }
 
+static int
+listiter_len(listiterobject *it)
+{
+       if (it->it_seq)
+               return PyList_GET_SIZE(it->it_seq) - it->it_index;
+       return 0;
+}
+
+static PySequenceMethods listiter_as_sequence = {
+       (inquiry)listiter_len,          /* sq_length */
+       0,                              /* sq_concat */
+};
+
 PyTypeObject PyListIter_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0,                                      /* ob_size */
@@ -2721,7 +2734,7 @@ PyTypeObject PyListIter_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &listiter_as_sequence,                  /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */
index 66fb146174cc046462e3ebdd6f8fdcb0502de8fb..60878a43145ae96d7aabc0501e08516f8b8bb337 100644 (file)
@@ -839,6 +839,19 @@ tupleiter_next(tupleiterobject *it)
        return NULL;
 }
 
+static int
+tupleiter_len(tupleiterobject *it)
+{
+       if (it->it_seq)
+               return PyTuple_GET_SIZE(it->it_seq) - it->it_index;
+       return 0;
+}
+
+static PySequenceMethods tupleiter_as_sequence = {
+       (inquiry)tupleiter_len,         /* sq_length */
+       0,                              /* sq_concat */
+};
+
 PyTypeObject PyTupleIter_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0,                                      /* ob_size */
@@ -853,7 +866,7 @@ PyTypeObject PyTupleIter_Type = {
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
        0,                                      /* tp_as_number */
-       0,                                      /* tp_as_sequence */
+       &tupleiter_as_sequence,                 /* tp_as_sequence */
        0,                                      /* tp_as_mapping */
        0,                                      /* tp_hash */
        0,                                      /* tp_call */