00001 #ifndef OST_EXPORT_HELPER_VECTOR_HH
00002 #define OST_EXPORT_HELPER_VECTOR_HH
00003
00004 #include <boost/python/def_visitor.hpp>
00005 #include <boost/python/suite/indexing/container_utils.hpp>
00006
00007
00008
00009
00010 namespace geom {
00011
00012 namespace bp=boost::python;
00013 template <typename Container>
00014 class VectorAdditions :
00015 public bp::def_visitor<VectorAdditions<Container> > {
00016 public:
00017 typedef typename Container::value_type value_type;
00018 typedef Container container_type;
00019 template <class Class>
00020 void visit(Class& cl) const
00021 {
00022 cl
00023 .def("__str__", &to_string)
00024 .def("__init__", make_constructor(&from_iter))
00025 ;
00026 }
00027 private:
00028 static boost::shared_ptr<Container> from_iter(const bp::object& obj)
00029 {
00030 boost::shared_ptr<Container> c(new Container);
00031 bp::container_utils::extend_container(*c.get(), obj);
00032 return c;
00033 }
00034
00035 static std::string to_string(Container& cl)
00036 {
00037 std::stringstream ss;
00038 ss << "[";
00039 bool first=true;
00040 for (typename Container::const_iterator
00041 i=cl.begin(), e=cl.end(); i!=e; ++i) {
00042 if (first) {
00043 first=false;
00044 } else {
00045 ss << ", ";
00046 }
00047 ss << (*i);
00048 }
00049 ss << "]";
00050 return ss.str();
00051 }
00052 };
00053
00054 }
00055
00056 #endif