diff --git a/include/boost/fusion/adapted/struct/auto_adapt_struct.hpp b/include/boost/fusion/adapted/struct/auto_adapt_struct.hpp index 08f47157..96e82999 100644 --- a/include/boost/fusion/adapted/struct/auto_adapt_struct.hpp +++ b/include/boost/fusion/adapted/struct/auto_adapt_struct.hpp @@ -11,6 +11,9 @@ #define BOOST_FUSION_ADAPTED_STRUCT_AUTO_ADAPT_STRUCT_HPP #include +#include +#include +#include #include @@ -19,10 +22,35 @@ #define BOOST_FUSION_AUTO_ADAPT_STRUCT_TYPE_DEDUCER(r, NAME, ATTRIBUTE) \ (BOOST_TYPEOF(NAME::ATTRIBUTE), ATTRIBUTE) -#define BOOST_FUSION_AUTO_ADAPT_STRUCT(NAME, ATTRIBUTES) \ +#define BOOST_FUSION_AUTO_ADAPT_STRUCT(...) \ + BOOST_FUSION_AUTO_ADAPT_STRUCT_BASE( \ + BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__), \ + BOOST_PP_SEQ_POP_FRONT(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))) + +#define BOOST_FUSION_AUTO_ADAPT_STRUCT_BASE(NAME, ATTRIBUTES) \ BOOST_FUSION_ADAPT_STRUCT(NAME, \ BOOST_PP_SEQ_FOR_EACH( \ BOOST_FUSION_AUTO_ADAPT_STRUCT_TYPE_DEDUCER, NAME, ATTRIBUTES) \ ) + + +#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y) \ + ((X, Y)) BOOST_FUSION_ADAPT_STRUCT_FILLER_1 +#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1(X, Y) \ + ((X, Y)) BOOST_FUSION_ADAPT_STRUCT_FILLER_0 +#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0_END +#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1_END + +#define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES) \ + BOOST_FUSION_ADAPT_STRUCT_BASE( \ + (0), \ + (0)(NAME), \ + struct_tag, \ + 0, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \ + BOOST_FUSION_ADAPT_STRUCT_C) + + + #endif diff --git a/test/sequence/auto_adapt_struct.cpp b/test/sequence/auto_adapt_struct.cpp index 7007e49c..e7ce2890 100644 --- a/test/sequence/auto_adapt_struct.cpp +++ b/test/sequence/auto_adapt_struct.cpp @@ -57,10 +57,15 @@ namespace ns #endif } -BOOST_FUSION_AUTO_ADAPT_STRUCT( +/*BOOST_FUSION_AUTO_ADAPT_STRUCT( ns::point, (x) (y) +)*/ + +BOOST_FUSION_AUTO_ADAPT_STRUCT( + ns::point, + x, y ) #if !BOOST_WORKAROUND(__GNUC__,<4)