// 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 |