...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Iterators |
In C++, and STL in particular, we see iterators everywhere. Python also has iterators, but these are two very different beasts.
C++ iterators:
Python Iterators:
The typical Python iteration protocol: for y in x... is as follows:
iter = x.__iter__() ##get iterator
try:
while 1:
y = iter.next() ##get each item
... ##process y
except StopIteration: pass ##iterator exhausted
Boost.Python provides some mechanisms to make C++ iterators play along nicely as Python iterators. What we need to do is to produce appropriate __iter__ function from C++ iterators that is compatible with the Python iteration protocol. For example:
object get_iterator = iterator<vector<int> >();
object iter = get_iterator(v);
object first = iter.next();
Or for use in class_<>:
.def("__iter__", iterator<vector<int> >())
range
We can create a Python savvy iterator using the range function:
Here, start/finish may be one of:
iterator
Given a container T, iterator is a shortcut that simply calls range with &T::begin, &T::end.
Let's put this into action... Here's an example from some hypothetical bogon Particle accelerator code:
f = Field()
for x in f.pions:
smash(x)
for y in f.bogons:
count(y)
Now, our C++ Wrapper:
class_<F>("Field")
.property("pions", range(&F::p_begin, &F::p_end))
.property("bogons", range(&F::b_begin, &F::b_end));
Copyright © 2002-2003 David Abrahams
Copyright © 2002-2003 Joel de Guzman
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.