From 37fc1443adc247fddec82f2521db37d737f8010f Mon Sep 17 00:00:00 2001 From: "Damien Buhl (alias daminetreg)" Date: Fri, 30 May 2014 17:44:49 +0200 Subject: [PATCH] Improve the BOOST_FUSION_ADAPT_STRUCT macro to work also when there is no variadic support. This enable the following flexible macro signature when there is no BOOST_PP_VARIADICS support: BOOST_FUSION_ADAPT_STRUCT( struct_name, (member_type0, member_name0) (BOOST_FUSION_ADAPT_AUTO, member_name1) (,member_name2) ... ) If BOOST_PP_VARIADICS is active then there is quite more flexibility as it allows to avoid the type specification: BOOST_FUSION_ADAPT_STRUCT( struct_name, (member_type0, member_name0) (BOOST_FUSION_ADAPT_AUTO, member_name1) (,member_name2) (member_name3) ... ) --- .../fusion/adapted/struct/adapt_struct.hpp | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/include/boost/fusion/adapted/struct/adapt_struct.hpp b/include/boost/fusion/adapted/struct/adapt_struct.hpp index bf5655a9..06927e9e 100644 --- a/include/boost/fusion/adapted/struct/adapt_struct.hpp +++ b/include/boost/fusion/adapted/struct/adapt_struct.hpp @@ -6,16 +6,17 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ -//#define BOOST_PP_VARIADICS - #ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP #define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP #include - +#include +#include #include #include -#include +#include +#include +#include #include #include #include @@ -34,29 +35,49 @@ #include #include -//TODO: Write a variadic version full : with variadic also directly to provide the fields. #if BOOST_PP_VARIADICS +#define BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(...) \ + BOOST_PP_IF(BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 2), \ + BOOST_PP_IF(BOOST_PP_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__)), \ + ((1, (BOOST_PP_VARIADIC_ELEM(1, __VA_ARGS__)) )), \ + ((2, BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))) \ + ), \ + ((1, (BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__)) )) \ + ) + #define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(...) \ - ((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__))) \ + BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(__VA_ARGS__) \ BOOST_FUSION_ADAPT_STRUCT_FILLER_1 #define BOOST_FUSION_ADAPT_STRUCT_FILLER_1(...) \ - ((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__))) \ + BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(__VA_ARGS__) \ BOOST_FUSION_ADAPT_STRUCT_FILLER_0 #define BOOST_FUSION_ADAPT_STRUCT_FILLER_0_END #define BOOST_FUSION_ADAPT_STRUCT_FILLER_1_END -#else +#else // BOOST_PP_VARIADICS + +#define BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(X, Y) \ + BOOST_PP_IF(BOOST_PP_IS_EMPTY(X), \ + ((1, (Y))), \ + ((2, (X,Y))) \ + ) #define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y) \ - ((2, (X, Y))) BOOST_FUSION_ADAPT_STRUCT_FILLER_1 + BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(X,Y) \ + BOOST_FUSION_ADAPT_STRUCT_FILLER_1 + #define BOOST_FUSION_ADAPT_STRUCT_FILLER_1(X, Y) \ - ((2, (X, Y))) BOOST_FUSION_ADAPT_STRUCT_FILLER_0 + BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(X,Y) \ + BOOST_FUSION_ADAPT_STRUCT_FILLER_0 + #define BOOST_FUSION_ADAPT_STRUCT_FILLER_0_END #define BOOST_FUSION_ADAPT_STRUCT_FILLER_1_END -#endif +#endif // BOOST_PP_VARIADICS + +#define BOOST_FUSION_ADAPT_AUTO BOOST_PP_EMPTY() #define BOOST_FUSION_ADAPT_STRUCT_C(TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE)\ BOOST_FUSION_ADAPT_STRUCT_C_BASE( \