133 lines
3.2 KiB
Plaintext
133 lines
3.2 KiB
Plaintext
// Copyright David Abrahams 2002, Nikolay Mladenov 2007.
|
|
// 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 WRAP_PYTYPE_NM20070606_HPP
|
|
# define WRAP_PYTYPE_NM20070606_HPP
|
|
|
|
# include <boost/python/detail/prefix.hpp>
|
|
# include <boost/python/converter/registered.hpp>
|
|
# include <boost/python/detail/unwind_type.hpp>
|
|
|
|
|
|
namespace boost { namespace python {
|
|
|
|
namespace converter
|
|
{
|
|
template <PyTypeObject const* python_type>
|
|
struct wrap_pytype
|
|
{
|
|
static PyTypeObject const* get_pytype()
|
|
{
|
|
return python_type;
|
|
}
|
|
};
|
|
|
|
typedef PyTypeObject const* (*pytype_function)();
|
|
|
|
#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
|
|
|
|
|
|
|
|
namespace detail
|
|
{
|
|
struct unwind_type_id_helper{
|
|
typedef python::type_info result_type;
|
|
template <class U>
|
|
static result_type execute(U* ){
|
|
return python::type_id<U>();
|
|
}
|
|
};
|
|
|
|
template <class T>
|
|
inline python::type_info unwind_type_id_(boost::type<T>* = 0, mpl::false_ * =0)
|
|
{
|
|
return boost::python::detail::unwind_type<unwind_type_id_helper, T> ();
|
|
}
|
|
|
|
inline python::type_info unwind_type_id_(boost::type<void>* = 0, mpl::true_* =0)
|
|
{
|
|
return type_id<void>();
|
|
}
|
|
|
|
template <class T>
|
|
inline python::type_info unwind_type_id(boost::type<T>* p= 0)
|
|
{
|
|
return unwind_type_id_(p, (mpl::bool_<boost::is_void<T>::value >*)0 );
|
|
}
|
|
}
|
|
|
|
|
|
template <class T>
|
|
struct expected_pytype_for_arg
|
|
{
|
|
static PyTypeObject const *get_pytype()
|
|
{
|
|
const converter::registration *r=converter::registry::query(
|
|
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
|
);
|
|
return r ? r->expected_from_python_type(): 0;
|
|
}
|
|
};
|
|
|
|
|
|
template <class T>
|
|
struct registered_pytype
|
|
{
|
|
static PyTypeObject const *get_pytype()
|
|
{
|
|
const converter::registration *r=converter::registry::query(
|
|
detail::unwind_type_id_((boost::type<T>*) 0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
|
);
|
|
return r ? r->m_class_object: 0;
|
|
}
|
|
};
|
|
|
|
|
|
template <class T>
|
|
struct registered_pytype_direct
|
|
{
|
|
static PyTypeObject const* get_pytype()
|
|
{
|
|
return registered<T>::converters.m_class_object;
|
|
}
|
|
};
|
|
|
|
template <class T>
|
|
struct expected_from_python_type : expected_pytype_for_arg<T>{};
|
|
|
|
template <class T>
|
|
struct expected_from_python_type_direct
|
|
{
|
|
static PyTypeObject const* get_pytype()
|
|
{
|
|
return registered<T>::converters.expected_from_python_type();
|
|
}
|
|
};
|
|
|
|
template <class T>
|
|
struct to_python_target_type
|
|
{
|
|
static PyTypeObject const *get_pytype()
|
|
{
|
|
const converter::registration *r=converter::registry::query(
|
|
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
|
);
|
|
return r ? r->to_python_target_type(): 0;
|
|
}
|
|
};
|
|
|
|
template <class T>
|
|
struct to_python_target_type_direct
|
|
{
|
|
static PyTypeObject const *get_pytype()
|
|
{
|
|
return registered<T>::converters.to_python_target_type();
|
|
}
|
|
};
|
|
#endif
|
|
|
|
}}} // namespace boost::python
|
|
|
|
#endif // WRAP_PYTYPE_NM20070606_HPP
|