]> git.lyx.org Git - lyx.git/blob - 3rdparty/boost/boost/fusion/container/vector/detail/cpp03/vector_n.hpp
Update to boost 1.72
[lyx.git] / 3rdparty / boost / boost / fusion / container / vector / detail / cpp03 / vector_n.hpp
1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 // No include guard. This file is meant to be included many times
8
9 #if !defined(FUSION_MACRO_05042005)
10 #define FUSION_MACRO_05042005
11
12 #define FUSION_VECTOR_CTOR_DEFAULT_INIT(z, n, _)                                \
13     m##n()
14
15 #define FUSION_VECTOR_CTOR_INIT(z, n, _)                                        \
16     m##n(_##n)
17
18 #define FUSION_VECTOR_MEMBER_CTOR_INIT(z, n, _)                                 \
19     m##n(other.m##n)
20
21 #define FUSION_VECTOR_CTOR_FORWARD(z, n, _)                                     \
22    m##n(BOOST_FUSION_FWD_ELEM(T##n, other.m##n))
23
24 #define FUSION_VECTOR_CTOR_ARG_FWD(z, n, _)                                     \
25    m##n(BOOST_FUSION_FWD_ELEM(U##n, _##n))
26
27 #define FUSION_VECTOR_MEMBER_DECL(z, n, _)                                      \
28     T##n m##n;
29
30 #define FUSION_VECTOR_MEMBER_FORWARD(z, n, _)                                   \
31    BOOST_FUSION_FWD_ELEM(U##n, _##n)
32
33 #define FUSION_VECTOR_MEMBER_ASSIGN(z, n, _)                                    \
34     this->BOOST_PP_CAT(m, n) = vec.BOOST_PP_CAT(m, n);
35
36 #define FUSION_VECTOR_MEMBER_DEREF_ASSIGN(z, n, _)                              \
37     this->BOOST_PP_CAT(m, n) = *BOOST_PP_CAT(i, n);
38
39 #define FUSION_VECTOR_MEMBER_MOVE(z, n, _)                                      \
40     this->BOOST_PP_CAT(m, n) = std::forward<                                    \
41         BOOST_PP_CAT(T, n)>(vec.BOOST_PP_CAT(m, n));
42
43 #define FUSION_VECTOR_MEMBER_AT_IMPL(z, n, _)                                   \
44     BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED                              \
45         typename add_reference<T##n>::type                                      \
46         at_impl(mpl::int_<n>) { return this->m##n; }                            \
47     BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED                                    \
48         typename add_reference<typename add_const<T##n>::type>::type            \
49         at_impl(mpl::int_<n>) const { return this->m##n; }
50
51 #define FUSION_VECTOR_MEMBER_ITER_DECL_VAR(z, n, _)                             \
52     typedef typename result_of::next<                                           \
53         BOOST_PP_CAT(I, BOOST_PP_DEC(n))>::type BOOST_PP_CAT(I, n);             \
54     BOOST_PP_CAT(I, n) BOOST_PP_CAT(i, n)                                       \
55         = fusion::next(BOOST_PP_CAT(i, BOOST_PP_DEC(n)));
56
57 #endif
58
59 #define N BOOST_PP_ITERATION()
60
61     template <BOOST_PP_ENUM_PARAMS(N, typename T)>
62     struct BOOST_PP_CAT(vector_data, N)
63     {
64         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
65         BOOST_PP_CAT(vector_data, N)()
66             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_DEFAULT_INIT, _) {}
67
68 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
69 FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
70 #endif
71 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
72     (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
73         template <BOOST_PP_ENUM_PARAMS(N, typename U)>
74 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
75 FUSION_HASH if !defined(BOOST_CLANG)
76         BOOST_CXX14_CONSTEXPR
77 FUSION_HASH endif
78 #else
79 #if !defined(BOOST_CLANG)
80         BOOST_CXX14_CONSTEXPR
81 #endif
82 #endif
83         BOOST_FUSION_GPU_ENABLED
84         BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_BINARY_PARAMS(N, U, && arg)
85           , typename boost::enable_if<is_convertible<U0, T0> >::type* /*dummy*/ = 0
86         )
87             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_ARG_FWD, arg) {}
88
89         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
90         BOOST_PP_CAT(vector_data, N)(
91             BOOST_PP_CAT(vector_data, N)&& other)
92             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_FORWARD, arg) {}
93 #endif
94 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
95 FUSION_HASH endif
96 #endif
97
98 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
99 FUSION_HASH if !defined(BOOST_CLANG)
100     BOOST_CONSTEXPR
101 FUSION_HASH endif
102 #else
103 #if !defined(BOOST_CLANG)
104     BOOST_CONSTEXPR
105 #endif
106 #endif
107         BOOST_FUSION_GPU_ENABLED
108         BOOST_PP_CAT(vector_data, N)(
109             BOOST_PP_ENUM_BINARY_PARAMS(
110                 N, typename detail::call_param<T, >::type arg))
111             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_INIT, arg) {}
112
113         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
114         BOOST_PP_CAT(vector_data, N)(
115             BOOST_PP_CAT(vector_data, N) const& other)
116             : BOOST_PP_ENUM(N, FUSION_VECTOR_MEMBER_CTOR_INIT, _) {}
117
118         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
119         BOOST_PP_CAT(vector_data, N)&
120         operator=(BOOST_PP_CAT(vector_data, N) const& vec)
121         {
122             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_ASSIGN, _)
123             return *this;
124         }
125
126         template <typename Sequence>
127 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
128 FUSION_HASH if !defined(BOOST_CLANG)
129     BOOST_CXX14_CONSTEXPR
130 FUSION_HASH endif
131 #else
132 #if !defined(BOOST_CLANG)
133     BOOST_CXX14_CONSTEXPR
134 #endif
135 #endif
136         BOOST_FUSION_GPU_ENABLED
137         static BOOST_PP_CAT(vector_data, N)
138         init_from_sequence(Sequence const& seq)
139         {
140             typedef typename result_of::begin<Sequence const>::type I0;
141             I0 i0 = fusion::begin(seq);
142             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _)
143             return BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_PARAMS(N, *i));
144         }
145
146         template <typename Sequence>
147 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
148 FUSION_HASH if !defined(BOOST_CLANG)
149     BOOST_CXX14_CONSTEXPR
150 FUSION_HASH endif
151 #else
152 #if !defined(BOOST_CLANG)
153     BOOST_CXX14_CONSTEXPR
154 #endif
155 #endif
156         BOOST_FUSION_GPU_ENABLED
157         static BOOST_PP_CAT(vector_data, N)
158         init_from_sequence(Sequence& seq)
159         {
160             typedef typename result_of::begin<Sequence>::type I0;
161             I0 i0 = fusion::begin(seq);
162             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _)
163             return BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_PARAMS(N, *i));
164         }
165
166         BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_DECL, _)
167     };
168
169     template <BOOST_PP_ENUM_PARAMS(N, typename T)>
170     struct BOOST_PP_CAT(vector, N)
171       : BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)>
172       , sequence_base<BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> >
173     {
174         typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> this_type;
175         typedef BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)> base_type;
176         typedef mpl::BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> types;
177         typedef vector_tag fusion_tag;
178         typedef fusion_sequence_tag tag; // this gets picked up by MPL
179         typedef mpl::false_ is_view;
180         typedef random_access_traversal_tag category;
181         typedef mpl::int_<N> size;
182
183         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
184         BOOST_PP_CAT(vector, N)() {}
185
186 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
187 FUSION_HASH if !defined(BOOST_CLANG)
188     BOOST_CONSTEXPR
189 FUSION_HASH endif
190 #else
191 #if !defined(BOOST_CLANG)
192     BOOST_CONSTEXPR
193 #endif
194 #endif
195         BOOST_FUSION_GPU_ENABLED
196 #if (N == 1)
197         explicit
198 #endif
199         BOOST_PP_CAT(vector, N)(
200             BOOST_PP_ENUM_BINARY_PARAMS(
201                 N, typename detail::call_param<T, >::type arg))
202             : base_type(BOOST_PP_ENUM_PARAMS(N, arg)) {}
203
204 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
205 FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
206 #endif
207 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
208     (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
209         template <BOOST_PP_ENUM_PARAMS(N, typename U)>
210 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
211 FUSION_HASH if !defined(BOOST_CLANG)
212         BOOST_CXX14_CONSTEXPR
213 FUSION_HASH endif
214 #else
215 #if !defined(BOOST_CLANG)
216         BOOST_CXX14_CONSTEXPR
217 #endif
218 #endif
219         BOOST_FUSION_GPU_ENABLED
220 #if (N == 1)
221         explicit
222         BOOST_PP_CAT(vector, N)(U0&& _0
223           , typename boost::enable_if<is_convertible<U0, T0> >::type* /*dummy*/ = 0
224           )
225          : base_type(BOOST_FUSION_FWD_ELEM(U0, _0)) {}
226 #else
227         BOOST_PP_CAT(vector, N)(BOOST_PP_ENUM_BINARY_PARAMS(N, U, && arg))
228             : base_type(BOOST_PP_ENUM(N, FUSION_VECTOR_MEMBER_FORWARD, arg)) {}
229 #endif
230
231         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
232         BOOST_PP_CAT(vector, N)(BOOST_PP_CAT(vector, N)&& rhs)
233             : base_type(std::forward<base_type>(rhs)) {}
234
235         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
236         BOOST_PP_CAT(vector, N)(BOOST_PP_CAT(vector, N) const& rhs)
237             : base_type(static_cast<base_type const&>(rhs)) {}
238
239         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
240         BOOST_PP_CAT(vector, N)&
241         operator=(BOOST_PP_CAT(vector, N) const& vec)
242         {
243             base_type::operator=(vec);
244             return *this;
245         }
246
247         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
248         BOOST_PP_CAT(vector, N)&
249         operator=(BOOST_PP_CAT(vector, N)&& vec)
250         {
251             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_MOVE, _)
252             return *this;
253         }
254 #endif
255 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
256 FUSION_HASH endif
257 #endif
258
259         template <BOOST_PP_ENUM_PARAMS(N, typename U)>
260 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
261 FUSION_HASH if !defined(BOOST_CLANG)
262     BOOST_CXX14_CONSTEXPR
263 FUSION_HASH endif
264 #else
265 #if !defined(BOOST_CLANG)
266     BOOST_CXX14_CONSTEXPR
267 #endif
268 #endif
269         BOOST_FUSION_GPU_ENABLED
270         BOOST_PP_CAT(vector, N)(
271             BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, U)> const& vec)
272             : base_type(BOOST_PP_ENUM_PARAMS(N, vec.m)) {}
273
274         template <typename Sequence>
275 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
276 FUSION_HASH if !defined(BOOST_CLANG)
277         BOOST_CXX14_CONSTEXPR
278 FUSION_HASH endif
279 #else
280 #if !defined(BOOST_CLANG)
281         BOOST_CXX14_CONSTEXPR
282 #endif
283 #endif
284         BOOST_FUSION_GPU_ENABLED
285         BOOST_PP_CAT(vector, N)(
286             Sequence const& seq
287           , typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0
288 #if (N == 1)
289           , typename boost::disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
290 #endif
291             )
292             : base_type(base_type::init_from_sequence(seq)) {}
293
294         template <typename Sequence>
295 #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
296 FUSION_HASH if !defined(BOOST_CLANG)
297         BOOST_CXX14_CONSTEXPR
298 FUSION_HASH endif
299 #else
300 #if !defined(BOOST_CLANG)
301         BOOST_CXX14_CONSTEXPR
302 #endif
303 #endif
304         BOOST_FUSION_GPU_ENABLED
305         BOOST_PP_CAT(vector, N)(
306             Sequence& seq
307           , typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0
308 #if (N == 1)
309           , typename boost::disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
310 #endif
311             )
312             : base_type(base_type::init_from_sequence(seq)) {}
313
314         template <BOOST_PP_ENUM_PARAMS(N, typename U)>
315         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
316         BOOST_PP_CAT(vector, N)&
317         operator=(BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, U)> const& vec)
318         {
319             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_ASSIGN, _)
320             return *this;
321         }
322
323         template <typename Sequence>
324         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
325         typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
326         operator=(Sequence const& seq)
327         {
328             typedef typename result_of::begin<Sequence const>::type I0;
329             I0 i0 = fusion::begin(seq);
330             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _)
331             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_DEREF_ASSIGN, _)
332             return *this;
333         }
334
335         BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_AT_IMPL, _)
336
337         template<typename I>
338         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
339         typename add_reference<typename mpl::at<types, I>::type>::type
340         at_impl(I)
341         {
342             return this->at_impl(mpl::int_<I::value>());
343         }
344
345         template<typename I>
346         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
347         typename add_reference<typename add_const<typename mpl::at<types, I>::type>::type>::type
348         at_impl(I) const
349         {
350             return this->at_impl(mpl::int_<I::value>());
351         }
352     };
353
354 #undef N