Re: [C++-sig] Iterators for heterogeneous container
by Thomas Daniel other posts by this author
Nov 6 2009 10:57PM messages near this date
Re: [C++-sig] Iterators for heterogeneous container
|
Re: [C++-sig] Iterators for heterogeneous container
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.ht
ml
>
> 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 <thomasd57@[...].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@[...].org
> > http://mail.python.org/mailman/listinfo/cplusplus-sig
> >
> >
>
>
>
>
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@[...].org
http://mail.python.org/mailman/listinfo/cplusplus-sig
Thread:
Thomas Daniel
Michele De Stefano
Thomas Daniel
Troy D. Straszheim
Thomas Daniel
|