diff --git a/include/boost/python/converter/class.hpp b/include/boost/python/converter/class.hpp index 305ec448..6e09a961 100644 --- a/include/boost/python/converter/class.hpp +++ b/include/boost/python/converter/class.hpp @@ -11,46 +11,54 @@ namespace boost { namespace python { namespace converter { -struct class_unwrapper_base -{ - class_unwrapper_base(type_id_t sought_type); - void* -}; - template struct class_unwrapper + : private unwrapper + , private unwrapper + , private unwrapper + , private unwrapper { - struct ref_unwrapper : unwrapper - { - bool convertible(PyObject* p) const - { - return p->ob_type == &SimpleType; - } - - simple const& convert(PyObject* p, void*&) const - { - return static_cast(p)->x; - } - - }; - -# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - struct const_ref_unwrapper : unwrapper - { - bool convertible(PyObject* p) const - { - return p->ob_type == &SimpleType; - } - - simple const& convert(PyObject* p, void*&) const - { - return static_cast(p)->x; - } - - }; -# endif + private: + void* can_convert(PyObject*) const; + T& convert(PyObject*, void*, boost::type) const; + T const& convert(PyObject*, void*, boost::type) const; + T* convert(PyObject*, void*, boost::type) const; + T const* convert(PyObject*, void*, boost::type) const; }; +// +// implementations +// +template +void* class_unwrapper::can_convert(PyObject* p) const +{ + return object::find_holder(p); +} + +template +T& class_unwrapper::convert(PyObject*, void* holder_, boost::type) const +{ + return *static_cast*>(holder_)->target(); +} + +template +T const& class_unwrapper::convert(PyObject*, void* holder_, boost::type) const +{ + return *static_cast*>(holder_)->target(); +} + +template +T* class_unwrapper::convert(PyObject*, void* holder_, boost::type) const +{ + return static_cast*>(holder_)->target(); +} + +template +T const* class_unwrapper::convert(PyObject*, void* holder_, boost::type) const +{ + return static_cast*>(holder_)->target(); +} + }}} // namespace boost::python::converter #endif // CLASS_DWA20011215_HPP