]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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::mpl::size_t<ID> >::type\ | |
23 | , T>::type\ | |
24 | type;\ | |
25 | };\ | |
26 | template<class Iter> struct decode_type_impl<boost::mpl::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::mpl::size_t<ID> >::type\ | |
98 | , boost::mpl::size_t<N> >::type\ | |
99 | , T>::type\ | |
100 | type;\ | |
101 | };\ | |
102 | template<class Iter>\ | |
103 | struct decode_type_impl<boost::mpl::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 |