diff options
Diffstat (limited to 'boost/python/to_python_converter.hpp')
-rw-r--r-- | boost/python/to_python_converter.hpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/boost/python/to_python_converter.hpp b/boost/python/to_python_converter.hpp new file mode 100644 index 0000000000..378d159e97 --- /dev/null +++ b/boost/python/to_python_converter.hpp @@ -0,0 +1,99 @@ +// Copyright David Abrahams 2002. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +#ifndef TO_PYTHON_CONVERTER_DWA200221_HPP +# define TO_PYTHON_CONVERTER_DWA200221_HPP + +# include <boost/python/detail/prefix.hpp> + +# include <boost/python/converter/registry.hpp> +# include <boost/python/converter/as_to_python_function.hpp> +#ifndef BOOST_PYTHON_NO_PY_SIGNATURES +# include <boost/python/converter/pytype_function.hpp> +#endif +# include <boost/python/type_id.hpp> + +namespace boost { namespace python { + +#if 0 //get_pytype member detection +namespace detail +{ + typedef char yes_type; + typedef struct {char a[2]; } no_type; + template<PyTypeObject const * (*f)()> struct test_get_pytype1 { }; + template<PyTypeObject * (*f)()> struct test_get_pytype2 { }; + + template<class T> yes_type tester(test_get_pytype1<&T::get_pytype>*); + + template<class T> yes_type tester(test_get_pytype2<&T::get_pytype>*); + + template<class T> no_type tester(...); + + template<class T> + struct test_get_pytype_base + { + BOOST_STATIC_CONSTANT(bool, value= (sizeof(detail::tester<T>(0)) == sizeof(yes_type))); + }; + + template<class T> + struct test_get_pytype : boost::mpl::bool_<test_get_pytype_base<T>::value> + { + }; + +} +#endif + +template < class T, class Conversion, bool has_get_pytype=false > +struct to_python_converter +{ +#ifndef BOOST_PYTHON_NO_PY_SIGNATURES +#if 0 //defined _MSC_VER && _MSC_VER >=1310 + //probably other compilers could come here as well + typedef typename detail::test_get_pytype<Conversion> HasGetPytype; +#else + typedef boost::mpl::bool_<has_get_pytype> HasGetPytype; +#endif + + static PyTypeObject const* get_pytype_1(boost::mpl::true_ *) + { + return Conversion::get_pytype(); + } + + static PyTypeObject const* get_pytype_1(boost::mpl::false_ *) + { + return 0; + } + static PyTypeObject const* get_pytype_impl() + { + return get_pytype_1((HasGetPytype*)0); + } +#endif + + to_python_converter(); +}; + +// +// implementation +// + +template <class T, class Conversion ,bool has_get_pytype> +to_python_converter<T,Conversion, has_get_pytype>::to_python_converter() +{ + typedef converter::as_to_python_function< + T, Conversion + > normalized; + + converter::registry::insert( + &normalized::convert + , type_id<T>() +#ifndef BOOST_PYTHON_NO_PY_SIGNATURES + , &get_pytype_impl +#endif + ); +} + +}} // namespace boost::python + +#endif // TO_PYTHON_CONVERTER_DWA200221_HPP + |