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 7 2009 2:32PM messages near this date
Re: [C++-sig] Iterators for heterogeneous container | [C++-sig] cannot find -lboost_python after upgrade to Ubuntu 9.10
troy d. straszheim wrote:
>  Thomas Daniel wrote:
> >
> > 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 ...
> >
> 
>  Please don't top-post, guys
> 
>  As you know, python iterators have a function next() that returns the 
>  next object in the iteree, or throw StopIteration when they're at the 
>  end.  As you also know, python expects member functions __iter__() to 
>  return an iterator.  Is the thing returned by TomatoIter::get_next an 
>  iterator, ie does it implement the iterator interface?
> 
>  -t
> 
> 
Thank you very much for the email, you did put me on the right track and 
I finally figured out how to do it, with help from here also: 
http://wiki.python.org/moin/boost.python/iterator

The solution involves creating a wrapper class around get_next(), which 
throws StopIteration when done and a "pass_through" function to bind to 
__iter__:

inline TomatoIter pass_through(const TomatoIter& iter) { return iter; }

Tomato next(TomatoIter& iter) {
    Tomato tomato = iter.get_next();
    if (!tomato) {
        PyErr_SetString(PyExc_StopIteration, "No more data.");
        throw_error_already_set();
    }
    return tomato;
}

Now, I can do this:
BOOST_PYTHON_MODULE(Garden)
{  
     ......
    class_<TomatoIter> ("TomatoIter", no_init)
        .def("next", next)
        .def("__iter__", pass_through)
    ;

and it works.

Thomas

_______________________________________________
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