// Copyright David Abrahams 2002. Permission to copy, use, // modify, sell and distribute this software is granted provided this // copyright notice appears in all copies. This software is provided // "as is" without express or implied warranty, and with no claim as // to its suitability for any purpose. #include #include #include #include #include #include #include #include using namespace boost::python; typedef std::list list_int; // Prove that we can handle InputIterators which return rvalues. This // input iterator example was stolen from the iterator_adaptors // documentation typedef std::binder1st > doubler; typedef boost::transform_iterator_generator::type doubling_iterator; typedef std::pair list_range2; list_range2 range2(list_int& x) { return list_range2( boost::make_transform_iterator(x.begin(), std::bind1st(std::multiplies(),2)) , boost::make_transform_iterator(x.end(), std::bind1st(std::multiplies(),2))); } // We do this in a separate module from iterators_ext (iterators.cpp) // to work around an MSVC6 linker bug, which causes it to complain // about a "duplicate comdat" if the input iterator is instantiated in // the same module with the others. BOOST_PYTHON_MODULE_INIT(input_iterator) { module("input_iterator") .def("range2", &::range2) .add( class_("list_range2") // We can wrap InputIterators which return by-value .def("__iter__" , range(&list_range2::first, &list_range2::second)) ) ; } #include "module_tail.cpp"