summaryrefslogtreecommitdiff
path: root/boost/fusion/adapted/struct/detail/define_struct_inline.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/adapted/struct/detail/define_struct_inline.hpp')
-rw-r--r--boost/fusion/adapted/struct/detail/define_struct_inline.hpp379
1 files changed, 270 insertions, 109 deletions
diff --git a/boost/fusion/adapted/struct/detail/define_struct_inline.hpp b/boost/fusion/adapted/struct/detail/define_struct_inline.hpp
index a7961ec311..d720fcf8a5 100644
--- a/boost/fusion/adapted/struct/detail/define_struct_inline.hpp
+++ b/boost/fusion/adapted/struct/detail/define_struct_inline.hpp
@@ -8,6 +8,8 @@
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_DEFINE_STRUCT_INLINE_HPP
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_DEFINE_STRUCT_INLINE_HPP
+#include <boost/fusion/support/config.hpp>
+#include <boost/config.hpp>
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/sequence/sequence_facade.hpp>
#include <boost/fusion/iterator/iterator_facade.hpp>
@@ -20,12 +22,37 @@
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/preprocessor/comma_if.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/repeat.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/seq/enum.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
+// MSVC and GCC <= 4.4 have a bug that affects partial specializations of
+// nested templates under some circumstances. This affects the implementation
+// of BOOST_FUSION_DEFINE_STRUCT_INLINE, which uses such specializations for
+// the iterator class's 'deref' and 'value_of' metafunctions. On these compilers
+// an alternate implementation for these metafunctions is used that does not
+// require such specializations. The alternate implementation takes longer
+// to compile so its use is restricted to the offending compilers.
+// For MSVC, the bug was reported at https://connect.microsoft.com/VisualStudio/feedback/details/757891/c-compiler-error-involving-partial-specializations-of-nested-templates
+// For GCC, 4.4 and earlier are no longer maintained so there is no need
+// to report a bug.
+#if defined(BOOST_MSVC) || (defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 4)))
+ #define BOOST_FUSION_NEED_NESTED_TEMPLATE_PARTIAL_SPEC_WKND
+#endif
+
+#ifdef BOOST_FUSION_NEED_NESTED_TEMPLATE_PARTIAL_SPEC_WKND
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/fusion/sequence/intrinsic/at_c.hpp>
+#include <boost/fusion/container/vector.hpp>
+#endif
+
+
#define BOOST_FUSION_MAKE_DEFAULT_INIT_LIST_ENTRY(R, DATA, N, ATTRIBUTE) \
BOOST_PP_COMMA_IF(N) BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)()
@@ -61,15 +88,20 @@
BOOST_PP_COMMA_IF(N) \
BOOST_FUSION_MAKE_INIT_LIST_ENTRY_I(BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE))
+#define BOOST_FUSION_ITERATOR_NAME(NAME) \
+ BOOST_PP_CAT(boost_fusion_detail_, BOOST_PP_CAT(NAME, _iterator))
+
// Note: all template parameter names need to be uglified, otherwise they might
// shadow a template parameter of the struct when used with
// BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE
#define BOOST_FUSION_MAKE_ITERATOR_VALUE_OF_SPECS(Z, N, NAME) \
- template <typename boost_fusion_uglified_Sq> \
- struct value_of<NAME##_iterator<boost_fusion_uglified_Sq, N> > \
+ template <typename boost_fusion_detail_Sq> \
+ struct value_of< \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, N> \
+ > \
: boost::mpl::identity< \
- typename boost_fusion_uglified_Sq::t##N##_type \
+ typename boost_fusion_detail_Sq::t##N##_type \
> \
{ \
};
@@ -77,10 +109,11 @@
#define BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC( \
SPEC_TYPE, CALL_ARG_TYPE, TYPE_QUAL, ATTRIBUTE, N) \
\
- template <typename boost_fusion_uglified_Sq> \
+ template <typename boost_fusion_detail_Sq> \
struct deref<SPEC_TYPE, N> > \
{ \
- typedef typename boost_fusion_uglified_Sq::t##N##_type TYPE_QUAL& type; \
+ typedef typename boost_fusion_detail_Sq::t##N##_type TYPE_QUAL& type; \
+ BOOST_FUSION_GPU_ENABLED \
static type call(CALL_ARG_TYPE, N> const& iter) \
{ \
return iter.seq_.BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE); \
@@ -89,48 +122,49 @@
#define BOOST_FUSION_MAKE_ITERATOR_DEREF_SPECS(R, NAME, N, ATTRIBUTE) \
BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC( \
- BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq, \
- BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, \
, \
ATTRIBUTE, \
N) \
BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC( \
- BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq, \
- BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq, \
const, \
ATTRIBUTE, \
N) \
BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC( \
- const BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq, \
- BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq, \
+ const BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, \
, \
ATTRIBUTE, \
N) \
BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC( \
- const BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq, \
- BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq, \
+ const BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq, \
const, \
ATTRIBUTE, \
N) \
#define BOOST_FUSION_MAKE_VALUE_AT_SPECS(Z, N, DATA) \
- template <typename boost_fusion_uglified_Sq> \
- struct value_at<boost_fusion_uglified_Sq, boost::mpl::int_<N> > \
+ template <typename boost_fusion_detail_Sq> \
+ struct value_at<boost_fusion_detail_Sq, boost::mpl::int_<N> > \
{ \
- typedef typename boost_fusion_uglified_Sq::t##N##_type type; \
+ typedef typename boost_fusion_detail_Sq::t##N##_type type; \
};
#define BOOST_FUSION_MAKE_AT_SPECS(R, DATA, N, ATTRIBUTE) \
- template <typename boost_fusion_uglified_Sq> \
- struct at<boost_fusion_uglified_Sq, boost::mpl::int_<N> > \
+ template <typename boost_fusion_detail_Sq> \
+ struct at<boost_fusion_detail_Sq, boost::mpl::int_<N> > \
{ \
typedef typename boost::mpl::if_< \
- boost::is_const<boost_fusion_uglified_Sq>, \
- typename boost_fusion_uglified_Sq::t##N##_type const&, \
- typename boost_fusion_uglified_Sq::t##N##_type& \
+ boost::is_const<boost_fusion_detail_Sq>, \
+ typename boost_fusion_detail_Sq::t##N##_type const&, \
+ typename boost_fusion_detail_Sq::t##N##_type& \
>::type type; \
\
- static type call(boost_fusion_uglified_Sq& sq) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_Sq& sq) \
{ \
return sq. BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE); \
} \
@@ -142,7 +176,101 @@
#define BOOST_FUSION_MAKE_DATA_MEMBER(R, DATA, N, ATTRIBUTE) \
BOOST_PP_TUPLE_ELEM(2, 0, ATTRIBUTE) BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE);
+#ifdef BOOST_FUSION_NEED_NESTED_TEMPLATE_PARTIAL_SPEC_WKND
+
+#define BOOST_FUSION_DEFINE_ITERATOR_VALUE_OF(NAME, ATTRIBUTE_SEQ_SIZE) \
+ template <typename boost_fusion_detail_Iterator> \
+ struct value_of : boost::fusion::result_of::at_c< \
+ ref_vec_t, \
+ boost_fusion_detail_Iterator::index::value \
+ > \
+ { \
+ };
+
+#define BOOST_FUSION_DEFINE_ITERATOR_DEREF(NAME, ATTRIBUTES_SEQ) \
+ template <typename boost_fusion_detail_Iterator> \
+ struct deref \
+ { \
+ typedef typename boost::remove_const< \
+ boost_fusion_detail_Iterator \
+ >::type iterator_raw_type; \
+ \
+ static const int index = iterator_raw_type::index::value; \
+ \
+ typedef typename boost::fusion::result_of::at_c< \
+ ref_vec_t, \
+ index \
+ >::type result_raw_type; \
+ \
+ typedef typename boost::mpl::if_< \
+ boost::is_const<typename iterator_raw_type::sequence_type>, \
+ typename boost::add_const<result_raw_type>::type, \
+ result_raw_type \
+ >::type type; \
+ \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(iterator_raw_type const& iter) \
+ { \
+ return boost::fusion::at_c<index>(iter.ref_vec); \
+ } \
+ };
+
+#define BOOST_FUSION_MAKE_ITERATOR_WKND_FIELD_NAME(R, DATA, N, ATTRIBUTE) \
+ BOOST_PP_COMMA_IF(N) seq.BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
+
+#define BOOST_FUSION_DEFINE_ITERATOR_WKND_INIT_LIST_ENTRIES(ATTRIBUTES_SEQ) \
+ , ref_vec(BOOST_PP_SEQ_FOR_EACH_I( \
+ BOOST_FUSION_MAKE_ITERATOR_WKND_FIELD_NAME, \
+ ~, \
+ BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ)))
+
+#define BOOST_FUSION_MAKE_ITERATOR_WKND_REF(Z, N, DATA) \
+ BOOST_PP_COMMA_IF(N) \
+ typename boost::mpl::if_< \
+ boost::is_const<boost_fusion_detail_Seq>, \
+ typename boost::add_const< \
+ typename boost_fusion_detail_Seq::t##N##_type \
+ >::type, \
+ typename boost_fusion_detail_Seq::t##N##_type \
+ >::type&
+
+#define BOOST_FUSION_DEFINE_ITERATOR_WKND_MEMBERS(ATTRIBUTES_SEQ_SIZE) \
+ typedef boost::fusion::vector< \
+ BOOST_PP_REPEAT( \
+ ATTRIBUTES_SEQ_SIZE, \
+ BOOST_FUSION_MAKE_ITERATOR_WKND_REF, \
+ ~) \
+ > ref_vec_t; \
+ \
+ ref_vec_t ref_vec;
+
+#else
+
+#define BOOST_FUSION_DEFINE_ITERATOR_VALUE_OF(NAME, ATTRIBUTES_SEQ_SIZE) \
+ template <typename boost_fusion_detail_T> struct value_of; \
+ BOOST_PP_REPEAT( \
+ ATTRIBUTES_SEQ_SIZE, \
+ BOOST_FUSION_MAKE_ITERATOR_VALUE_OF_SPECS, \
+ NAME)
+
+#define BOOST_FUSION_DEFINE_ITERATOR_DEREF(NAME, ATTRIBUTES_SEQ) \
+ template <typename boost_fusion_detail_T> struct deref; \
+ BOOST_PP_SEQ_FOR_EACH_I( \
+ BOOST_FUSION_MAKE_ITERATOR_DEREF_SPECS, \
+ NAME, \
+ ATTRIBUTES_SEQ)
+
+#define BOOST_FUSION_DEFINE_ITERATOR_WKND_INIT_LIST_ENTRIES(ATTRIBUTES_SEQ)
+
+#define BOOST_FUSION_DEFINE_ITERATOR_WKND_MEMBERS(ATTRIBUTES_SEQ_SIZE)
+
+#endif // BOOST_FUSION_NEED_NESTED_TEMPLATE_PARTIAL_SPEC_WKND
+
+// Note: We can't nest the iterator inside the struct because we run into
+// a MSVC10 bug involving partial specializations of nested templates.
+
#define BOOST_FUSION_DEFINE_STRUCT_INLINE_IMPL(NAME, ATTRIBUTES) \
+ BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES) \
struct NAME : boost::fusion::sequence_facade< \
NAME, \
boost::fusion::random_access_traversal_tag \
@@ -154,6 +282,8 @@
#define BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE_IMPL( \
TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES) \
\
+ BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES) \
+ \
template < \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL( \
(0)TEMPLATE_PARAMS_SEQ) \
@@ -173,176 +303,207 @@
NAME, \
BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END))
+// Note: can't compute BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ) directly because
+// ATTRIBUTES_SEQ may be empty and calling BOOST_PP_SEQ_SIZE on an empty
+// sequence produces warnings on MSVC.
#define BOOST_FUSION_DEFINE_STRUCT_MEMBERS_IMPL(NAME, ATTRIBUTES_SEQ) \
BOOST_FUSION_DEFINE_STRUCT_INLINE_MEMBERS_IMPL_IMPL( \
NAME, \
ATTRIBUTES_SEQ, \
- BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ))
+ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE((0)ATTRIBUTES_SEQ)))
-#define BOOST_FUSION_DEFINE_STRUCT_INLINE_MEMBERS_IMPL_IMPL( \
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES) \
+ BOOST_FUSION_DEFINE_STRUCT_ITERATOR_IMPL( \
+ NAME, \
+ BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END))
+
+#define BOOST_FUSION_DEFINE_STRUCT_ITERATOR_IMPL(NAME, ATTRIBUTES_SEQ) \
+ BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR_IMPL_IMPL( \
+ NAME, \
+ ATTRIBUTES_SEQ, \
+ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE((0)ATTRIBUTES_SEQ)))
+
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR_IMPL_IMPL( \
NAME, ATTRIBUTES_SEQ, ATTRIBUTES_SEQ_SIZE) \
\
- NAME() \
- BOOST_PP_IF( \
- BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ), \
- BOOST_FUSION_MAKE_DEFAULT_INIT_LIST, \
- BOOST_FUSION_IGNORE_1) \
- (ATTRIBUTES_SEQ) \
- { \
- } \
- \
- BOOST_PP_IF( \
- BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ), \
- BOOST_FUSION_MAKE_COPY_CONSTRUCTOR, \
- BOOST_FUSION_IGNORE_2) \
- (NAME, ATTRIBUTES_SEQ) \
- \
- template <typename boost_fusion_uglified_Seq> \
- NAME(const boost_fusion_uglified_Seq& rhs) \
- { \
- boost::fusion::copy(rhs, *this); \
- } \
- \
- template <typename boost_fusion_uglified_Seq> \
- NAME& operator=(const boost_fusion_uglified_Seq& rhs) \
- { \
- boost::fusion::copy(rhs, *this); \
- return *this; \
- } \
- \
- template <typename boost_fusion_uglified_Seq, int N> \
- struct NAME##_iterator \
+ template <typename boost_fusion_detail_Seq, int N> \
+ struct BOOST_FUSION_ITERATOR_NAME(NAME) \
: boost::fusion::iterator_facade< \
- NAME##_iterator<boost_fusion_uglified_Seq, N>, \
+ BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Seq, N>, \
boost::fusion::random_access_traversal_tag \
> \
{ \
typedef boost::mpl::int_<N> index; \
- typedef boost_fusion_uglified_Seq sequence_type; \
+ typedef boost_fusion_detail_Seq sequence_type; \
\
- NAME##_iterator(boost_fusion_uglified_Seq& seq) : seq_(seq) {} \
+ BOOST_FUSION_GPU_ENABLED \
+ BOOST_FUSION_ITERATOR_NAME(NAME)(boost_fusion_detail_Seq& seq) \
+ : seq_(seq) \
+ BOOST_FUSION_DEFINE_ITERATOR_WKND_INIT_LIST_ENTRIES( \
+ (0)ATTRIBUTES_SEQ) \
+ {} \
\
- boost_fusion_uglified_Seq& seq_; \
+ boost_fusion_detail_Seq& seq_; \
\
- template <typename boost_fusion_uglified_T> struct value_of; \
- BOOST_PP_REPEAT( \
- ATTRIBUTES_SEQ_SIZE, \
- BOOST_FUSION_MAKE_ITERATOR_VALUE_OF_SPECS, \
- NAME) \
+ BOOST_FUSION_DEFINE_ITERATOR_WKND_MEMBERS(ATTRIBUTES_SEQ_SIZE) \
\
- template <typename boost_fusion_uglified_T> struct deref; \
- BOOST_PP_SEQ_FOR_EACH_I( \
- BOOST_FUSION_MAKE_ITERATOR_DEREF_SPECS, \
- NAME, \
- ATTRIBUTES_SEQ) \
+ BOOST_FUSION_DEFINE_ITERATOR_VALUE_OF(NAME, ATTRIBUTES_SEQ_SIZE) \
+ \
+ BOOST_FUSION_DEFINE_ITERATOR_DEREF(NAME, ATTRIBUTES_SEQ) \
\
- template <typename boost_fusion_uglified_It> \
+ template <typename boost_fusion_detail_It> \
struct next \
{ \
- typedef NAME##_iterator< \
- typename boost_fusion_uglified_It::sequence_type, \
- boost_fusion_uglified_It::index::value + 1 \
+ typedef BOOST_FUSION_ITERATOR_NAME(NAME)< \
+ typename boost_fusion_detail_It::sequence_type, \
+ boost_fusion_detail_It::index::value + 1 \
> type; \
\
- static type call(boost_fusion_uglified_It const& it) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_It const& it) \
{ \
return type(it.seq_); \
} \
}; \
\
- template <typename boost_fusion_uglified_It> \
+ template <typename boost_fusion_detail_It> \
struct prior \
{ \
- typedef NAME##_iterator< \
- typename boost_fusion_uglified_It::sequence_type, \
- boost_fusion_uglified_It::index::value - 1 \
+ typedef BOOST_FUSION_ITERATOR_NAME(NAME)< \
+ typename boost_fusion_detail_It::sequence_type, \
+ boost_fusion_detail_It::index::value - 1 \
> type; \
\
- static type call(boost_fusion_uglified_It const& it) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_It const& it) \
{ \
return type(it.seq_); \
} \
}; \
\
template < \
- typename boost_fusion_uglified_It1, \
- typename boost_fusion_uglified_It2 \
+ typename boost_fusion_detail_It1, \
+ typename boost_fusion_detail_It2 \
> \
struct distance \
{ \
typedef typename boost::mpl::minus< \
- typename boost_fusion_uglified_It2::index, \
- typename boost_fusion_uglified_It1::index \
+ typename boost_fusion_detail_It2::index, \
+ typename boost_fusion_detail_It1::index \
>::type type; \
\
- static type call(boost_fusion_uglified_It1 const& it1, \
- boost_fusion_uglified_It2 const& it2) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_It1 const& /* it1 */, \
+ boost_fusion_detail_It2 const& /* it2 */) \
{ \
return type(); \
} \
}; \
\
template < \
- typename boost_fusion_uglified_It, \
- typename boost_fusion_uglified_M \
+ typename boost_fusion_detail_It, \
+ typename boost_fusion_detail_M \
> \
struct advance \
{ \
- typedef NAME##_iterator< \
- typename boost_fusion_uglified_It::sequence_type, \
- boost_fusion_uglified_It::index::value \
- + boost_fusion_uglified_M::value \
+ typedef BOOST_FUSION_ITERATOR_NAME(NAME)< \
+ typename boost_fusion_detail_It::sequence_type, \
+ boost_fusion_detail_It::index::value \
+ + boost_fusion_detail_M::value \
> type; \
\
- static type call(boost_fusion_uglified_It const& it) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_It const& it) \
{ \
return type(it.seq_); \
} \
}; \
- }; \
+ };
+
+
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_MEMBERS_IMPL_IMPL( \
+ NAME, ATTRIBUTES_SEQ, ATTRIBUTES_SEQ_SIZE) \
+ \
+ /* Note: second BOOST_PP_IF is necessary to avoid MSVC warning when */ \
+ /* calling BOOST_FUSION_IGNORE_1 with no arguments. */ \
+ NAME() \
+ BOOST_PP_IF( \
+ ATTRIBUTES_SEQ_SIZE, \
+ BOOST_FUSION_MAKE_DEFAULT_INIT_LIST, \
+ BOOST_FUSION_IGNORE_1) \
+ (BOOST_PP_IF( \
+ ATTRIBUTES_SEQ_SIZE, \
+ ATTRIBUTES_SEQ, \
+ 0)) \
+ { \
+ } \
+ \
+ BOOST_PP_IF( \
+ ATTRIBUTES_SEQ_SIZE, \
+ BOOST_FUSION_MAKE_COPY_CONSTRUCTOR, \
+ BOOST_FUSION_IGNORE_2) \
+ (NAME, ATTRIBUTES_SEQ) \
+ \
+ template <typename boost_fusion_detail_Seq> \
+ BOOST_FUSION_GPU_ENABLED \
+ NAME(const boost_fusion_detail_Seq& rhs) \
+ { \
+ boost::fusion::copy(rhs, *this); \
+ } \
+ \
+ template <typename boost_fusion_detail_Seq> \
+ BOOST_FUSION_GPU_ENABLED \
+ NAME& operator=(const boost_fusion_detail_Seq& rhs) \
+ { \
+ boost::fusion::copy(rhs, *this); \
+ return *this; \
+ } \
\
- template <typename boost_fusion_uglified_Sq> \
+ template <typename boost_fusion_detail_Sq> \
struct begin \
{ \
- typedef NAME##_iterator<boost_fusion_uglified_Sq, 0> type; \
+ typedef BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, 0> \
+ type; \
\
- static type call(boost_fusion_uglified_Sq& sq) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_Sq& sq) \
{ \
return type(sq); \
} \
}; \
\
- template <typename boost_fusion_uglified_Sq> \
+ template <typename boost_fusion_detail_Sq> \
struct end \
{ \
- typedef NAME##_iterator< \
- boost_fusion_uglified_Sq, \
+ typedef BOOST_FUSION_ITERATOR_NAME(NAME)< \
+ boost_fusion_detail_Sq, \
ATTRIBUTES_SEQ_SIZE \
> type; \
\
- static type call(boost_fusion_uglified_Sq& sq) \
+ BOOST_FUSION_GPU_ENABLED \
+ static type call(boost_fusion_detail_Sq& sq) \
{ \
return type(sq); \
} \
}; \
\
- template <typename boost_fusion_uglified_Sq> \
+ template <typename boost_fusion_detail_Sq> \
struct size : boost::mpl::int_<ATTRIBUTES_SEQ_SIZE> \
{ \
}; \
\
- template <typename boost_fusion_uglified_Sq> \
+ template <typename boost_fusion_detail_Sq> \
struct empty : boost::mpl::bool_<ATTRIBUTES_SEQ_SIZE == 0> \
{ \
}; \
\
template < \
- typename boost_fusion_uglified_Sq, \
- typename boost_fusion_uglified_N \
+ typename boost_fusion_detail_Sq, \
+ typename boost_fusion_detail_N \
> \
struct value_at : value_at< \
- boost_fusion_uglified_Sq, \
- boost::mpl::int_<boost_fusion_uglified_N::value> \
+ boost_fusion_detail_Sq, \
+ boost::mpl::int_<boost_fusion_detail_N::value> \
> \
{ \
}; \
@@ -353,12 +514,12 @@
~) \
\
template < \
- typename boost_fusion_uglified_Sq, \
- typename boost_fusion_uglified_N \
+ typename boost_fusion_detail_Sq, \
+ typename boost_fusion_detail_N \
> \
struct at : at< \
- boost_fusion_uglified_Sq, \
- boost::mpl::int_<boost_fusion_uglified_N::value> \
+ boost_fusion_detail_Sq, \
+ boost::mpl::int_<boost_fusion_detail_N::value> \
> \
{ \
}; \