Hi all,
I'm having some trouble using boost.python to expose an input iterator that I've
implemented using boost::iterator_facade. I've included an example below. The
code will print garbage when iterating in python and segfault for more
complicated iterators, but works fine if std::input_iterator_tag is changed to
forward_iterator_tag. I've noticed this happens in VC9 and gcc.
The problem goes away if line 65 in boost/python/object/iterator.hpp is changed
from "return *self.m_start++;" to something like:
result_type r = *self.m_start;
++self.m_start;
return r;
It seems that this change should be made for input iterators, since the postfix
increment operator is allowed to return void. However, I don't fully
understand why this is a problem in my case since iterator_facade returns a
proxy iterator that can be dereferenced.
Thanks for any help,
Alec
#include <boost/python.hpp>
#include <boost/iterator/iterator_facade.hpp>
using namespace boost::python;
class container
{
public:
class iter : public boost::iterator_facade<iter, int,
std::input_iterator_tag>
{
public:
iter(int* i) : m_i(i) {}
private:
friend class boost::iterator_core_access;
void increment() { m_i++; }
int& dereference() const { return *m_i; }
bool equal(const iter& other) const { return m_i == other.m_i; }
int* m_i;
};
container() : m_data() {}
iter begin() { return iter(m_data); }
iter end() { return iter(m_data+5); }
private:
int m_data[5];
};
BOOST_PYTHON_MODULE(iter_example)
{
class_<container>("container")
.add_property("data", range(&container::begin, &container::end))
;
}
------------------------------------------
import iter_example
c = iter_example.container()
for x in c.data:
print x
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig