#include #include #include #include #include using namespace std; namespace bp = boost::python; namespace bl = boost::lambda; class C { size_t *v; size_t m_N; public: typedef const size_t* const_dim_iter; C(size_t N = 3) : v(new size_t[N]),m_N(N) { if (N < 1) throw invalid_argument("Wrong input parameter"); *v = 1; transform(v,v+N-1,v+1,bl::_1+static_cast(1)); } ~C() { delete []v; } const_dim_iter dbeg() { return v; } const_dim_iter dend() { return v+m_N; } template void set_dims(InIt b,InIt e) { delete []v; #ifndef WORK_AROUND m_N = distance(b,e); v = new size_t[m_N]; #else v = new size_t[5]; m_N = 5; #endif transform(b,e,v,bl::ll_static_cast(bl::_1)); } }; class PyWrap : public C { public: PyWrap(size_t N = 3) : C(N) {} void py_set_dims(bp::object o) { bp::stl_input_iterator begin(o), end; set_dims(begin,end); } }; BOOST_PYTHON_MODULE(test_range) { bp::class_("C_base", bp::init< bp::optional >("Test wrapper class for a buffer")) .add_property("dims",bp::range(&C::dbeg,&C::dend)); bp::class_ >("C", bp::init< bp::optional >("Test wrapper class for a buffer")) .def("set_dims",&PyWrap::py_set_dims); }