123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- /*=============================================================================
- Copyright (c) 2010-2011 Christopher Schmidt
- 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)
- ==============================================================================*/
- #ifndef BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP
- #define BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP
- #include <boost/fusion/support/config.hpp>
- #include <boost/config.hpp>
- #include <boost/detail/workaround.hpp>
- #include <boost/fusion/sequence/intrinsic/begin.hpp>
- #include <boost/fusion/iterator/deref.hpp>
- #include <boost/fusion/iterator/next.hpp>
- #include <boost/fusion/iterator/advance.hpp>
- #include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
- #include <boost/fusion/adapted/struct/detail/namespace.hpp>
- #include <boost/preprocessor/if.hpp>
- #include <boost/preprocessor/expr_if.hpp>
- #include <boost/preprocessor/dec.hpp>
- #include <boost/preprocessor/logical/not.hpp>
- #include <boost/preprocessor/punctuation/comma_if.hpp>
- #include <boost/preprocessor/seq/seq.hpp>
- #include <boost/preprocessor/seq/for_each.hpp>
- #include <boost/preprocessor/seq/for_each_i.hpp>
- #include <boost/preprocessor/seq/enum.hpp>
- #include <boost/preprocessor/seq/size.hpp>
- #include <boost/preprocessor/tuple/elem.hpp>
- #include <boost/preprocessor/tuple/eat.hpp>
- #include <boost/call_traits.hpp>
- #include <boost/type_traits/is_convertible.hpp>
- #include <boost/utility/enable_if.hpp>
- #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0(X, Y) \
- ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_1
- #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1(X, Y) \
- ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_0
- #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0_END
- #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1_END
- #ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)( \
- other_self.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE))
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- NAME(self_type const& other_self) \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {}
- // Use templated version instead.
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_ASSIGN_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I_, ATTRIBUTE) \
- \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)= \
- other.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE);
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- self_type& operator=(self_type const& other) \
- { \
- BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_COPY_ASSIGN_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- \
- return *this; \
- }
- #else // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED NAME(self_type const&) = default;
- #define BOOST_FUSION_DEFINE_STRUCT_COPY_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED self_type& operator=(self_type const&) = default;
- #endif // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I_, ATTRIBUTE) \
- \
- BOOST_PP_EXPR_IF( \
- I_, \
- typedef typename \
- boost::fusion::result_of::next< \
- BOOST_PP_CAT(I,BOOST_PP_DEC(I_)) \
- >::type \
- BOOST_PP_CAT(I,I_); \
- BOOST_PP_CAT(I,I_) BOOST_PP_CAT(i,I_)= \
- boost::fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(I_))); \
- ) \
- \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)= \
- boost::fusion::deref(BOOST_PP_CAT(i,I_));
- #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- template<typename Seq> \
- BOOST_FUSION_GPU_ENABLED \
- self_type& \
- operator=(Seq const& seq) \
- { \
- typedef typename \
- boost::fusion::result_of::begin<Seq const>::type \
- I0; \
- I0 i0=boost::fusion::begin(seq); \
- \
- BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- \
- return *this; \
- }
- #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR(NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_OP(ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #else // BOOST_NO_CXX11_RVALUE_REFERENCES
- #if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) \
- || BOOST_WORKAROUND(BOOST_GCC, < 40500) \
- || BOOST_WORKAROUND(BOOST_MSVC, == 1800)
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)(std::move( \
- other_self.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)))
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- NAME(self_type&& other_self) \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {}
- #else // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED NAME(self_type&&) = default;
- #endif // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) \
- || BOOST_WORKAROUND(BOOST_GCC, < 40600) \
- || BOOST_WORKAROUND(BOOST_MSVC, == 1800)
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I_, ATTRIBUTE) \
- \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)=std::move( \
- other.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE));
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- self_type& operator=(self_type&& other) \
- { \
- BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- \
- return *this; \
- }
- #else // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #define BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED self_type& operator=(self_type&&) = default;
- #endif // BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- #endif // BOOST_NO_CXX11_RVALUE_REFERENCES
- #define BOOST_FUSION_DEFINE_STRUCT_ATTR_I(R, ATTRIBUTE_TUPLE_SIZE, ATTRIBUTE) \
- \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,0,ATTRIBUTE) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE);
- #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)( \
- boost::fusion::deref(boost::fusion::advance_c<I>(boost::fusion::begin( \
- seq))))
- #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- , typename boost::disable_if< \
- boost::is_convertible< \
- Seq const& \
- , BOOST_PP_TUPLE_ELEM( \
- ATTRIBUTE_TUPLE_SIZE, \
- 0, \
- BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
- > \
- >::type* =0
- #define BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)()
- #define BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_PP_SEQ_FOR_EACH_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_ATTR_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- \
- BOOST_FUSION_GPU_ENABLED \
- NAME() \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {} \
- \
- BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- BOOST_FUSION_DEFINE_STRUCT_MOVE_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- template<typename Seq> \
- BOOST_FUSION_GPU_ENABLED \
- NAME(Seq const& seq \
- BOOST_PP_IF( \
- BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
- BOOST_PP_TUPLE_EAT(2), \
- BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER)( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- ) \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {} \
- \
- BOOST_FUSION_DEFINE_STRUCT_COPY_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- BOOST_FUSION_DEFINE_STRUCT_MOVE_ASSIGN_OP( \
- ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP(ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_STRUCT_CTOR_1( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- explicit \
- NAME(boost::call_traits< \
- BOOST_PP_TUPLE_ELEM( \
- ATTRIBUTE_TUPLE_SIZE,0,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
- >::param_type arg) \
- : BOOST_PP_TUPLE_ELEM( \
- ATTRIBUTE_TUPLE_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \
- {}
- #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- explicit \
- NAME(typename boost::call_traits< \
- typename boost::fusion::detail::get_first_arg< \
- BOOST_PP_TUPLE_ELEM( \
- ATTRIBUTE_TUPLE_SIZE, \
- 0, \
- BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
- , BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \
- >::type \
- >::param_type arg) \
- : BOOST_PP_TUPLE_ELEM( \
- ATTRIBUTE_TUPLE_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \
- {}
- #define BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,1,ATTRIBUTE)(BOOST_PP_CAT(_,I))
- #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I(R, DATA, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- typename boost::call_traits< \
- typename boost::fusion::detail::get_first_arg< \
- BOOST_PP_TUPLE_ELEM( \
- BOOST_PP_TUPLE_ELEM(3,0,DATA), \
- 0, \
- ATTRIBUTE) \
- , BOOST_PP_TUPLE_ELEM(3,2,DATA) \
- >::type \
- >::param_type BOOST_PP_CAT(_,I)
- #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I, \
- ( \
- ATTRIBUTE_TUPLE_SIZE, \
- BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ), \
- BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \
- ), \
- ATTRIBUTES_SEQ)) \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {}
- #define BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I( \
- R, ATTRIBUTE_TUPLE_SIZE, I, ATTRIBUTE) \
- \
- BOOST_PP_COMMA_IF(I) \
- boost::call_traits< \
- BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE,0,ATTRIBUTE) \
- >::param_type BOOST_PP_CAT(_,I)
- #define BOOST_FUSION_DEFINE_STRUCT_CTOR_N( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_GPU_ENABLED \
- NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ)) \
- : BOOST_PP_SEQ_FOR_EACH_I_R( \
- 1, \
- BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \
- ATTRIBUTE_TUPLE_SIZE, \
- ATTRIBUTES_SEQ) \
- {}
- #define BOOST_FUSION_DEFINE_STRUCT_CTOR( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
- BOOST_FUSION_DEFINE_STRUCT_CTOR_N, \
- BOOST_FUSION_DEFINE_STRUCT_CTOR_1)( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
- BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N, \
- BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1)( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
- NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_DEFINE_STRUCT_CTOR( \
- NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_STRUCT_IMPL( \
- NAMESPACE_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \
- \
- struct NAME \
- { \
- typedef NAME self_type; \
- \
- BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
- BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL, \
- BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL)( \
- NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- }; \
- \
- BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ)
- #define BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
- NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \
- TEMPLATE_PARAMS_SEQ, \
- NAME, \
- BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), \
- ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)
- #define BOOST_FUSION_DEFINE_TPL_STRUCT_IMPL( \
- TEMPLATE_PARAMS_SEQ, \
- NAMESPACE_SEQ, \
- NAME, \
- ATTRIBUTES_SEQ, \
- ATTRIBUTE_TUPLE_SIZE) \
- \
- BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \
- \
- template< \
- BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL( \
- (0)TEMPLATE_PARAMS_SEQ) \
- > \
- struct NAME \
- { \
- typedef NAME self_type; \
- \
- BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
- BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL, \
- BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL)( \
- TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPLE_SIZE)\
- }; \
- \
- BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ)
- namespace boost { namespace fusion { namespace detail
- {
- template<typename A1, typename A2>
- struct get_first_arg
- {
- typedef A1 type;
- };
- }}}
- #endif
|