127 lines
3.0 KiB
Plaintext
127 lines
3.0 KiB
Plaintext
// Copyright David Abrahams 2002.
|
|
// Copyright Stefan Seefeld 2016.
|
|
// 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 boost_python_converter_registered_hpp_
|
|
#define boost_python_converter_registered_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/type.hpp>
|
|
#include <memory>
|
|
#if defined(BOOST_PYTHON_TRACE_REGISTRY) \
|
|
|| defined(BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND)
|
|
# include <iostream>
|
|
#endif
|
|
|
|
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 !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> >());
|
|
}
|
|
|
|
#if __cplusplus >= 201103L
|
|
template <class T>
|
|
inline void
|
|
register_shared_ptr0(std::shared_ptr<T>*)
|
|
{
|
|
registry::lookup_shared_ptr(type_id<std::shared_ptr<T> >());
|
|
}
|
|
#endif
|
|
|
|
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
|