mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-21 16:22:45 +02:00
Adds the possibility to omit the member type in ADAPT_ASSOC* macros usage.
This feature is enabled when BOOST_PP_VARIADICS also is, as it rely on it. A placeholder for the type can be used when BOOST_PP_VARIADICS isn't active.
This commit is contained in:
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#include <boost/fusion/adapted/struct/detail/extension.hpp>
|
#include <boost/fusion/adapted/struct/detail/extension.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp>
|
#include <boost/fusion/adapted/struct/detail/adapt_base_assoc_attr_filler.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
||||||
@ -65,6 +65,7 @@
|
|||||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_C_BASE( \
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_C_BASE( \
|
||||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW,I,BOOST_PP_EMPTY,ATTRIBUTE)
|
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW,I,BOOST_PP_EMPTY,ATTRIBUTE)
|
||||||
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT( \
|
#define BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT( \
|
||||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, ATTRIBUTES) \
|
TEMPLATE_PARAMS_SEQ, NAME_SEQ, ATTRIBUTES) \
|
||||||
\
|
\
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
/*=============================================================================
|
||||||
|
Copyright (c) 2013-2014 Damien Buhl
|
||||||
|
|
||||||
|
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_STRUCT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
|
||||||
|
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#include <boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp>
|
||||||
|
|
||||||
|
#include <boost/preprocessor/control/if.hpp>
|
||||||
|
#include <boost/preprocessor/arithmetic/sub.hpp>
|
||||||
|
#include <boost/preprocessor/variadic/size.hpp>
|
||||||
|
#include <boost/preprocessor/empty.hpp>
|
||||||
|
#include <boost/preprocessor/facilities/is_empty.hpp>
|
||||||
|
|
||||||
|
#if BOOST_PP_VARIADICS
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(...) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(__VA_ARGS__) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(...) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(__VA_ARGS__) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(...) \
|
||||||
|
((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(X, Y, Z) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(X, Y, Z) \
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(X, Y, Z) \
|
||||||
|
BOOST_PP_IF(BOOST_PP_IS_EMPTY(X), \
|
||||||
|
((2, (Y,Z))), \
|
||||||
|
((3, (X,Y,Z))) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0_END
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1_END
|
||||||
|
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) \
|
||||||
|
BOOST_PP_TUPLE_ELEM( \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||||
|
BOOST_PP_SUB(BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 1), \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE))
|
||||||
|
|
||||||
|
#endif
|
@ -12,12 +12,13 @@
|
|||||||
#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
|
#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
|
||||||
|
|
||||||
#include <boost/preprocessor/empty.hpp>
|
#include <boost/preprocessor/empty.hpp>
|
||||||
#include <boost/preprocessor/arithmetic/sub.hpp>
|
#include <boost/preprocessor/tuple/size.hpp>
|
||||||
#include <boost/preprocessor/facilities/is_empty.hpp>
|
#include <boost/preprocessor/facilities/is_empty.hpp>
|
||||||
#include <boost/preprocessor/variadic/to_seq.hpp>
|
#include <boost/preprocessor/variadic/to_seq.hpp>
|
||||||
#include <boost/preprocessor/seq/for_each.hpp>
|
#include <boost/preprocessor/seq/for_each.hpp>
|
||||||
#include <boost/preprocessor/seq/push_front.hpp>
|
#include <boost/preprocessor/seq/push_front.hpp>
|
||||||
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y) \
|
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y) \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTE_FILLER(X,Y) \
|
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTE_FILLER(X,Y) \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_1
|
BOOST_FUSION_ADAPT_STRUCT_FILLER_1
|
||||||
@ -41,46 +42,21 @@
|
|||||||
#define BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE) \
|
#define BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE) \
|
||||||
BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
|
BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z) \
|
|
||||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(X, Y, Z) \
|
|
||||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z) \
|
|
||||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(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
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_ATTRIBUTE_FILLER(X, Y, Z) \
|
|
||||||
BOOST_PP_IF(BOOST_PP_IS_EMPTY(X), \
|
|
||||||
((2, (Y,Z))), \
|
|
||||||
((3, (X,Y,Z))) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) \
|
|
||||||
BOOST_PP_TUPLE_ELEM( \
|
|
||||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
|
||||||
BOOST_PP_SUB(BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 1), \
|
|
||||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE))
|
|
||||||
|
|
||||||
|
|
||||||
#if BOOST_PP_VARIADICS
|
#if BOOST_PP_VARIADICS
|
||||||
|
|
||||||
# define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP(r, data, elem) \
|
# define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP(r, unused, elem) \
|
||||||
BOOST_PP_IF(BOOST_FUSION_PP_IS_SEQ(elem), \
|
BOOST_PP_IF(BOOST_FUSION_PP_IS_SEQ(elem), \
|
||||||
BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0 elem ,_END), \
|
BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0 elem ,_END), \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTE_FILLER(BOOST_FUSION_ADAPT_AUTO, \
|
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTE_FILLER(BOOST_FUSION_ADAPT_AUTO, \
|
||||||
elem) \
|
elem))
|
||||||
)
|
|
||||||
|
|
||||||
# define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(...) \
|
# define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(...) \
|
||||||
BOOST_PP_SEQ_PUSH_FRONT( \
|
BOOST_PP_SEQ_PUSH_FRONT( \
|
||||||
BOOST_PP_SEQ_FOR_EACH( \
|
BOOST_PP_SEQ_FOR_EACH( \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP, \
|
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP, \
|
||||||
unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)), \
|
unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)), \
|
||||||
(0,0) \
|
(0,0))
|
||||||
)
|
|
||||||
|
|
||||||
#endif // BOOST_PP_VARIADICS
|
#endif // BOOST_PP_VARIADICS
|
||||||
|
|
||||||
|
@ -50,11 +50,21 @@ namespace ns
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
#if BOOST_PP_VARIADICS
|
||||||
ns::point,
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||||
(int, x, ns::x_member)
|
ns::point,
|
||||||
(int, y, ns::y_member)
|
(x, ns::x_member)
|
||||||
)
|
(int, y, ns::y_member)
|
||||||
|
)
|
||||||
|
|
||||||
|
#else // BOOST_PP_VARIADICS
|
||||||
|
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||||
|
ns::point,
|
||||||
|
(BOOST_FUSION_ADAPT_AUTO, x, ns::x_member)
|
||||||
|
(int, y, ns::y_member)
|
||||||
|
)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
|
Reference in New Issue
Block a user