69 lines
1.7 KiB
Plaintext
69 lines
1.7 KiB
Plaintext
|
// 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 POINTER_TYPE_ID_DWA2002222_HPP
|
||
|
# define POINTER_TYPE_ID_DWA2002222_HPP
|
||
|
|
||
|
# include <boost/python/type_id.hpp>
|
||
|
# include <boost/type_traits/composite_traits.hpp>
|
||
|
|
||
|
namespace boost { namespace python { namespace converter {
|
||
|
|
||
|
namespace detail
|
||
|
{
|
||
|
template <bool is_ref = false>
|
||
|
struct pointer_typeid_select
|
||
|
{
|
||
|
template <class T>
|
||
|
static inline type_info execute(T*(*)() = 0)
|
||
|
{
|
||
|
return type_id<T>();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <>
|
||
|
struct pointer_typeid_select<true>
|
||
|
{
|
||
|
template <class T>
|
||
|
static inline type_info execute(T* const volatile&(*)() = 0)
|
||
|
{
|
||
|
return type_id<T>();
|
||
|
}
|
||
|
|
||
|
template <class T>
|
||
|
static inline type_info execute(T*volatile&(*)() = 0)
|
||
|
{
|
||
|
return type_id<T>();
|
||
|
}
|
||
|
|
||
|
template <class T>
|
||
|
static inline type_info execute(T*const&(*)() = 0)
|
||
|
{
|
||
|
return type_id<T>();
|
||
|
}
|
||
|
|
||
|
template <class T>
|
||
|
static inline type_info execute(T*&(*)() = 0)
|
||
|
{
|
||
|
return type_id<T>();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Usage: pointer_type_id<T>()
|
||
|
//
|
||
|
// Returns a type_info associated with the type pointed
|
||
|
// to by T, which may be a pointer or a reference to a pointer.
|
||
|
template <class T>
|
||
|
type_info pointer_type_id(T(*)() = 0)
|
||
|
{
|
||
|
return detail::pointer_typeid_select<
|
||
|
is_reference<T>::value
|
||
|
>::execute((T(*)())0);
|
||
|
}
|
||
|
|
||
|
}}} // namespace boost::python::converter
|
||
|
|
||
|
#endif // POINTER_TYPE_ID_DWA2002222_HPP
|