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
 | 
