You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
99 lines
2.6 KiB
99 lines
2.6 KiB
// 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 |
|
|
|
|