355 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			355 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 2001-2011 Joel de Guzman | ||
|  | 
 | ||
|  |     Distributed under the Boost Software License, Version 1.0. (See accompanying | ||
|  |     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||
|  | ==============================================================================*/ | ||
|  | // No include guard. This file is meant to be included many times | ||
|  | 
 | ||
|  | #if !defined(FUSION_MACRO_05042005) | ||
|  | #define FUSION_MACRO_05042005 | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_CTOR_DEFAULT_INIT(z, n, _)                                \ | ||
|  |     m##n() | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_CTOR_INIT(z, n, _)                                        \ | ||
|  |     m##n(_##n) | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_CTOR_INIT(z, n, _)                                 \ | ||
|  |     m##n(other.m##n) | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_CTOR_FORWARD(z, n, _)                                     \ | ||
|  |    m##n(BOOST_FUSION_FWD_ELEM(T##n, other.m##n)) | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_CTOR_ARG_FWD(z, n, _)                                     \ | ||
|  |    m##n(BOOST_FUSION_FWD_ELEM(U##n, _##n)) | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_DECL(z, n, _)                                      \ | ||
|  |     T##n m##n; | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_FORWARD(z, n, _)                                   \ | ||
|  |    BOOST_FUSION_FWD_ELEM(U##n, _##n) | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_ASSIGN(z, n, _)                                    \ | ||
|  |     this->BOOST_PP_CAT(m, n) = vec.BOOST_PP_CAT(m, n); | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_DEREF_ASSIGN(z, n, _)                              \ | ||
|  |     this->BOOST_PP_CAT(m, n) = *BOOST_PP_CAT(i, n); | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_MOVE(z, n, _)                                      \ | ||
|  |     this->BOOST_PP_CAT(m, n) = std::forward<                                    \ | ||
|  |         BOOST_PP_CAT(T, n)>(vec.BOOST_PP_CAT(m, n)); | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_AT_IMPL(z, n, _)                                   \ | ||
|  |     BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED                              \ | ||
|  |         typename add_reference<T##n>::type                                      \ | ||
|  |         at_impl(mpl::int_<n>) { return this->m##n; }                            \ | ||
|  |     BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED                                    \ | ||
|  |         typename add_reference<typename add_const<T##n>::type>::type            \ | ||
|  |         at_impl(mpl::int_<n>) const { return this->m##n; } | ||
|  | 
 | ||
|  | #define FUSION_VECTOR_MEMBER_ITER_DECL_VAR(z, n, _)                             \ | ||
|  |     typedef typename result_of::next<                                           \ | ||
|  |         BOOST_PP_CAT(I, BOOST_PP_DEC(n))>::type BOOST_PP_CAT(I, n);             \ | ||
|  |     BOOST_PP_CAT(I, n) BOOST_PP_CAT(i, n)                                       \ | ||
|  |         = fusion::next(BOOST_PP_CAT(i, BOOST_PP_DEC(n))); | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | #define N BOOST_PP_ITERATION() | ||
|  | 
 | ||
|  |     template <BOOST_PP_ENUM_PARAMS(N, typename T)> | ||
|  |     struct BOOST_PP_CAT(vector_data, N) | ||
|  |     { | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)() | ||
|  |             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_DEFAULT_INIT, _) {} | ||
|  | 
 | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  | #endif | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ | ||
|  |     (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) | ||
|  |         template <BOOST_PP_ENUM_PARAMS(N, typename U)> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_BINARY_PARAMS(N, U, && arg) | ||
|  |           , typename boost::enable_if<is_convertible<U0, T0> >::type* /*dummy*/ = 0 | ||
|  |         ) | ||
|  |             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_ARG_FWD, arg) {} | ||
|  | 
 | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)( | ||
|  |             BOOST_PP_CAT(vector_data, N)&& other) | ||
|  |             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_FORWARD, arg) {} | ||
|  | #endif | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |     BOOST_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |     BOOST_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)( | ||
|  |             BOOST_PP_ENUM_BINARY_PARAMS( | ||
|  |                 N, typename detail::call_param<T, >::type arg)) | ||
|  |             : BOOST_PP_ENUM(N, FUSION_VECTOR_CTOR_INIT, arg) {} | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)( | ||
|  |             BOOST_PP_CAT(vector_data, N) const& other) | ||
|  |             : BOOST_PP_ENUM(N, FUSION_VECTOR_MEMBER_CTOR_INIT, _) {} | ||
|  | 
 | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector_data, N)& | ||
|  |         operator=(BOOST_PP_CAT(vector_data, N) const& vec) | ||
|  |         { | ||
|  |             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_ASSIGN, _) | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         static BOOST_PP_CAT(vector_data, N) | ||
|  |         init_from_sequence(Sequence const& seq) | ||
|  |         { | ||
|  |             typedef typename result_of::begin<Sequence const>::type I0; | ||
|  |             I0 i0 = fusion::begin(seq); | ||
|  |             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _) | ||
|  |             return BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_PARAMS(N, *i)); | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         static BOOST_PP_CAT(vector_data, N) | ||
|  |         init_from_sequence(Sequence& seq) | ||
|  |         { | ||
|  |             typedef typename result_of::begin<Sequence>::type I0; | ||
|  |             I0 i0 = fusion::begin(seq); | ||
|  |             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _) | ||
|  |             return BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_PARAMS(N, *i)); | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_DECL, _) | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <BOOST_PP_ENUM_PARAMS(N, typename T)> | ||
|  |     struct BOOST_PP_CAT(vector, N) | ||
|  |       : BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)> | ||
|  |       , sequence_base<BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> > | ||
|  |     { | ||
|  |         typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> this_type; | ||
|  |         typedef BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)> base_type; | ||
|  |         typedef mpl::BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> types; | ||
|  |         typedef vector_tag fusion_tag; | ||
|  |         typedef fusion_sequence_tag tag; // this gets picked up by MPL | ||
|  |         typedef mpl::false_ is_view; | ||
|  |         typedef random_access_traversal_tag category; | ||
|  |         typedef mpl::int_<N> size; | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)() {} | ||
|  | 
 | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |     BOOST_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |     BOOST_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  | #if (N == 1) | ||
