boost/python/converter/registered.hpp
// 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