Classdesc 3.44
python_epilogue.h
1#ifndef CLASSDESC_PYTHONOBJECT_EPILOGUE_H
2#define CLASSDESC_PYTHONOBJECT_EPILOGUE_H
3
4namespace classdesc
5{
6 template <class Derived, class Base>
7 typename enable_if<And<Not<is_same<Base,Derived>>,is_base_of<Base, Derived>>, void>::T
8 registerBase()
9 {
10 // NB this is an undocumented function
11 boost::python::objects::register_base_of<Derived>()((Base*)0);
12 }
13
14 template <class Derived, class Base>
16 registerBase()
17 {
18 }
19
20
21
22 template <class T, class Base>
24 python(python_t& p, const string& d)
25 {
26 classdesc_access::access_python<Base>().template type<T>(p,d);
27 if (is_same<T,Base>::value)
28 p.getClass<T>().completed=true;
29 else
30 // register base class to enable correct virtual function handling
31 registerBase<T,Base>();
32 }
33
34
35 template <class T, int rank>
36 void pythonDetail::ArrayGetRegisterClass<T,rank>::registerClass(python_t& p)
37 {
38 auto& c=p.getClass<ArrayGet<T,rank> >();
39 if (!c.completed)
40 {
41 c.def("__len__",&arrayMemLen<ArrayGet<T,rank>, T>).
42 def("__getitem__",&ArrayGet<T,rank>::get);
43 if (rank==1)
44 c.def("__setitem__",&ArrayGet<T,rank>::set);
45 }
46 ArrayGetRegisterClass<typename std::remove_extent<T>::type,rank-1>::registerClass(p);
47 }
48
49 template <class E>
50 void python_t::defineEnum() {
51 ExtractClassNameAndSetScope scope(*this,typeName<E>());
52 boost::python::enum_<E> e(scope.className.c_str());
53 for (auto& i: enum_keysData<E>::keysData)
54 e.value(i.name,E(i.value));
55 e.export_values();
56 }
57
58 template <class T> struct PythonTypableMember: public And<
59 Not<PythonExcludeType<typename remove_pointer<typename remove_reference<T>::type>::type>>,
60 is_complete<T>
61 > {};
62
63}
64
65namespace classdesc_access
66{
67 // string handling is already built into boost.python
68 template <class T> struct access_python<std::basic_string<T>,void>: public classdesc::NullDescriptor<classdesc::python_t> {};
69}
70
71#endif
Definition python_base.h:496
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
STL namespace.
Definition classdesc.h:420
Definition classdesc.h:405
helper for constructing null descriptors
Definition classdesc.h:1106
Definition python_epilogue.h:61
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Definition python_base.h:1208