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 5 #ifndef BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED 6 #define BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED 7 8 #include <boost/typeof/encode_decode.hpp> 9 #include <boost/preprocessor/facilities/identity.hpp> 10 11 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() 12 13 // modifiers 14 15 #define BOOST_TYPEOF_modifier_support(ID, Fun)\ 16 template<class V, class T> struct encode_type_impl<V, Fun(T)>\ 17 {\ 18 typedef\ 19 typename boost::type_of::encode_type<\ 20 typename boost::type_of::push_back<\ 21 V\ 22 , boost::type_of::constant<std::size_t,ID> >::type\ 23 , T>::type\ 24 type;\ 25 };\ 26 template<class Iter> struct decode_type_impl<boost::type_of::constant<std::size_t,ID>, Iter>\ 27 {\ 28 typedef boost::type_of::decode_type<Iter> d1;\ 29 typedef Fun(typename d1::type) type;\ 30 typedef typename d1::iter iter;\ 31 } 32 33 34 #define BOOST_TYPEOF_const_fun(T) const T 35 #define BOOST_TYPEOF_volatile_fun(T) volatile T 36 #define BOOST_TYPEOF_volatile_const_fun(T) volatile const T 37 #define BOOST_TYPEOF_pointer_fun(T) T* 38 #define BOOST_TYPEOF_reference_fun(T) T& 39 40 #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) 41 //Borland incorrectly handles T const, T const volatile and T volatile. 42 //It drops the decoration no matter what, so we need to try to handle T* const etc. without loosing the top modifier. 43 #define BOOST_TYPEOF_const_pointer_fun(T) T const * 44 #define BOOST_TYPEOF_const_reference_fun(T) T const & 45 #define BOOST_TYPEOF_volatile_pointer_fun(T) T volatile* 46 #define BOOST_TYPEOF_volatile_reference_fun(T) T volatile& 47 #define BOOST_TYPEOF_volatile_const_pointer_fun(T) T volatile const * 48 #define BOOST_TYPEOF_volatile_const_reference_fun(T) T volatile const & 49 #endif 50 51 BOOST_TYPEOF_BEGIN_ENCODE_NS 52 53 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_fun); 54 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_fun); 55 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_fun); 56 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_pointer_fun); 57 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_reference_fun); 58 59 #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) 60 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_pointer_fun); 61 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_const_reference_fun); 62 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_pointer_fun); 63 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_reference_fun); 64 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_pointer_fun); 65 BOOST_TYPEOF_modifier_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_TYPEOF_volatile_const_reference_fun); 66 #endif 67 68 BOOST_TYPEOF_END_ENCODE_NS 69 70 #undef BOOST_TYPEOF_modifier_support 71 #undef BOOST_TYPEOF_const_fun 72 #undef BOOST_TYPEOF_volatile_fun 73 #undef BOOST_TYPEOF_volatile_const_fun 74 #undef BOOST_TYPEOF_pointer_fun 75 #undef BOOST_TYPEOF_reference_fun 76 77 #if defined(__BORLANDC__) && (__BORLANDC__ < 0x600) 78 #undef BOOST_TYPEOF_const_pointer_fun 79 #undef BOOST_TYPEOF_const_reference_fun 80 #undef BOOST_TYPEOF_volatile_pointer_fun 81 #undef BOOST_TYPEOF_volatile_reference_fun 82 #undef BOOST_TYPEOF_volatile_const_pointer_fun 83 #undef BOOST_TYPEOF_volatile_const_reference_fun 84 #endif 85 86 // arrays 87 88 #define BOOST_TYPEOF_array_support(ID, Qualifier)\ 89 template<class V, class T, int N>\ 90 struct encode_type_impl<V, Qualifier() T[N]>\ 91 {\ 92 typedef\ 93 typename boost::type_of::encode_type<\ 94 typename boost::type_of::push_back<\ 95 typename boost::type_of::push_back<\ 96 V\ 97 , boost::type_of::constant<std::size_t,ID> >::type\ 98 , boost::type_of::constant<std::size_t,N> >::type\ 99 , T>::type\ 100 type;\ 101 };\ 102 template<class Iter>\ 103 struct decode_type_impl<boost::type_of::constant<std::size_t,ID>, Iter>\ 104 {\ 105 enum{n = Iter::type::value};\ 106 typedef boost::type_of::decode_type<typename Iter::next> d;\ 107 typedef typename d::type Qualifier() type[n];\ 108 typedef typename d::iter iter;\ 109 } 110 111 BOOST_TYPEOF_BEGIN_ENCODE_NS 112 113 BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_EMPTY); 114 BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(const)); 115 BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile)); 116 BOOST_TYPEOF_array_support(BOOST_TYPEOF_UNIQUE_ID(), BOOST_PP_IDENTITY(volatile const)); 117 BOOST_TYPEOF_END_ENCODE_NS 118 119 #undef BOOST_TYPEOF_array_support 120 121 #endif//BOOST_TYPEOF_MODIFIERS_HPP_INCLUDED 122