// 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 | |