Chris@16: /*============================================================================= Chris@16: Copyright (c) 2010-2011 Christopher Schmidt Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: Chris@16: #ifndef BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP Chris@16: #define BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@101: #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0(X, Y) \ Chris@101: ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_1 Chris@101: #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1(X, Y) \ Chris@101: ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_0 Chris@101: #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0_END Chris@101: #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1_END Chris@101: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)( \ Chris@16: other_self.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I_, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_EXPR_IF( \ Chris@16: I_, \ Chris@16: typedef typename \ Chris@16: boost::fusion::result_of::next< \ Chris@16: BOOST_PP_CAT(I,BOOST_PP_DEC(I_)) \ Chris@16: >::type \ Chris@16: BOOST_PP_CAT(I,I_); \ Chris@16: BOOST_PP_CAT(I,I_) BOOST_PP_CAT(i,I_)= \ Chris@16: boost::fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(I_))); \ Chris@16: ) \ Chris@16: \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)= \ Chris@16: boost::fusion::deref(BOOST_PP_CAT(i,I_)); Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP( \ Chris@16: ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: template \ Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: self_type& \ Chris@16: operator=(Seq const& seq) \ Chris@16: { \ Chris@16: typedef typename \ Chris@16: boost::fusion::result_of::begin::type \ Chris@16: I0; \ Chris@16: I0 i0=boost::fusion::begin(seq); \ Chris@16: \ Chris@16: BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: \ Chris@16: return *this; \ Chris@16: } Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_ATTR_I(R, ATTRIBUTE_TUPEL_SIZE, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,0,ATTRIBUTE) \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE); Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)( \ Chris@16: boost::fusion::deref(boost::fusion::advance_c(boost::fusion::begin( \ Chris@16: seq)))) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER( \ Chris@16: ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: , typename boost::disable_if< \ Chris@16: boost::is_convertible< \ Chris@16: Seq const& \ Chris@16: , BOOST_PP_TUPLE_ELEM( \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: 0, \ Chris@16: BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \ Chris@16: > \ Chris@16: >::type* =0 Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)() Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_PP_SEQ_FOR_EACH_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_ATTR_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME() \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: {} \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME(self_type const& other_self) \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: {} \ Chris@16: \ Chris@16: template \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME(Seq const& seq \ Chris@16: BOOST_PP_IF( \ Chris@16: BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \ Chris@16: BOOST_PP_TUPLE_EAT(2), \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER)( \ Chris@16: ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: ) \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: {} \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP(ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_CTOR_1( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: explicit \ Chris@16: NAME(boost::call_traits< \ Chris@16: BOOST_PP_TUPLE_ELEM( \ Chris@16: ATTRIBUTE_TUPEL_SIZE,0,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \ Chris@16: >::param_type arg) \ Chris@16: : BOOST_PP_TUPLE_ELEM( \ Chris@16: ATTRIBUTE_TUPEL_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \ Chris@16: {} Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: explicit \ Chris@16: NAME(typename boost::call_traits< \ Chris@16: typename boost::fusion::detail::get_first_arg< \ Chris@16: BOOST_PP_TUPLE_ELEM( \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: 0, \ Chris@16: BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \ Chris@16: , BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \ Chris@16: >::type \ Chris@16: >::param_type arg) \ Chris@16: : BOOST_PP_TUPLE_ELEM( \ Chris@16: ATTRIBUTE_TUPEL_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \ Chris@16: {} Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)(BOOST_PP_CAT(_,I)) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I(R, DATA, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: typename boost::call_traits< \ Chris@16: typename boost::fusion::detail::get_first_arg< \ Chris@16: BOOST_PP_TUPLE_ELEM( \ Chris@16: BOOST_PP_TUPLE_ELEM(3,0,DATA), \ Chris@16: 0, \ Chris@16: ATTRIBUTE) \ Chris@16: , BOOST_PP_TUPLE_ELEM(3,2,DATA) \ Chris@16: >::type \ Chris@16: >::param_type BOOST_PP_CAT(_,I) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I, \ Chris@16: ( \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ), \ Chris@16: BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \ Chris@16: ), \ Chris@16: ATTRIBUTES_SEQ)) \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: {} Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I( \ Chris@16: R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \ Chris@16: \ Chris@16: BOOST_PP_COMMA_IF(I) \ Chris@16: boost::call_traits< \ Chris@16: BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,0,ATTRIBUTE) \ Chris@16: >::param_type BOOST_PP_CAT(_,I) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_CTOR_N( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ)) \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I_R( \ Chris@16: 1, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \ Chris@16: ATTRIBUTE_TUPEL_SIZE, \ Chris@16: ATTRIBUTES_SEQ) \ Chris@16: {} Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_CTOR( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR_N, \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR_1)( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \ Chris@16: BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N, \ Chris@16: BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1)( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \ Chris@16: NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_CTOR( \ Chris@16: NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: template \ Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: NAME(Seq const&) \ Chris@16: {} \ Chris@16: \ Chris@16: template \ Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \ Chris@16: self_type& \ Chris@16: operator=(Seq const& seq) \ Chris@16: { \ Chris@16: return *this; \ Chris@16: } Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_STRUCT_IMPL( \ Chris@16: NAMESPACE_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \ Chris@16: \ Chris@16: struct NAME \ Chris@16: { \ Chris@16: typedef NAME self_type; \ Chris@16: \ Chris@16: BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \ Chris@16: BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL, \ Chris@16: BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL)( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: }; \ Chris@16: \ Chris@16: BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \ Chris@16: NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \ Chris@16: TEMPLATE_PARAMS_SEQ, \ Chris@16: NAME, \ Chris@16: BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), \ Chris@16: ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL( \ Chris@16: NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) Chris@16: Chris@16: #define BOOST_FUSION_DEFINE_TPL_STRUCT_IMPL( \ Chris@16: TEMPLATE_PARAMS_SEQ, \ Chris@16: NAMESPACE_SEQ, \ Chris@16: NAME, \ Chris@16: ATTRIBUTES_SEQ, \ Chris@16: ATTRIBUTE_TUPEL_SIZE) \ Chris@16: \ Chris@16: BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \ Chris@16: \ Chris@16: template< \ Chris@16: BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL( \ Chris@16: (0)TEMPLATE_PARAMS_SEQ) \ Chris@16: > \ Chris@16: struct NAME \ Chris@16: { \ Chris@16: typedef NAME self_type; \ Chris@16: \ Chris@16: BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \ Chris@16: BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL, \ Chris@16: BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL)( \ Chris@16: TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)\ Chris@16: }; \ Chris@16: \ Chris@16: BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ) Chris@16: Chris@16: namespace boost { namespace fusion { namespace detail Chris@16: { Chris@16: template Chris@16: struct get_first_arg Chris@16: { Chris@16: typedef A1 type; Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #endif