From a3424e36e1ed1c598f439d89101f3d54099202ae Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Wed, 2 Nov 2005 15:58:58 +0000 Subject: [PATCH] add 'iterator'(sequences) and 'key_iterator'(maps). The first returns allways the C++ iterator. In sequences __iter__ returns 'iterator()', in maps, __iter__ returns 'key_iterator()' git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7775 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- .../test-suite/python/li_std_map_runme.py | 36 ++++++++++--------- Lib/python/pycontainer.swg | 9 +++-- Lib/python/std_map.i | 8 +++-- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/Examples/test-suite/python/li_std_map_runme.py b/Examples/test-suite/python/li_std_map_runme.py index 65d4860ca..be703c181 100644 --- a/Examples/test-suite/python/li_std_map_runme.py +++ b/Examples/test-suite/python/li_std_map_runme.py @@ -4,26 +4,30 @@ a1 = li_std_map.A(3) a2 = li_std_map.A(7) -if 1: - p0 = li_std_map.pairii(1,2) - p1 = li_std_map.pairA(1,a1.this) - m = {} - m[1] = a1 - m[2] = a2 - - pp1 = li_std_map.p_identa(p1) - mm = li_std_map.m_identa(m) +p0 = li_std_map.pairii(1,2) +p1 = li_std_map.pairA(1,a1.this) +m = {} +m[1] = a1 +m[2] = a2 + +pp1 = li_std_map.p_identa(p1) +mm = li_std_map.m_identa(m) - m = li_std_map.mapA() - m[1] = a1 - m[2] = a2 - for i in m: - if m[i[0]].this != i[1].this: - print m[i[0]].this, i[1].this - raise RuntimeError +m = li_std_map.mapA() +m[1] = a1 +m[2] = a2 +pm ={} +for k in m: + pm[k] = m[k] + +for k in m: + if pm[k].this != m[k].this: + print pm[k], m[k] + raise RuntimeError + diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index b8db54b0f..77d04572b 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -623,16 +623,15 @@ namespace swig %fragment("PySequence_Cont"); - %newobject output_iterator(PyObject *seq); + %newobject iterator(PyObject *PYTHON_SELF); %extend { - swig::PySequence_OutputIterator* output_iterator(PyObject *seq) { - return swig::make_output_iterator(self->begin(), self->begin(), self->end(), seq); + swig::PySequence_OutputIterator* iterator(PyObject **PYTHON_SELF) { + return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %pythoncode { def __iter__(self): - i = self.output_iterator(self) - return i + return self.iterator() } } #endif //SWIG_EXPORT_ITERATOR_METHODS diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i index 8ef71c27f..576d03569 100644 --- a/Lib/python/std_map.i +++ b/Lib/python/std_map.i @@ -140,8 +140,7 @@ return self->find(key) != self->end(); } -#if !defined(SWIG_EXPORT_ITERATOR_METHODS) || defined(SWIG_USE_OLD_MAP_ITERATOR) - PyObject* __iter__() { + PyObject* key_iterator() { Map::size_type size = self->size(); int pysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (pysize < 0) { @@ -162,6 +161,11 @@ return keyTuple; %#endif } +#if !defined(SWIG_USE_STD_MAP_ITERATOR) + %pythoncode { + def __iter__(self): + return self.key_iterator() + } #endif } %enddef