diff --git a/include/boost/fusion/adapted/class/adapt_assoc_class.hpp b/include/boost/fusion/adapted/class/adapt_assoc_class.hpp index 26eb3ae6..60d8d9e4 100644 --- a/include/boost/fusion/adapted/class/adapt_assoc_class.hpp +++ b/include/boost/fusion/adapted/class/adapt_assoc_class.hpp @@ -62,6 +62,7 @@ (1)TEMPLATE_PARAMS_SEQ, \ (1)NAME_SEQ, \ assoc_struct_tag, \ + 0, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_CLASS_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_ASSOC_CLASS_C) @@ -70,6 +71,16 @@ (0), \ (0)(NAME), \ assoc_struct_tag, \ + 0, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_CLASS_FILLER_0 ATTRIBUTES,_END), \ + BOOST_FUSION_ADAPT_ASSOC_CLASS_C) + +#define BOOST_FUSION_ADAPT_ASSOC_CLASS_AS_VIEW(NAME, ATTRIBUTES) \ + BOOST_FUSION_ADAPT_STRUCT_BASE( \ + (0), \ + (0)(NAME), \ + assoc_struct_tag, \ + 1, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_CLASS_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_ASSOC_CLASS_C) diff --git a/include/boost/fusion/adapted/class/adapt_assoc_class_named.hpp b/include/boost/fusion/adapted/class/adapt_assoc_class_named.hpp index e73b1fe2..99e45ada 100644 --- a/include/boost/fusion/adapted/class/adapt_assoc_class_named.hpp +++ b/include/boost/fusion/adapted/class/adapt_assoc_class_named.hpp @@ -17,7 +17,7 @@ BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \ WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \ \ - BOOST_FUSION_ADAPT_ASSOC_CLASS( \ + BOOST_FUSION_ADAPT_ASSOC_CLASS_AS_VIEW( \ BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \ ATTRIBUTES) diff --git a/include/boost/fusion/adapted/class/adapt_class.hpp b/include/boost/fusion/adapted/class/adapt_class.hpp index f3ee7e93..fdd56216 100644 --- a/include/boost/fusion/adapted/class/adapt_class.hpp +++ b/include/boost/fusion/adapted/class/adapt_class.hpp @@ -48,6 +48,7 @@ (1)TEMPLATE_PARAMS_SEQ, \ (1)NAME_SEQ, \ struct_tag, \ + 0, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_CLASS_C) @@ -56,6 +57,16 @@ (0), \ (0)(NAME), \ struct_tag, \ + 0, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_FILLER_0 ATTRIBUTES,_END), \ + BOOST_FUSION_ADAPT_CLASS_C) + +#define BOOST_FUSION_ADAPT_CLASS_AS_VIEW(NAME, ATTRIBUTES) \ + BOOST_FUSION_ADAPT_STRUCT_BASE( \ + (0), \ + (0)(NAME), \ + struct_tag, \ + 1, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_CLASS_C) diff --git a/include/boost/fusion/adapted/class/adapt_class_named.hpp b/include/boost/fusion/adapted/class/adapt_class_named.hpp index 4dec9064..bbc1d1ae 100644 --- a/include/boost/fusion/adapted/class/adapt_class_named.hpp +++ b/include/boost/fusion/adapted/class/adapt_class_named.hpp @@ -19,7 +19,7 @@ BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \ WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \ \ - BOOST_FUSION_ADAPT_CLASS( \ + BOOST_FUSION_ADAPT_CLASS_AS_VIEW( \ BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \ ATTRIBUTES) diff --git a/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp b/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp index c6c991d1..0f54c938 100644 --- a/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp +++ b/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp @@ -34,9 +34,9 @@ #include #include -#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z)\ +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z) \ ((X, Y, Z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1 -#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z)\ +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z) \ ((X, Y, Z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0 #define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0_END #define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1_END @@ -68,6 +68,7 @@ (1)TEMPLATE_PARAMS_SEQ, \ (1)NAME_SEQ, \ assoc_struct_tag, \ + 0, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_ASSOC_STRUCT_C) @@ -76,6 +77,16 @@ (0), \ (0)(NAME), \ assoc_struct_tag, \ + 0, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0 ATTRIBUTES,_END), \ + BOOST_FUSION_ADAPT_ASSOC_STRUCT_C) + +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \ + BOOST_FUSION_ADAPT_STRUCT_BASE( \ + (0), \ + (0)(NAME), \ + assoc_struct_tag, \ + 1, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_ASSOC_STRUCT_C) diff --git a/include/boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp b/include/boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp index d4c3cdc2..996c9f47 100644 --- a/include/boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp +++ b/include/boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp @@ -11,11 +11,12 @@ #include #include -#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_C( \ - TEMPLATE_PARAMS_SEQ,NAME_SEQ, I, ATTRIBUTE) \ - \ - BOOST_FUSION_ADAPT_ASSOC_STRUCT_C_BASE( \ - TEMPLATE_PARAMS_SEQ,NAME_SEQ, I, obj., ATTRIBUTE) +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_0(X, Y, Z) \ + (X, obj.Y, Z) BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_1 +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_1(X, Y, Z) \ + (X, obj.Y, Z) BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_0 +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_0_END +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_1_END #define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS( \ WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \ @@ -23,13 +24,10 @@ BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \ WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \ \ - BOOST_FUSION_ADAPT_STRUCT_BASE( \ - (0), \ - (0)(BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION( \ - (0)NAMESPACE_SEQ)NAME), \ - assoc_struct_tag, \ - BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0 ATTRIBUTES,_END), \ - BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_C) + BOOST_FUSION_ADAPT_ASSOC_STRUCT_AS_VIEW( \ + BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \ + BOOST_PP_CAT( \ + BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_FILLER_0 ATTRIBUTES,_END)) #define BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \ BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS( \ diff --git a/include/boost/fusion/adapted/struct/adapt_struct.hpp b/include/boost/fusion/adapted/struct/adapt_struct.hpp index 0758af53..408e9460 100644 --- a/include/boost/fusion/adapted/struct/adapt_struct.hpp +++ b/include/boost/fusion/adapted/struct/adapt_struct.hpp @@ -45,6 +45,7 @@ (1)TEMPLATE_PARAMS_SEQ, \ (1)NAME_SEQ, \ struct_tag, \ + 0, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_STRUCT_C) @@ -53,6 +54,16 @@ (0), \ (0)(NAME), \ struct_tag, \ + 0, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \ + BOOST_FUSION_ADAPT_STRUCT_C) + +#define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \ + BOOST_FUSION_ADAPT_STRUCT_BASE( \ + (0), \ + (0)(NAME), \ + struct_tag, \ + 1, \ BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \ BOOST_FUSION_ADAPT_STRUCT_C) diff --git a/include/boost/fusion/adapted/struct/adapt_struct_named.hpp b/include/boost/fusion/adapted/struct/adapt_struct_named.hpp index 37ea1af1..ef13be02 100644 --- a/include/boost/fusion/adapted/struct/adapt_struct_named.hpp +++ b/include/boost/fusion/adapted/struct/adapt_struct_named.hpp @@ -14,11 +14,12 @@ #include #include -#define BOOST_FUSION_ADAPT_STRUCT_NAMED_C( \ - TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE) \ - \ - BOOST_FUSION_ADAPT_STRUCT_C_BASE( \ - TEMPLATE_PARAMS_SEQ,NAME_SEQ, I, obj., ATTRIBUTE, 2) +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0(X, Y) \ + (X, obj.Y) BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1 +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1(X, Y) \ + (X, obj.Y) BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0 +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0_END +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1_END #define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \ WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \ @@ -26,13 +27,9 @@ BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \ WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \ \ - BOOST_FUSION_ADAPT_STRUCT_BASE( \ - (0), \ - (0)(BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION( \ - (0)NAMESPACE_SEQ)NAME), \ - struct_tag, \ - BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \ - BOOST_FUSION_ADAPT_STRUCT_NAMED_C) + BOOST_FUSION_ADAPT_STRUCT_AS_VIEW( \ + BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0 ATTRIBUTES,_END)) #define BOOST_FUSION_ADAPT_STRUCT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \ BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \ diff --git a/include/boost/fusion/adapted/struct/detail/adapt_base.hpp b/include/boost/fusion/adapted/struct/detail/adapt_base.hpp index c1b1b923..4938e99b 100644 --- a/include/boost/fusion/adapted/struct/detail/adapt_base.hpp +++ b/include/boost/fusion/adapted/struct/detail/adapt_base.hpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -141,7 +142,12 @@ }; #define BOOST_FUSION_ADAPT_STRUCT_BASE( \ - TEMPLATE_PARAMS_SEQ,NAME_SEQ,TAG,ATTRIBUTES_SEQ,ATTRIBUTES_CALLBACK) \ + TEMPLATE_PARAMS_SEQ, \ + NAME_SEQ, \ + TAG, \ + IS_VIEW, \ + ATTRIBUTES_SEQ, \ + ATTRIBUTES_CALLBACK) \ \ namespace boost \ { \ @@ -169,6 +175,16 @@ namespace boost > \ struct struct_size \ : mpl::int_ \ + {}; \ + \ + template< \ + BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS( \ + TEMPLATE_PARAMS_SEQ) \ + > \ + struct struct_is_view< \ + BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \ + > \ + : mpl::BOOST_PP_IF(IS_VIEW,true_,false_) \ {}; \ } \ } \ diff --git a/include/boost/fusion/adapted/struct/detail/extension.hpp b/include/boost/fusion/adapted/struct/detail/extension.hpp index 4896859d..2ba3bf70 100644 --- a/include/boost/fusion/adapted/struct/detail/extension.hpp +++ b/include/boost/fusion/adapted/struct/detail/extension.hpp @@ -33,11 +33,15 @@ namespace boost { namespace fusion template struct struct_member_name; + template + struct struct_size; + + template + struct struct_is_view; + template struct struct_assoc_key; - template - struct struct_size; } }} diff --git a/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp b/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp index 0580018d..eae0b364 100644 --- a/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp +++ b/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp @@ -10,8 +10,6 @@ #ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_IS_VIEW_IMPL_HPP #define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_IS_VIEW_IMPL_HPP -#include - namespace boost { namespace fusion { namespace extension { template @@ -22,7 +20,7 @@ namespace boost { namespace fusion { namespace extension { template struct apply - : mpl::false_ + : struct_is_view::type> {}; }; diff --git a/test/sequence/adapt_assoc_class_named.cpp b/test/sequence/adapt_assoc_class_named.cpp index 8f6ec592..90ed405a 100644 --- a/test/sequence/adapt_assoc_class_named.cpp +++ b/test/sequence/adapt_assoc_class_named.cpp @@ -63,7 +63,7 @@ main() std::cout << tuple_delimiter(", "); { - BOOST_MPL_ASSERT_NOT((traits::is_view)); + BOOST_MPL_ASSERT((traits::is_view)); ns::point basep(123, 456); adapted::point p(basep); diff --git a/test/sequence/adapt_assoc_struct_named.cpp b/test/sequence/adapt_assoc_struct_named.cpp index 2cbf2f53..004381cf 100644 --- a/test/sequence/adapt_assoc_struct_named.cpp +++ b/test/sequence/adapt_assoc_struct_named.cpp @@ -48,7 +48,7 @@ main() std::cout << tuple_delimiter(", "); { - BOOST_MPL_ASSERT_NOT((traits::is_view)); + BOOST_MPL_ASSERT((traits::is_view)); ns::point basep = {123, 456}; adapted::point p(basep); diff --git a/test/sequence/adapt_class_named.cpp b/test/sequence/adapt_class_named.cpp index a67d68da..fd3a248a 100644 --- a/test/sequence/adapt_class_named.cpp +++ b/test/sequence/adapt_class_named.cpp @@ -71,7 +71,7 @@ main() std::cout << tuple_delimiter(", "); { - BOOST_MPL_ASSERT_NOT((traits::is_view)); + BOOST_MPL_ASSERT((traits::is_view)); ns::point basep(123, 456); adapted::point p(basep); diff --git a/test/sequence/adapt_struct_named.cpp b/test/sequence/adapt_struct_named.cpp index 8dabc56c..5fa04af8 100644 --- a/test/sequence/adapt_struct_named.cpp +++ b/test/sequence/adapt_struct_named.cpp @@ -63,7 +63,7 @@ main() std::cout << tuple_delimiter(", "); { - BOOST_MPL_ASSERT_NOT((traits::is_view)); + BOOST_MPL_ASSERT((traits::is_view)); ns::point basep = {123, 456}; adapted::point p(basep);