]> granicus.if.org Git - python/commitdiff
Make the it_index field in the str/unicode iterators Py_ssize_t's.
authorGuido van Rossum <guido@python.org>
Thu, 17 Aug 2006 21:11:47 +0000 (21:11 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 17 Aug 2006 21:11:47 +0000 (21:11 +0000)
Test the new iterators on str/unicode.

Lib/test/test_str.py
Lib/test/test_unicode.py
Objects/stringobject.c
Objects/unicodeobject.c

index 45942a66ef24ce5cf9c38f651e269de2844ae929..226a16809ecd76644e728ce27fbc5cf73c1090cc 100644 (file)
@@ -19,6 +19,14 @@ class StrTest(
         string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
         self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
 
+    def test_iterators(self):
+        # Make sure str objects have an __iter__ method
+        it = "abc".__iter__()
+        self.assertEqual(it.next(), "a")
+        self.assertEqual(it.next(), "b")
+        self.assertEqual(it.next(), "c")
+        self.assertRaises(StopIteration, it.next)
+
     def test_conversion(self):
         # Make sure __str__() behaves properly
         class Foo0:
index 34f9371658bfa1a918938c53ade01db92dea70e0..517ecfddfeb1693ab589ff1a0de5e16c0c1f5a4e 100644 (file)
@@ -93,6 +93,14 @@ class UnicodeTest(
             testrepr = repr(u''.join(map(unichr, xrange(256))))
             self.assertEqual(testrepr, latin1repr)
 
+    def test_iterators(self):
+        # Make sure unicode objects have an __iter__ method
+        it = u"\u1111\u2222\u3333".__iter__()
+        self.assertEqual(it.next(), u"\u1111")
+        self.assertEqual(it.next(), u"\u2222")
+        self.assertEqual(it.next(), u"\u3333")
+        self.assertRaises(StopIteration, it.next)
+
     def test_count(self):
         string_tests.CommonTest.test_count(self)
         # check mixed argument types
index 3ba85e6438d074169c5d10715ebef623c433a80d..7ba15a00f862343b6a320b23ac21ef15089fa2fe 100644 (file)
@@ -4992,7 +4992,7 @@ void _Py_ReleaseInternedStrings(void)
 
 typedef struct {
        PyObject_HEAD
-       long it_index;
+       Py_ssize_t it_index;
        PyStringObject *it_seq; /* Set to NULL when iterator is exhausted */
 } striterobject;
 
@@ -5024,7 +5024,8 @@ striter_next(striterobject *it)
        assert(PyString_Check(seq));
 
        if (it->it_index < PyString_GET_SIZE(seq)) {
-               item = PyString_FromStringAndSize(PyString_AS_STRING(seq)+it->it_index, 1);
+               item = PyString_FromStringAndSize(
+                       PyString_AS_STRING(seq)+it->it_index, 1);
                if (item != NULL)
                        ++it->it_index;
                return item;
@@ -5044,18 +5045,20 @@ striter_len(striterobject *it)
        return PyInt_FromSsize_t(len);
 }
 
-PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+PyDoc_STRVAR(length_hint_doc,
+            "Private method returning an estimate of len(list(it)).");
 
 static PyMethodDef striter_methods[] = {
-       {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS, length_hint_doc},
+       {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS,
+        length_hint_doc},
        {NULL,          NULL}           /* sentinel */
 };
 
 PyTypeObject PyStringIter_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0,                                      /* ob_size */
-       "striterator",                  /* tp_name */
-       sizeof(striterobject),          /* tp_basicsize */
+       "striterator",                          /* tp_name */
+       sizeof(striterobject),                  /* tp_basicsize */
        0,                                      /* tp_itemsize */
        /* methods */
        (destructor)striter_dealloc,            /* tp_dealloc */
index a87916c15cbecfda1098e8c5eb67444a3e1c06e3..e63e629309f3625380842d95f0b89bab7caa2b92 100644 (file)
@@ -7969,7 +7969,7 @@ _PyUnicode_Fini(void)
 
 typedef struct {
        PyObject_HEAD
-       long it_index;
+       Py_ssize_t it_index;
        PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */
 } unicodeiterobject;
 
@@ -8001,7 +8001,8 @@ unicodeiter_next(unicodeiterobject *it)
        assert(PyUnicode_Check(seq));
 
        if (it->it_index < PyUnicode_GET_SIZE(seq)) {
-               item = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(seq)+it->it_index, 1);
+               item = PyUnicode_FromUnicode(
+                    PyUnicode_AS_UNICODE(seq)+it->it_index, 1);
                if (item != NULL)
                        ++it->it_index;
                return item;
@@ -8024,7 +8025,8 @@ unicodeiter_len(unicodeiterobject *it)
 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
 
 static PyMethodDef unicodeiter_methods[] = {
-       {"__length_hint__", (PyCFunction)unicodeiter_len, METH_NOARGS, length_hint_doc},
+       {"__length_hint__", (PyCFunction)unicodeiter_len, METH_NOARGS,
+         length_hint_doc},
        {NULL,          NULL}           /* sentinel */
 };
 
@@ -8035,7 +8037,7 @@ PyTypeObject PyUnicodeIter_Type = {
        sizeof(unicodeiterobject),              /* tp_basicsize */
        0,                                      /* tp_itemsize */
        /* methods */
-       (destructor)unicodeiter_dealloc,                /* tp_dealloc */
+       (destructor)unicodeiter_dealloc,        /* tp_dealloc */
        0,                                      /* tp_print */
        0,                                      /* tp_getattr */
        0,                                      /* tp_setattr */