|  |         explicit | ||
|  | #endif | ||
|  |         BOOST_PP_CAT(vector, N)( | ||
|  |             BOOST_PP_ENUM_BINARY_PARAMS( | ||
|  |                 N, typename detail::call_param<T, >::type arg)) | ||
|  |             : base_type(BOOST_PP_ENUM_PARAMS(N, arg)) {} | ||
|  | 
 | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  | #endif | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ | ||
|  |     (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) | ||
|  |         template <BOOST_PP_ENUM_PARAMS(N, typename U)> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  | #if (N == 1) | ||
|  |         explicit | ||
|  |         BOOST_PP_CAT(vector, N)(U0&& _0 | ||
|  |           , typename boost::enable_if<is_convertible<U0, T0> >::type* /*dummy*/ = 0 | ||
|  |           ) | ||
|  |          : base_type(BOOST_FUSION_FWD_ELEM(U0, _0)) {} | ||
|  | #else | ||
|  |         BOOST_PP_CAT(vector, N)(BOOST_PP_ENUM_BINARY_PARAMS(N, U, && arg)) | ||
|  |             : base_type(BOOST_PP_ENUM(N, FUSION_VECTOR_MEMBER_FORWARD, arg)) {} | ||
|  | #endif | ||
|  | 
 | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)(BOOST_PP_CAT(vector, N)&& rhs) | ||
|  |             : base_type(std::forward<base_type>(rhs)) {} | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)(BOOST_PP_CAT(vector, N) const& rhs) | ||
|  |             : base_type(static_cast<base_type const&>(rhs)) {} | ||
|  | 
 | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)& | ||
|  |         operator=(BOOST_PP_CAT(vector, N) const& vec) | ||
|  |         { | ||
|  |             base_type::operator=(vec); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)& | ||
|  |         operator=(BOOST_PP_CAT(vector, N)&& vec) | ||
|  |         { | ||
|  |             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_MOVE, _) | ||
|  |             return *this; | ||
|  |         } | ||
|  | #endif | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH endif | ||
|  | #endif | ||
|  | 
 | ||
|  |         template <BOOST_PP_ENUM_PARAMS(N, typename U)> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |     BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)( | ||
|  |             BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, U)> const& vec) | ||
|  |             : base_type(BOOST_PP_ENUM_PARAMS(N, vec.m)) {} | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)( | ||
|  |             Sequence const& seq | ||
|  |           , typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0 | ||
|  | #if (N == 1) | ||
|  |           , typename boost::disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0 | ||
|  | #endif | ||
|  |             ) | ||
|  |             : base_type(base_type::init_from_sequence(seq)) {} | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  | #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) | ||
|  | FUSION_HASH if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | FUSION_HASH endif | ||
|  | #else | ||
|  | #if !defined(BOOST_CLANG) | ||
|  |         BOOST_CXX14_CONSTEXPR | ||
|  | #endif | ||
|  | #endif | ||
|  |         BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)( | ||
|  |             Sequence& seq | ||
|  |           , typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0 | ||
|  | #if (N == 1) | ||
|  |           , typename boost::disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0 | ||
|  | #endif | ||
|  |             ) | ||
|  |             : base_type(base_type::init_from_sequence(seq)) {} | ||
|  | 
 | ||
|  |         template <BOOST_PP_ENUM_PARAMS(N, typename U)> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         BOOST_PP_CAT(vector, N)& | ||
|  |         operator=(BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, U)> const& vec) | ||
|  |         { | ||
|  |             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_ASSIGN, _) | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type | ||
|  |         operator=(Sequence const& seq) | ||
|  |         { | ||
|  |             typedef typename result_of::begin<Sequence const>::type I0; | ||
|  |             I0 i0 = fusion::begin(seq); | ||
|  |             BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_VECTOR_MEMBER_ITER_DECL_VAR, _) | ||
|  |             BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_DEREF_ASSIGN, _) | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_PP_REPEAT(N, FUSION_VECTOR_MEMBER_AT_IMPL, _) | ||
|  | 
 | ||
|  |         template<typename I> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         typename add_reference<typename mpl::at<types, I>::type>::type | ||
|  |         at_impl(I) | ||
|  |         { | ||
|  |             return this->at_impl(mpl::int_<I::value>()); | ||
|  |         } | ||
|  | 
 | ||
|  |         template<typename I> | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         typename add_reference<typename add_const<typename mpl::at<types, I>::type>::type>::type | ||
|  |         at_impl(I) const | ||
|  |         { | ||
|  |             return this->at_impl(mpl::int_<I::value>()); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  | #undef N |