ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> cpp-sig
cpp-sig
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

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved