numpy_array_converters.hxx
|
 |
36 #ifndef VIGRA_NUMPY_ARRAY_CONVERTERS_HXX 37 #define VIGRA_NUMPY_ARRAY_CONVERTERS_HXX 39 #include "numpy_array.hxx" 40 #include "metaprogramming.hxx" 41 #include <boost/python.hpp> 42 #include <boost/python/to_python_converter.hpp> 47 template <
class Array>
48 PyObject * returnNumpyArray(Array
const & a)
50 PyObject * pa = a.pyObject();
52 PyErr_SetString(PyExc_ValueError,
"returnNumpyArray(): Conversion to Python failed, array has no data.");
58 VIGRA_EXPORT std::set<std::string> & exportedArrayKeys();
60 template <
class ArrayType>
61 struct NumpyArrayConverter {};
63 template <
unsigned int N,
class T,
class Str
ide>
64 struct NumpyArrayConverter<NumpyArray<N, T, Stride> >
66 typedef NumpyArray<N, T, Stride> ArrayType;
67 typedef typename ArrayType::ArrayTraits ArrayTraits;
69 NumpyArrayConverter();
71 static void* convertible(PyObject* obj);
74 static void construct(PyObject* obj,
75 boost::python::converter::rvalue_from_python_stage1_data* data);
78 static PyObject* convert(ArrayType
const& a)
80 return returnNumpyArray(a);
84 template <
unsigned int N,
class T,
class Str
ide>
85 NumpyArrayConverter<NumpyArray<N, T, Stride> >::NumpyArrayConverter()
89 converter::registration
const * reg = converter::registry::query(type_id<ArrayType>());
93 if(!reg || !reg->rvalue_chain)
95 to_python_converter<ArrayType, NumpyArrayConverter>();
97 converter::registry::insert(&convertible, &construct, type_id<ArrayType>());
100 template <
unsigned int N,
class T,
class Str
ide>
101 void * NumpyArrayConverter<NumpyArray<N, T, Stride> >::convertible(PyObject* obj)
103 bool isCompatible = obj == Py_None || ArrayType::isStrictlyCompatible(obj);
111 template <
unsigned int N,
class T,
class Str
ide>
112 void NumpyArrayConverter<NumpyArray<N, T, Stride> >::construct(PyObject* obj,
113 boost::python::converter::rvalue_from_python_stage1_data* data)
115 void*
const storage =
116 ((boost::python::converter::rvalue_from_python_storage<ArrayType>* ) data)->storage.bytes;
118 ArrayType * array =
new (storage) ArrayType();
120 array->makeReferenceUnchecked(obj);
122 data->convertible = storage;
125 template <
unsigned int N,
class T,
class Str
ide>
126 struct NumpyArrayConverter<MultiArrayView<N, T, Stride> >
127 :
public NumpyArrayConverter<NumpyArray<N, T, Stride> >
129 typedef NumpyArrayConverter<NumpyArray<N, T, Stride> > BaseType;
130 typedef MultiArrayView<N, T, Stride> ArrayType;
132 NumpyArrayConverter()
135 converter::registry::insert(&BaseType::convertible, &BaseType::construct,
136 type_id<ArrayType>());
140 template <
class Iter,
class End>
141 struct RegisterNumpyArrayConverters
145 typedef typename UnqualifiedType<typename boost::mpl::deref<Iter>::type>::type Type;
146 NumpyArrayConverter<Type>();
147 RegisterNumpyArrayConverters<typename boost::mpl::next<Iter>::type, End>::exec();
152 struct RegisterNumpyArrayConverters<End, End>
158 template <
class Typelist>
159 void registerNumpyArrayConverters(Typelist)
161 RegisterNumpyArrayConverters<typename boost::mpl::begin<Typelist>::type,
162 typename boost::mpl::end<Typelist>::type >::exec();
166 FN registerConverters(FN f)
168 registerNumpyArrayConverters(boost::python::detail::get_signature(f));
175 namespace boost {
namespace python {
177 #define VIGRA_PYTHON_MULTITYPE_FUNCTOR(functor_name, function) \ 179 struct functor_name##Impl \ 181 typedef functor_name##Impl type; \ 183 static void def(const char * pythonName) \ 185 boost::python::def(pythonName, vigra::registerConverters(&function<T>)); \ 188 template <class A1> \ 189 static void def(const char * pythonName, A1 const & a1) \ 191 boost::python::def(pythonName, vigra::registerConverters(&function<T>), a1); \ 194 template <class A1, class A2> \ 195 static void def(const char * pythonName, A1 const & a1, A2 const & a2) \ 197 boost::python::def(pythonName, vigra::registerConverters(&function<T>), a1, a2); \ 200 template <class A1, class A2, class A3> \ 201 static void def(const char * pythonName, A1 const & a1, A2 const & a2, A3 const & a3) \ 203 boost::python::def(pythonName, vigra::registerConverters(&function<T>), a1, a2, a3); \ 208 struct functor_name##Impl<void> \ 213 template <class T1, \ 225 struct functor_name \ 226 : public boost::python::TypeList<typename functor_name##Impl<T1>::type, \ 227 boost::python::TypeList<typename functor_name##Impl<T2>::type, \ 228 boost::python::TypeList<typename functor_name##Impl<T3>::type, \ 229 boost::python::TypeList<typename functor_name##Impl<T4>::type, \ 230 boost::python::TypeList<typename functor_name##Impl<T5>::type, \ 231 boost::python::TypeList<typename functor_name##Impl<T6>::type, \ 232 boost::python::TypeList<typename functor_name##Impl<T7>::type, \ 233 boost::python::TypeList<typename functor_name##Impl<T8>::type, \ 234 boost::python::TypeList<typename functor_name##Impl<T9>::type, \ 235 boost::python::TypeList<typename functor_name##Impl<T10>::type, \ 236 boost::python::TypeList<typename functor_name##Impl<T11>::type, \ 237 boost::python::TypeList<typename functor_name##Impl<T12>::type, \ 238 boost::python::TypeList<void, void> > > > > > > > > > > > > \ 241 #define VIGRA_PYTHON_MULTITYPE_FUNCTOR_NDIM(functor_name, function) \ 242 template <class T, int N> \ 243 struct functor_name##Impl \ 245 typedef functor_name##Impl type; \ 247 static void def(const char * pythonName) \ 249 boost::python::def(pythonName, vigra::registerConverters(&function<T, N>)); \ 252 template <class A1> \ 253 static void def(const char * pythonName, A1 const & a1) \ 255 boost::python::def(pythonName, vigra::registerConverters(&function<T, N>), a1); \ 258 template <class A1, class A2> \ 259 static void def(const char * pythonName, A1 const & a1, A2 const & a2) \ 261 boost::python::def(pythonName, vigra::registerConverters(&function<T, N>), a1, a2); \ 264 template <class A1, class A2, class A3> \ 265 static void def(const char * pythonName, A1 const & a1, A2 const & a2, A3 const & a3) \ 267 boost::python::def(pythonName, vigra::registerConverters(&function<T, N>), a1, a2, a3); \ 272 struct functor_name##Impl<void, N> \ 290 struct functor_name \ 291 : public boost::python::TypeList<typename functor_name##Impl<T1, N>::type, \ 292 boost::python::TypeList<typename functor_name##Impl<T2, N>::type, \ 293 boost::python::TypeList<typename functor_name##Impl<T3, N>::type, \ 294 boost::python::TypeList<typename functor_name##Impl<T4, N>::type, \ 295 boost::python::TypeList<typename functor_name##Impl<T5, N>::type, \ 296 boost::python::TypeList<typename functor_name##Impl<T6, N>::type, \ 297 boost::python::TypeList<typename functor_name##Impl<T7, N>::type, \ 298 boost::python::TypeList<typename functor_name##Impl<T8, N>::type, \ 299 boost::python::TypeList<typename functor_name##Impl<T9, N>::type, \ 300 boost::python::TypeList<typename functor_name##Impl<T10, N>::type, \ 301 boost::python::TypeList<typename functor_name##Impl<T11, N>::type, \ 302 boost::python::TypeList<typename functor_name##Impl<T12, N>::type, \ 303 boost::python::TypeList<void, void> > > > > > > > > > > > > \ 306 template <
class Head,
class Tail>
315 template <
class Head,
class Tail>
316 inline void multidef(
char const* functor_name, TypeList<Head, Tail>)
318 Head::def(functor_name);
319 multidef(functor_name, Tail());
322 template <
class Head,
class Tail>
323 inline void multidef(
char const* functor_name, TypeList<Head, Tail>,
const char * help)
325 Head::def(functor_name);
326 multidef(functor_name, Tail(), help);
329 template <
class Head,
class Tail,
class Args>
330 inline void multidef(
char const* functor_name, TypeList<Head, Tail>, Args
const& args)
332 Head::def(functor_name, args);
333 multidef(functor_name, Tail(), args);
336 template <
class Head,
class Tail,
class Args>
337 inline void multidef(
char const* functor_name, TypeList<Head, Tail>, Args
const& args,
char const * help)
339 Head::def(functor_name, args);
340 multidef(functor_name, Tail(), args, help);
343 template <
class Head,
class Tail>
344 inline void multidef(
char const* functor_name, TypeList<Head, TypeList<void, Tail> >)
346 Head::def(functor_name);
349 template <
class Head,
class Tail,
class Args>
350 inline void multidef(
char const* functor_name, TypeList<Head, TypeList<void, Tail> >, Args
const& args)
352 Head::def(functor_name, args);
355 template <
class Head,
class Tail>
356 inline void multidef(
char const* functor_name, TypeList<Head, TypeList<void, Tail> >,
const char * help)
358 Head::def(functor_name, help);
361 template <
class Head,
class Tail,
class Args>
362 inline void multidef(
char const* functor_name, TypeList<Head, TypeList<void, Tail> >, Args
const& args,
const char * help)
364 Head::def(functor_name, args, help);
369 #endif // VIGRA_NUMPY_ARRAY_CONVERTERS_HXX Definition: adjacency_list_graph.hxx:1087
Definition: accessor.hxx:43
Definition: numpy_array_converters.hxx:175