modifiers.hpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright (C) 2004 Arkadiy Vertleyb
  2. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #ifndef BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED
  5. #define BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED
  6. #include <boost/typeof/encode_decode.hpp>
  7. #include <boost/preprocessor/facilities/identity.hpp>
  8. #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
  9. // modifiers
  10. #define BOOST_TYPEOF_modifier_support(ID, Fun)\
  11. template<class V, class T> struct encode_type_impl<V, Fun(T)>\
  12. {\
  13. typedef\
  14. typename boost::type_of::encode_type<\
  15. typename boost::type_of::push_back<\
  16. V\
  17. , boost::type_of::constant<std::size_t,ID> >::type\
  18. , T>::type\
  19. type;\
  20. };\
  21. template<class Iter> struct decode_type_impl<boost::type_of::constant<std::size_t,ID>, Iter>\
  22. {\
  23. typedef boost::type_of::decode_type<Iter> d1;\
  24. typedef Fun(typename d1::type) type;\
  25. typedef typename d1::iter iter;\
  26. }
  27. #define BOOST_TYPEOF_const_fun(T) const T
  28. #define BOOST_TYPEOF_volatile_fun(T) volatile T
  29. #define BOOST_TYPEOF_volatile_const_fun(T) volatile const T
  30. #define BOOST_TYPEOF_pointer_fun(T) T*
  31. #define BOOST_TYPEOF_reference_fun(T) T&
  32. #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
  33. //Borland incorrectly handles T const, T const volatile and T volatile.
  34. //It drops the decoration no matter what, so we need to try to handle T* const etc. without loosing the top modifier.
  35. #define BOOST_TYPEOF_const_pointer_fun(T) T const *
  36. #define BOOST_TYPEOF_const_reference_fun(T) T const &
  37. #define BOOST_TYPEOF_volatile_pointer_fun(T) T volatile*
  38. #define BOOST_TYPEOF_volatile_reference_fun(T) T volatile&
  39. #define BOOST_TYPEOF_volatile_const_pointer_fun(T) T volatile const *
  40. #define BOOST_TYPEOF_volatile_const_reference_fun(T) T volatile const &
  41. #endif
  42. BOOST_TYPEOF_BEGIN_ENCODE_NS
  43. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_fun);
  44. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_fun);
  45. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_fun);
  46. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_pointer_fun);
  47. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_reference_fun);
  48. #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
  49. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_pointer_fun);
  50. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_reference_fun);
  51. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_pointer_fun);
  52. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_reference_fun);
  53. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_pointer_fun);
  54. BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_reference_fun);
  55. #endif
  56. BOOST_TYPEOF_END_ENCODE_NS
  57. #undef BOOST_TYPEOF_modifier_support
  58. #undef BOOST_TYPEOF_const_fun
  59. #undef BOOST_TYPEOF_volatile_fun
  60. #undef BOOST_TYPEOF_volatile_const_fun
  61. #undef BOOST_TYPEOF_pointer_fun
  62. #undef BOOST_TYPEOF_reference_fun
  63. #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
  64. #undef BOOST_TYPEOF_const_pointer_fun
  65. #undef BOOST_TYPEOF_const_reference_fun
  66. #undef BOOST_TYPEOF_volatile_pointer_fun
  67. #undef BOOST_TYPEOF_volatile_reference_fun
  68. #undef BOOST_TYPEOF_volatile_const_pointer_fun
  69. #undef BOOST_TYPEOF_volatile_const_reference_fun
  70. #endif
  71. // arrays
  72. #define BOOST_TYPEOF_array_support(ID, Qualifier)\
  73. template<class V, class T, int N>\
  74. struct encode_type_impl<V, Qualifier() T[N]>\
  75. {\
  76. typedef\
  77. typename boost::type_of::encode_type<\
  78. typename boost::type_of::push_back<\
  79. typename boost::type_of::push_back<\
  80. V\
  81. , boost::type_of::constant<std::size_t,ID> >::type\
  82. , boost::type_of::constant<std::size_t,N> >::type\
  83. , T>::type\
  84. type;\
  85. };\
  86. template<class Iter>\
  87. struct decode_type_impl<boost::type_of::constant<std::size_t,ID>, Iter>\
  88. {\
  89. enum{n = Iter::type::value};\
  90. typedef boost::type_of::decode_type<typename Iter::next> d;\
  91. typedef typename d::type Qualifier() type[n];\
  92. typedef typename d::iter iter;\
  93. }
  94. BOOST_TYPEOF_BEGIN_ENCODE_NS
  95. BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_EMPTY);
  96. BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(const));
  97. BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile));
  98. BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile const));
  99. BOOST_TYPEOF_END_ENCODE_NS
  100. #undef BOOST_TYPEOF_array_support
  101. #endif//BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED