// 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 REGISTERED_DWA2002710_HPP | |
# define REGISTERED_DWA2002710_HPP | |
# include <boost/python/type_id.hpp> | |
# include <boost/python/converter/registry.hpp> | |
# include <boost/python/converter/registrations.hpp> | |
# include <boost/type_traits/transform_traits.hpp> | |
# include <boost/type_traits/cv_traits.hpp> | |
# include <boost/type_traits/is_void.hpp> | |
# include <boost/detail/workaround.hpp> | |
# include <boost/python/type_id.hpp> | |
# include <boost/type.hpp> | |
namespace boost { | |
// You'll see shared_ptr mentioned in this header because we need to | |
// note which types are shared_ptrs in their registrations, to | |
// implement special shared_ptr handling for rvalue conversions. | |
template <class T> class shared_ptr; | |
namespace python { namespace converter { | |
struct registration; | |
namespace detail | |
{ | |
template <class T> | |
struct registered_base | |
{ | |
static registration const& converters; | |
}; | |
} | |
template <class T> | |
struct registered | |
: detail::registered_base< | |
typename add_reference< | |
typename add_cv<T>::type | |
>::type | |
> | |
{ | |
}; | |
# if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ | |
&& !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) | |
// collapses a few more types to the same static instance. MSVC7.1 | |
// fails to strip cv-qualification from array types in typeid. For | |
// some reason we can't use this collapse there or array converters | |
// will not be found. | |
template <class T> | |
struct registered<T&> | |
: registered<T> {}; | |
# endif | |
// | |
// implementations | |
// | |
namespace detail | |
{ | |
inline void | |
register_shared_ptr0(...) | |
{ | |
} | |
template <class T> | |
inline void | |
register_shared_ptr0(shared_ptr<T>*) | |
{ | |
registry::lookup_shared_ptr(type_id<shared_ptr<T> >()); | |
} | |
template <class T> | |
inline void | |
register_shared_ptr1(T const volatile*) | |
{ | |
detail::register_shared_ptr0((T*)0); | |
} | |
template <class T> | |
inline registration const& | |
registry_lookup2(T&(*)()) | |
{ | |
detail::register_shared_ptr1((T*)0); | |
return registry::lookup(type_id<T&>()); | |
} | |
template <class T> | |
inline registration const& | |
registry_lookup1(type<T>) | |
{ | |
return registry_lookup2((T(*)())0); | |
} | |
inline registration const& | |
registry_lookup1(type<const volatile void>) | |
{ | |
detail::register_shared_ptr1((void*)0); | |
return registry::lookup(type_id<void>()); | |
} | |
template <class T> | |
registration const& registered_base<T>::converters = detail::registry_lookup1(type<T>()); | |
} | |
}}} // namespace boost::python::converter | |
#endif // REGISTERED_DWA2002710_HPP |