Chris@16
|
1
|
Chris@16
|
2 // NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
|
Chris@16
|
3
|
Chris@16
|
4 #if defined(BOOST_PP_IS_ITERATING)
|
Chris@16
|
5
|
Chris@16
|
6 // Copyright Aleksey Gurtovoy 2000-2004
|
Chris@16
|
7 //
|
Chris@16
|
8 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
9 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
10 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
11 //
|
Chris@16
|
12 // See http://www.boost.org/libs/mpl for documentation.
|
Chris@16
|
13
|
Chris@101
|
14 // $Id$
|
Chris@101
|
15 // $Date$
|
Chris@101
|
16 // $Revision$
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/preprocessor/enum_params.hpp>
|
Chris@16
|
19 #include <boost/preprocessor/enum_shifted_params.hpp>
|
Chris@16
|
20 #include <boost/preprocessor/comma_if.hpp>
|
Chris@16
|
21 #include <boost/preprocessor/repeat.hpp>
|
Chris@16
|
22 #include <boost/preprocessor/dec.hpp>
|
Chris@16
|
23 #include <boost/preprocessor/cat.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #define i_ BOOST_PP_FRAME_ITERATION(1)
|
Chris@16
|
26
|
Chris@16
|
27 #if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)
|
Chris@16
|
28
|
Chris@16
|
29 # define AUX778076_VECTOR_TAIL(vector, i_, T) \
|
Chris@16
|
30 BOOST_PP_CAT(vector,i_)< \
|
Chris@16
|
31 BOOST_PP_ENUM_PARAMS(i_, T) \
|
Chris@16
|
32 > \
|
Chris@16
|
33 /**/
|
Chris@16
|
34
|
Chris@16
|
35 #if i_ > 0
|
Chris@16
|
36 template<
|
Chris@16
|
37 BOOST_PP_ENUM_PARAMS(i_, typename T)
|
Chris@16
|
38 >
|
Chris@16
|
39 struct BOOST_PP_CAT(vector,i_)
|
Chris@16
|
40 : v_item<
|
Chris@16
|
41 BOOST_PP_CAT(T,BOOST_PP_DEC(i_))
|
Chris@16
|
42 , AUX778076_VECTOR_TAIL(vector,BOOST_PP_DEC(i_),T)
|
Chris@16
|
43 >
|
Chris@16
|
44 {
|
Chris@16
|
45 typedef BOOST_PP_CAT(vector,i_) type;
|
Chris@16
|
46 };
|
Chris@16
|
47 #endif
|
Chris@16
|
48
|
Chris@16
|
49 # undef AUX778076_VECTOR_TAIL
|
Chris@16
|
50
|
Chris@16
|
51 #else // "brute force" implementation
|
Chris@16
|
52
|
Chris@16
|
53 # if i_ > 0
|
Chris@16
|
54
|
Chris@16
|
55 template<
|
Chris@16
|
56 BOOST_PP_ENUM_PARAMS(i_, typename T)
|
Chris@16
|
57 >
|
Chris@16
|
58 struct BOOST_PP_CAT(vector,i_)
|
Chris@16
|
59 {
|
Chris@16
|
60 typedef aux::vector_tag<i_> tag;
|
Chris@16
|
61 typedef BOOST_PP_CAT(vector,i_) type;
|
Chris@16
|
62
|
Chris@16
|
63 # define AUX778076_VECTOR_ITEM(unused, i_, unused2) \
|
Chris@16
|
64 typedef BOOST_PP_CAT(T,i_) BOOST_PP_CAT(item,i_); \
|
Chris@16
|
65 /**/
|
Chris@16
|
66
|
Chris@16
|
67 BOOST_PP_REPEAT(i_, AUX778076_VECTOR_ITEM, unused)
|
Chris@16
|
68 # undef AUX778076_VECTOR_ITEM
|
Chris@16
|
69 typedef void_ BOOST_PP_CAT(item,i_);
|
Chris@16
|
70 typedef BOOST_PP_CAT(T,BOOST_PP_DEC(i_)) back;
|
Chris@16
|
71
|
Chris@16
|
72 // Borland forces us to use 'type' here (instead of the class name)
|
Chris@16
|
73 typedef v_iter<type,0> begin;
|
Chris@16
|
74 typedef v_iter<type,i_> end;
|
Chris@16
|
75 };
|
Chris@16
|
76
|
Chris@16
|
77 template<>
|
Chris@16
|
78 struct push_front_impl< aux::vector_tag<BOOST_PP_DEC(i_)> >
|
Chris@16
|
79 {
|
Chris@16
|
80 template< typename Vector, typename T > struct apply
|
Chris@16
|
81 {
|
Chris@16
|
82 typedef BOOST_PP_CAT(vector,i_)<
|
Chris@16
|
83 T
|
Chris@16
|
84 BOOST_PP_COMMA_IF(BOOST_PP_DEC(i_))
|
Chris@16
|
85 BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
|
Chris@16
|
86 > type;
|
Chris@16
|
87 };
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 template<>
|
Chris@16
|
91 struct pop_front_impl< aux::vector_tag<i_> >
|
Chris@16
|
92 {
|
Chris@16
|
93 template< typename Vector > struct apply
|
Chris@16
|
94 {
|
Chris@16
|
95 typedef BOOST_PP_CAT(vector,BOOST_PP_DEC(i_))<
|
Chris@16
|
96 BOOST_PP_ENUM_SHIFTED_PARAMS(i_, typename Vector::item)
|
Chris@16
|
97 > type;
|
Chris@16
|
98 };
|
Chris@16
|
99 };
|
Chris@16
|
100
|
Chris@16
|
101
|
Chris@16
|
102 template<>
|
Chris@16
|
103 struct push_back_impl< aux::vector_tag<BOOST_PP_DEC(i_)> >
|
Chris@16
|
104 {
|
Chris@16
|
105 template< typename Vector, typename T > struct apply
|
Chris@16
|
106 {
|
Chris@16
|
107 typedef BOOST_PP_CAT(vector,i_)<
|
Chris@16
|
108 BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
|
Chris@16
|
109 BOOST_PP_COMMA_IF(BOOST_PP_DEC(i_))
|
Chris@16
|
110 T
|
Chris@16
|
111 > type;
|
Chris@16
|
112 };
|
Chris@16
|
113 };
|
Chris@16
|
114
|
Chris@16
|
115 template<>
|
Chris@16
|
116 struct pop_back_impl< aux::vector_tag<i_> >
|
Chris@16
|
117 {
|
Chris@16
|
118 template< typename Vector > struct apply
|
Chris@16
|
119 {
|
Chris@16
|
120 typedef BOOST_PP_CAT(vector,BOOST_PP_DEC(i_))<
|
Chris@16
|
121 BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(i_), typename Vector::item)
|
Chris@16
|
122 > type;
|
Chris@16
|
123 };
|
Chris@16
|
124 };
|
Chris@16
|
125
|
Chris@16
|
126 # endif // i_ > 0
|
Chris@16
|
127
|
Chris@16
|
128 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
Chris@16
|
129 && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
|
Chris@16
|
130
|
Chris@16
|
131 template< typename V >
|
Chris@16
|
132 struct v_at<V,i_>
|
Chris@16
|
133 {
|
Chris@16
|
134 typedef typename V::BOOST_PP_CAT(item,i_) type;
|
Chris@16
|
135 };
|
Chris@16
|
136
|
Chris@16
|
137 # else
|
Chris@16
|
138
|
Chris@16
|
139 namespace aux {
|
Chris@16
|
140 template<> struct v_at_impl<i_>
|
Chris@16
|
141 {
|
Chris@16
|
142 template< typename V_ > struct result_
|
Chris@16
|
143 {
|
Chris@16
|
144 typedef typename V_::BOOST_PP_CAT(item,i_) type;
|
Chris@16
|
145 };
|
Chris@16
|
146 };
|
Chris@16
|
147 }
|
Chris@16
|
148
|
Chris@16
|
149 template<>
|
Chris@16
|
150 struct at_impl< aux::vector_tag<i_> >
|
Chris@16
|
151 {
|
Chris@16
|
152 template< typename V_, typename N > struct apply
|
Chris@16
|
153 {
|
Chris@16
|
154 typedef typename aux::v_at_impl<BOOST_MPL_AUX_VALUE_WKND(N)::value>
|
Chris@16
|
155 ::template result_<V_>::type type;
|
Chris@16
|
156 };
|
Chris@16
|
157 };
|
Chris@16
|
158
|
Chris@16
|
159 #if i_ > 0
|
Chris@16
|
160 template<>
|
Chris@16
|
161 struct front_impl< aux::vector_tag<i_> >
|
Chris@16
|
162 {
|
Chris@16
|
163 template< typename Vector > struct apply
|
Chris@16
|
164 {
|
Chris@16
|
165 typedef typename Vector::item0 type;
|
Chris@16
|
166 };
|
Chris@16
|
167 };
|
Chris@16
|
168
|
Chris@16
|
169 template<>
|
Chris@16
|
170 struct back_impl< aux::vector_tag<i_> >
|
Chris@16
|
171 {
|
Chris@16
|
172 template< typename Vector > struct apply
|
Chris@16
|
173 {
|
Chris@16
|
174 typedef typename Vector::back type;
|
Chris@16
|
175 };
|
Chris@16
|
176 };
|
Chris@16
|
177
|
Chris@16
|
178 template<>
|
Chris@16
|
179 struct empty_impl< aux::vector_tag<i_> >
|
Chris@16
|
180 {
|
Chris@16
|
181 template< typename Vector > struct apply
|
Chris@16
|
182 : false_
|
Chris@16
|
183 {
|
Chris@16
|
184 };
|
Chris@16
|
185 };
|
Chris@16
|
186 #endif
|
Chris@16
|
187
|
Chris@16
|
188 template<>
|
Chris@16
|
189 struct size_impl< aux::vector_tag<i_> >
|
Chris@16
|
190 {
|
Chris@16
|
191 template< typename Vector > struct apply
|
Chris@16
|
192 : long_<i_>
|
Chris@16
|
193 {
|
Chris@16
|
194 };
|
Chris@16
|
195 };
|
Chris@16
|
196
|
Chris@16
|
197 template<>
|
Chris@16
|
198 struct O1_size_impl< aux::vector_tag<i_> >
|
Chris@16
|
199 : size_impl< aux::vector_tag<i_> >
|
Chris@16
|
200 {
|
Chris@16
|
201 };
|
Chris@16
|
202
|
Chris@16
|
203 template<>
|
Chris@16
|
204 struct clear_impl< aux::vector_tag<i_> >
|
Chris@16
|
205 {
|
Chris@16
|
206 template< typename Vector > struct apply
|
Chris@16
|
207 {
|
Chris@16
|
208 typedef vector0<> type;
|
Chris@16
|
209 };
|
Chris@16
|
210 };
|
Chris@16
|
211
|
Chris@16
|
212 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
Chris@16
|
213
|
Chris@16
|
214 #endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES
|
Chris@16
|
215
|
Chris@16
|
216 #undef i_
|
Chris@16
|
217
|
Chris@16
|
218 #endif // BOOST_PP_IS_ITERATING
|