mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-16 05:42:20 +02:00
FEATURE: BOOST_FUSION_ADAPT_STRUCT can now also be called completely with
variadics arguments. The following signature is possible : BOOST_FUSION_ADAPT_STRUCT( struct_name, member_name0, (BOOST_FUSION_ADAPT_AUTO, member_name1) (member_type2, member_name2) member_name3, ... )
This commit is contained in:
@ -12,6 +12,9 @@
|
|||||||
#include <boost/fusion/support/config.hpp>
|
#include <boost/fusion/support/config.hpp>
|
||||||
#include <boost/preprocessor/config/config.hpp>
|
#include <boost/preprocessor/config/config.hpp>
|
||||||
#include <boost/preprocessor/variadic.hpp>
|
#include <boost/preprocessor/variadic.hpp>
|
||||||
|
#include <boost/preprocessor/variadic/to_seq.hpp>
|
||||||
|
#include <boost/preprocessor/seq/for_each.hpp>
|
||||||
|
#include <boost/preprocessor/seq/push_front.hpp>
|
||||||
#include <boost/preprocessor/cat.hpp>
|
#include <boost/preprocessor/cat.hpp>
|
||||||
#include <boost/preprocessor/empty.hpp>
|
#include <boost/preprocessor/empty.hpp>
|
||||||
#include <boost/preprocessor/control/if.hpp>
|
#include <boost/preprocessor/control/if.hpp>
|
||||||
@ -34,6 +37,7 @@
|
|||||||
#include <boost/fusion/adapted/struct/detail/end_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/end_impl.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
|
||||||
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
||||||
|
#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
|
||||||
|
|
||||||
#if BOOST_PP_VARIADICS
|
#if BOOST_PP_VARIADICS
|
||||||
|
|
||||||
@ -98,6 +102,30 @@
|
|||||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \
|
BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||||
|
|
||||||
|
|
||||||
|
#if BOOST_PP_VARIADICS
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_STRUCT_PROCESS_PARAM(r, data, elem) \
|
||||||
|
BOOST_PP_IF(BOOST_FUSION_PP_IS_SEQ(elem), \
|
||||||
|
BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0 elem ,_END), \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE(elem) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE_FROM_VARIADICS(...) \
|
||||||
|
BOOST_PP_SEQ_PUSH_FRONT( \
|
||||||
|
BOOST_PP_SEQ_FOR_EACH(BOOST_FUSION_ADAPT_STRUCT_PROCESS_PARAM, unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)), (0,0))
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_STRUCT(NAME, ...) \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||||
|
(0), \
|
||||||
|
(0)(NAME), \
|
||||||
|
struct_tag, \
|
||||||
|
0, \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_CREATE_MEMBER_TUPLE_FROM_VARIADICS(__VA_ARGS__), \
|
||||||
|
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||||
|
|
||||||
|
#else // BOOST_PP_VARIADICS
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES) \
|
#define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES) \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||||
(0), \
|
(0), \
|
||||||
@ -107,6 +135,8 @@
|
|||||||
BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||||
|
|
||||||
|
#endif // BOOST_PP_VARIADICS
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \
|
#define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||||
(0), \
|
(0), \
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
/*=============================================================================
|
||||||
|
BOOST_PP_VARIADICS version of BOOST_PP_IS_SEQ inspired from
|
||||||
|
boost/mpl/aux_/preprocessor/is_seq.hpp, original copyrights goes to :
|
||||||
|
|
||||||
|
Copyright Paul Mensonides 2003
|
||||||
|
Copyright Aleksey Gurtovoy 2003-2004
|
||||||
|
|
||||||
|
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_PREPROCESSOR_IS_SEQ_HPP
|
||||||
|
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_PREPROCESSOR_IS_SEQ_HPP
|
||||||
|
|
||||||
|
#include <boost/preprocessor/seq/size.hpp>
|
||||||
|
#include <boost/preprocessor/arithmetic/dec.hpp>
|
||||||
|
#include <boost/preprocessor/punctuation/paren.hpp>
|
||||||
|
#include <boost/preprocessor/cat.hpp>
|
||||||
|
#include <boost/preprocessor/config/config.hpp>
|
||||||
|
|
||||||
|
#if BOOST_PP_VARIADICS
|
||||||
|
|
||||||
|
#define BOOST_FUSION_PP_IS_SEQ(seq) BOOST_PP_CAT(BOOST_FUSION_PP_IS_SEQ_, \
|
||||||
|
BOOST_FUSION_PP_IS_SEQ_0 seq BOOST_PP_RPAREN())
|
||||||
|
|
||||||
|
#define BOOST_FUSION_PP_IS_SEQ_0(...) \
|
||||||
|
BOOST_FUSION_PP_IS_SEQ_1(__VA_ARGS__
|
||||||
|
|
||||||
|
#define BOOST_FUSION_PP_IS_SEQ_ALWAYS_0(...) \
|
||||||
|
0
|
||||||
|
|
||||||
|
#define BOOST_FUSION_PP_IS_SEQ_BOOST_FUSION_PP_IS_SEQ_0 \
|
||||||
|
BOOST_FUSION_PP_IS_SEQ_ALWAYS_0(
|
||||||
|
|
||||||
|
#define BOOST_FUSION_PP_IS_SEQ_BOOST_FUSION_PP_IS_SEQ_1(...) \
|
||||||
|
1
|
||||||
|
|
||||||
|
#endif // BOOST_PP_VARIADICS
|
||||||
|
|
||||||
|
#endif
|
@ -4,6 +4,8 @@
|
|||||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
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)
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
==============================================================================*/
|
==============================================================================*/
|
||||||
|
#define BOOST_PP_VARIADICS 1
|
||||||
|
|
||||||
#include <boost/detail/lightweight_test.hpp>
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||||
#include <boost/fusion/sequence/intrinsic/at.hpp>
|
#include <boost/fusion/sequence/intrinsic/at.hpp>
|
||||||
@ -38,6 +40,7 @@ namespace ns
|
|||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
|
int z;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||||
@ -58,8 +61,9 @@ namespace ns
|
|||||||
|
|
||||||
BOOST_FUSION_ADAPT_STRUCT(
|
BOOST_FUSION_ADAPT_STRUCT(
|
||||||
ns::point,
|
ns::point,
|
||||||
(x)
|
(int, x)
|
||||||
(int, y)
|
(int, y),
|
||||||
|
z
|
||||||
)
|
)
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||||
@ -71,7 +75,7 @@ BOOST_FUSION_ADAPT_STRUCT(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct s { int m; };
|
struct s { int m; };
|
||||||
BOOST_FUSION_ADAPT_STRUCT(s, (m))
|
BOOST_FUSION_ADAPT_STRUCT(s, (int, m))
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
@ -90,13 +94,13 @@ main()
|
|||||||
std::cout << at_c<0>(p) << std::endl;
|
std::cout << at_c<0>(p) << std::endl;
|
||||||
std::cout << at_c<1>(p) << std::endl;
|
std::cout << at_c<1>(p) << std::endl;
|
||||||
std::cout << p << std::endl;
|
std::cout << p << std::endl;
|
||||||
BOOST_TEST(p == make_vector(123, 456));
|
BOOST_TEST(p == make_vector(123, 456, 4));
|
||||||
|
|
||||||
at_c<0>(p) = 6;
|
at_c<0>(p) = 6;
|
||||||
at_c<1>(p) = 9;
|
at_c<1>(p) = 9;
|
||||||
BOOST_TEST(p == make_vector(6, 9));
|
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
|
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
|
||||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
||||||
|
|
||||||
BOOST_TEST(front(p) == 6);
|
BOOST_TEST(front(p) == 6);
|
||||||
@ -104,9 +108,9 @@ main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
fusion::vector<int, float> v1(4, 2);
|
fusion::vector<int, float, int> v1(4, 2, 3);
|
||||||
ns::point v2 = {5, 3};
|
ns::point v2 = {5, 3, 2};
|
||||||
fusion::vector<long, double> v3(5, 4);
|
fusion::vector<long, double, int> v3(5, 4, 2);
|
||||||
BOOST_TEST(v1 < v2);
|
BOOST_TEST(v1 < v2);
|
||||||
BOOST_TEST(v1 <= v2);
|
BOOST_TEST(v1 <= v2);
|
||||||
BOOST_TEST(v2 > v1);
|
BOOST_TEST(v2 > v1);
|
||||||
@ -119,15 +123,15 @@ main()
|
|||||||
|
|
||||||
{
|
{
|
||||||
// conversion from ns::point to vector
|
// conversion from ns::point to vector
|
||||||
ns::point p = {5, 3};
|
ns::point p = {5, 3, 4};
|
||||||
fusion::vector<int, long> v(p);
|
fusion::vector<int, long, int> v(p);
|
||||||
v = p;
|
v = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// conversion from ns::point to list
|
// conversion from ns::point to list
|
||||||
ns::point p = {5, 3};
|
ns::point p = {5, 3, 4};
|
||||||
fusion::list<int, long> l(p);
|
fusion::list<int, long, int> l(p);
|
||||||
l = p;
|
l = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user