decorated_type_id.hpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright David Abrahams 2002.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef DECORATED_TYPE_ID_DWA2002517_HPP
  6. # define DECORATED_TYPE_ID_DWA2002517_HPP
  7. # include <boost/python/type_id.hpp>
  8. # include <boost/python/detail/indirect_traits.hpp>
  9. # include <boost/python/detail/type_traits.hpp>
  10. namespace boost { namespace python { namespace detail {
  11. struct decorated_type_info : totally_ordered<decorated_type_info>
  12. {
  13. enum decoration { const_ = 0x1, volatile_ = 0x2, reference = 0x4 };
  14. decorated_type_info(type_info, decoration = decoration());
  15. inline bool operator<(decorated_type_info const& rhs) const;
  16. inline bool operator==(decorated_type_info const& rhs) const;
  17. friend BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&);
  18. operator type_info const&() const;
  19. private: // type
  20. typedef type_info base_id_t;
  21. private: // data members
  22. decoration m_decoration;
  23. base_id_t m_base_type;
  24. };
  25. template <class T>
  26. inline decorated_type_info decorated_type_id(boost::type<T>* = 0)
  27. {
  28. return decorated_type_info(
  29. type_id<T>()
  30. , decorated_type_info::decoration(
  31. (is_const<T>::value || indirect_traits::is_reference_to_const<T>::value
  32. ? decorated_type_info::const_ : 0)
  33. | (is_volatile<T>::value || indirect_traits::is_reference_to_volatile<T>::value
  34. ? decorated_type_info::volatile_ : 0)
  35. | (is_reference<T>::value ? decorated_type_info::reference : 0)
  36. )
  37. );
  38. }
  39. inline decorated_type_info::decorated_type_info(type_info base_t, decoration decoration)
  40. : m_decoration(decoration)
  41. , m_base_type(base_t)
  42. {
  43. }
  44. inline bool decorated_type_info::operator<(decorated_type_info const& rhs) const
  45. {
  46. return m_decoration < rhs.m_decoration
  47. || (m_decoration == rhs.m_decoration
  48. && m_base_type < rhs.m_base_type);
  49. }
  50. inline bool decorated_type_info::operator==(decorated_type_info const& rhs) const
  51. {
  52. return m_decoration == rhs.m_decoration && m_base_type == rhs.m_base_type;
  53. }
  54. inline decorated_type_info::operator type_info const&() const
  55. {
  56. return m_base_type;
  57. }
  58. BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&);
  59. }}} // namespace boost::python::detail
  60. #endif // DECORATED_TYPE_ID_DWA2002517_HPP