Hi Michele,
Thanks for the pointers, but unfortunately I don't think they apply in
my case. It seems that boost support for iterators was written *only*
with STL-like iterators in mind. You have to have begin() and end() and
to be able to dereference the iterator. I can't do it (or I don't know
how to do it).
In contrast, my iterators are more like python iteration sequence, with
only one method: get_next(), which returns the next object in the
container *and* advances the iterator at the same time. I can't
dereference this iterator, as you would do in STL.
In fact, this seems to be so close to the python iteration model, that a
simple approach should be doable:
BOOST_PYTHON_MODULE(vegetables)
{
class_<Garden>("Garden")
.def("get_potatoes", &Garden::get_potatoes)
.def("get_tomatoes", &Garden::get_tomatoes)
;
class_<TomatoIter>("TomatoIter")
.def("__iter__", &TomatoIter::get_next)
;
}
That at least compiles - unlike all my previous attempts that generate
three pages of template errors - but python complain:
TypeError: iter() returned non-iterator of type 'Tomato'
so now I am trying to figure out how to tell boost that get_tomatoes
returns an iterator ...
Thomas
Michele De Stefano wrote:
Thomas,
I think the answer is here:
http://www.boost.org/doc/libs/1_40_0/libs/python/doc/tutorial/doc/html/python/iterators.html
but you should modify your "Garden" class in order to support "begin"
and "end" iterators for "tomatoes" and "potatoes".
With these modifications:
class Garden {
public:
typedef .... Tomato_Iter;
typedef .... Potato_Iter;
Tomato_Iter tomatoes_begin();
Tomato_Iter tomatoes_end();
Potato_Iter potatoes_begin();
Potato_Iter potatoes_end();
};
you can expose your Garden class as here:
class_<Garden>("Garden")
.property("tomatoes", range(&Garden::tomatoes_begin, &Garden::tomatoes_end))
.property("potatoes", range(&Garden::potatoes_begin,
&Garden::potatoes_end));
At this point, in Python, you should be able to write:
for potato in garden.potatoes:
.... and do here whatever you want ...
It's the best I can suggest
2009/11/6 Thomas Daniel <thomas...@yahoo.com>:
I am having trouble wrapping a container that can hold multiple object types
and therefore has multiple iterator types.
My C++ library has these classes:
class Tomato;
class Potato;
class Garden {
Iter<Tomato> get_tomatoes();
Iter<Potato> get_potatoes();
};
template<class T>
class Iter {
T get_next();
};
which allows to write:
Iter<Potato> potatoes = garden.get_potatoes();
while (Potato potato = potatoes.get_next()) {
cout << potato.name();
}
I am trying to use boost to wrap it so that I can write in python:
for potato in garden.get_potatoes():
print potato.name()
Any pointers how to achieve this with boost?
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig