Ticket #3450: rangemodule.cpp

File rangemodule.cpp, 1.4 KB (added by anonymous, 13 years ago)
Line 
1#include <boost/python.hpp>
2#include <boost/python/stl_iterator.hpp>
3#include <boost/lambda/lambda.hpp>
4#include <boost/lambda/casts.hpp>
5#include <algorithm>
6
7using namespace std;
8
9namespace bp = boost::python;
10namespace bl = boost::lambda;
11
12
13class C {
14
15 size_t *v;
16
17 size_t m_N;
18
19public:
20
21 typedef const size_t* const_dim_iter;
22
23 C(size_t N = 3) : v(new size_t[N]),m_N(N) {
24 if (N < 1) throw invalid_argument("Wrong input parameter");
25
26 *v = 1;
27 transform(v,v+N-1,v+1,bl::_1+static_cast<size_t>(1));
28 }
29
30 ~C() { delete []v; }
31
32 const_dim_iter dbeg() { return v; }
33
34 const_dim_iter dend() { return v+m_N; }
35
36 template<class InIt>
37 void set_dims(InIt b,InIt e) {
38 delete []v;
39#ifndef WORK_AROUND
40 m_N = distance(b,e);
41
42 v = new size_t[m_N];
43#else
44 v = new size_t[5];
45 m_N = 5;
46#endif
47
48 transform(b,e,v,bl::ll_static_cast<size_t>(bl::_1));
49 }
50};
51
52class PyWrap : public C {
53
54public:
55
56 PyWrap(size_t N = 3) : C(N) {}
57
58 void py_set_dims(bp::object o) {
59
60 bp::stl_input_iterator<int> begin(o), end;
61 set_dims(begin,end);
62 }
63};
64
65BOOST_PYTHON_MODULE(test_range) {
66
67 bp::class_<C>("C_base", bp::init< bp::optional<size_t> >("Test wrapper class for a buffer"))
68 .add_property("dims",bp::range(&C::dbeg,&C::dend));
69
70 bp::class_<PyWrap,bp::bases<C> >("C", bp::init< bp::optional<size_t> >("Test wrapper class for a buffer"))
71 .def("set_dims",&PyWrap::py_set_dims);
72}
73