77 lines
2.5 KiB
Plaintext
77 lines
2.5 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 DECORATED_TYPE_ID_DWA2002517_HPP
|
||
|
# define DECORATED_TYPE_ID_DWA2002517_HPP
|
||
|
|
||
|
# include <boost/python/type_id.hpp>
|
||
|
# include <boost/python/detail/indirect_traits.hpp>
|
||
|
# include <boost/type_traits/cv_traits.hpp>
|
||
|
|
||
|
namespace boost { namespace python { namespace detail {
|
||
|
|
||
|
struct decorated_type_info : totally_ordered<decorated_type_info>
|
||
|
{
|
||
|
enum decoration { const_ = 0x1, volatile_ = 0x2, reference = 0x4 };
|
||
|
|
||
|
decorated_type_info(type_info, decoration = decoration());
|
||
|
|
||
|
inline bool operator<(decorated_type_info const& rhs) const;
|
||
|
inline bool operator==(decorated_type_info const& rhs) const;
|
||
|
|
||
|
friend BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&);
|
||
|
|
||
|
operator type_info const&() const;
|
||
|
private: // type
|
||
|
typedef type_info base_id_t;
|
||
|
|
||
|
private: // data members
|
||
|
decoration m_decoration;
|
||
|
base_id_t m_base_type;
|
||
|
};
|
||
|
|
||
|
template <class T>
|
||
|
inline decorated_type_info decorated_type_id(boost::type<T>* = 0)
|
||
|
{
|
||
|
return decorated_type_info(
|
||
|
type_id<T>()
|
||
|
, decorated_type_info::decoration(
|
||
|
(is_const<T>::value || indirect_traits::is_reference_to_const<T>::value
|
||
|
? decorated_type_info::const_ : 0)
|
||
|
| (is_volatile<T>::value || indirect_traits::is_reference_to_volatile<T>::value
|
||
|
? decorated_type_info::volatile_ : 0)
|
||
|
| (is_reference<T>::value ? decorated_type_info::reference : 0)
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
inline decorated_type_info::decorated_type_info(type_info base_t, decoration decoration)
|
||
|
: m_decoration(decoration)
|
||
|
, m_base_type(base_t)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
inline bool decorated_type_info::operator<(decorated_type_info const& rhs) const
|
||
|
{
|
||
|
return m_decoration < rhs.m_decoration
|
||
|
|| (m_decoration == rhs.m_decoration
|
||
|
&& m_base_type < rhs.m_base_type);
|
||
|
}
|
||
|
|
||
|
inline bool decorated_type_info::operator==(decorated_type_info const& rhs) const
|
||
|
{
|
||
|
return m_decoration == rhs.m_decoration && m_base_type == rhs.m_base_type;
|
||
|
}
|
||
|
|
||
|
inline decorated_type_info::operator type_info const&() const
|
||
|
{
|
||
|
return m_base_type;
|
||
|
}
|
||
|
|
||
|
BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&);
|
||
|
|
||
|
}}} // namespace boost::python::detail
|
||
|
|
||
|
#endif // DECORATED_TYPE_ID_DWA2002517_HPP
|