#include #include #define rangei(n) for (int i = 0; i < n; i++) namespace { // Avoid cluttering the global namespace. // A wrapper is used to define additional constructors. // struct vector_double_wrapper: std::vector { // Tell the compiler how to convert a base class object to // this wrapper object. vector_double_wrapper(PyObject*, const std::vector& vd) : std::vector(vd) {} vector_double_wrapper(PyObject* self) : std::vector() {} vector_double_wrapper(PyObject* self, const int n) : std::vector(n) {} vector_double_wrapper(PyObject* self, py::Tuple tuple) : std::vector(tuple.size()) { std::vector::iterator vd = begin(); rangei(tuple.size()) vd[i] = from_python(tuple[i].get(), py::Type()); // GCC BUG } }; double getitem(const std::vector& vd, const std::size_t key) { return vd[key]; } void setitem(std::vector& vd, const std::size_t key, const double &d) { std::vector::iterator vditer = vd.begin(); vditer[key] = d; } void delitem(std::vector& vd, const std::size_t key) { std::vector::iterator vditer = vd.begin(); vd.erase(&vditer[key]); } // Convert vector_double to a regular Python tuple. // py::Tuple as_tuple(const std::vector& vd) { py::Tuple t(vd.size()); rangei(vd.size()) t.set_item(i, py::Ptr(py::to_python(vd[i]))); // GCC BUG return t; } // Function returning a vector_double object to Python. // std::vector foo(const int n) { std::vector vd(n); std::vector::iterator vditer = vd.begin(); rangei(n) vditer[i] = double(i); return vd; } // Same as foo(), but avoid copying on return. // std::auto_ptr > bar(const int n) { std::auto_ptr > vdptr(new std::vector(n)); std::vector::iterator vditer = vdptr->begin(); rangei(n) vditer[i] = double(10 * i); return vdptr; } } BOOST_PYTHON_MODULE_INIT(example3) { py::Module this_module("example3"); py::ClassWrapper, vector_double_wrapper> vector_double(this_module, "vector_double"); vector_double.def(py::Constructor<>()); vector_double.def(py::Constructor()); vector_double.def(py::Constructor()); vector_double.def(&std::vector::size, "__len__"); vector_double.def(getitem, "__getitem__"); vector_double.def(setitem, "__setitem__"); vector_double.def(delitem, "__delitem__"); vector_double.def(as_tuple, "as_tuple"); this_module.def(foo, "foo"); this_module.def(bar, "bar"); } // Win32 DLL boilerplate #if defined(_WIN32) #include extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID) { return 1; } #endif // _WIN32