1111# include < boost/python/pointee.hpp>
1212# include < boost/python/object/value_holder.hpp>
1313# include < boost/python/object/pointer_holder.hpp>
14+ # include < boost/python/object/find_instance.hpp>
1415# include < boost/type.hpp>
1516# include < boost/mpl/select_type.hpp>
1617# include < boost/type_traits/same_traits.hpp>
18+ # include < boost/mpl/bool_t.hpp>
1719
1820namespace boost { namespace python { namespace objects {
1921
@@ -28,9 +30,24 @@ namespace detail
2830 selector
2931 , value_holder_back_reference<T,Held>
3032 , value_holder<T>
31- >::type holder ;
33+ >::type type ;
3234
33- static holder* get () { return 0 ; }
35+ static inline void register_ ()
36+ {
37+ select_value_holder::register_ (mpl::bool_t <selector>());
38+ }
39+
40+ static type* get () { return 0 ; }
41+
42+ private:
43+ static inline void register_ (mpl::bool_t <true >)
44+ {
45+ python::detail::force_instantiate (instance_finder<Held>::registration);
46+ }
47+
48+ static inline void register_ (mpl::bool_t <false >)
49+ {
50+ }
3451 };
3552
3653 template <class T ,class Ptr >
@@ -43,9 +60,47 @@ namespace detail
4360 selector
4461 , pointer_holder_back_reference<Ptr,T>
4562 , pointer_holder<Ptr,T>
46- >::type holder;
63+ >::type type;
64+
65+ static inline void register_ ()
66+ {
67+ select_pointer_holder::register_ (mpl::bool_t <selector>());
68+ }
69+
70+ static type* get () { return 0 ; }
71+
72+ private:
73+ static inline void register_ (mpl::bool_t <true >)
74+ {
75+ // not implemented at least until we solve the back
76+ // reference issue mentioned in pointer_holder.hpp.
77+ //
78+ // python::detail::force_instantiate(
79+ // class_wrapper<Pointer,pointer_holder_back_reference<Pointer,Value> >());
80+
81+ python::detail::force_instantiate (instance_finder<Ptr>::registration);
82+ python::detail::force_instantiate (instance_finder<pointee>::registration);
83+ }
84+
85+ struct construct_from_pointer
86+ {
87+ static type* execute (PyObject*, Ptr x)
88+ {
89+ return new type (x);
90+ }
91+ };
4792
48- static holder* get () { return 0 ; }
93+ static inline void register_ (mpl::bool_t <false >)
94+ {
95+ python::detail::force_instantiate (
96+ objects::class_wrapper<
97+ Ptr
98+ , type
99+ , construct_from_pointer>());
100+
101+ python::detail::force_instantiate (
102+ instance_finder<Ptr>::registration);
103+ }
49104 };
50105}
51106
0 commit comments