summaryrefslogtreecommitdiff
path: root/boost/fusion/adapted/struct/adapt_struct.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/adapted/struct/adapt_struct.hpp')
-rw-r--r--boost/fusion/adapted/struct/adapt_struct.hpp127
1 files changed, 89 insertions, 38 deletions
diff --git a/boost/fusion/adapted/struct/adapt_struct.hpp b/boost/fusion/adapted/struct/adapt_struct.hpp
index f60ca03e19..e96e7c76d2 100644
--- a/boost/fusion/adapted/struct/adapt_struct.hpp
+++ b/boost/fusion/adapted/struct/adapt_struct.hpp
@@ -1,6 +1,7 @@
/*=============================================================================
Copyright (c) 2001-2007 Joel de Guzman
Copyright (c) 2009-2011 Christopher Schmidt
+ 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)
@@ -10,8 +11,12 @@
#define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP
#include <boost/fusion/support/config.hpp>
+#include <boost/preprocessor/config/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/empty.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/add_const.hpp>
@@ -19,6 +24,7 @@
#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_attr_filler.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_sequence_impl.hpp>
@@ -30,43 +36,88 @@
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
-#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_C(TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE)\
- BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
- TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,BOOST_PP_EMPTY,ATTRIBUTE,2)
-
-#define BOOST_FUSION_ADAPT_TPL_STRUCT(TEMPLATE_PARAMS_SEQ,NAME_SEQ, ATTRIBUTES) \
- BOOST_FUSION_ADAPT_STRUCT_BASE( \
- (1)TEMPLATE_PARAMS_SEQ, \
- (1)NAME_SEQ, \
- struct_tag, \
- 0, \
- ((0,0)) BOOST_PP_CAT( \
- BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \
- BOOST_FUSION_ADAPT_STRUCT_C)
-
-#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)
-
-#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(0,0)ATTRIBUTES,_END), \
- BOOST_FUSION_ADAPT_STRUCT_C)
+#define BOOST_FUSION_ADAPT_STRUCT_C( \
+ TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
+ BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
+ TEMPLATE_PARAMS_SEQ, \
+ NAME_SEQ, \
+ IS_VIEW, \
+ I, \
+ BOOST_PP_IF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
+ BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE), \
+ BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
+ BOOST_PP_IF( \
+ BOOST_PP_LESS( \
+ BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 2) \
+ , 1, 0))
+
+
+
+#if BOOST_PP_VARIADICS
+
+# define BOOST_FUSION_ADAPT_TPL_STRUCT(TEMPLATE_PARAMS_SEQ,NAME_SEQ, ...) \
+ BOOST_FUSION_ADAPT_STRUCT_BASE( \
+ (1)TEMPLATE_PARAMS_SEQ, \
+ (1)NAME_SEQ, \
+ struct_tag, \
+ 0, \
+ BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
+ BOOST_FUSION_ADAPT_STRUCT_C)
+
+# define BOOST_FUSION_ADAPT_STRUCT(NAME, ...) \
+ BOOST_FUSION_ADAPT_STRUCT_BASE( \
+ (0), \
+ (0)(NAME), \
+ struct_tag, \
+ 0, \
+ BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
+ BOOST_FUSION_ADAPT_STRUCT_C)
+
+# define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ...) \
+ BOOST_FUSION_ADAPT_STRUCT_BASE( \
+ (0), \
+ (0)(NAME), \
+ struct_tag, \
+ 1, \
+ BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
+ BOOST_FUSION_ADAPT_STRUCT_C)
+
+#else // BOOST_PP_VARIADICS
+
+# define BOOST_FUSION_ADAPT_TPL_STRUCT( \
+ TEMPLATE_PARAMS_SEQ,NAME_SEQ, ATTRIBUTES) \
+ BOOST_FUSION_ADAPT_STRUCT_BASE( \
+ (1)TEMPLATE_PARAMS_SEQ, \
+ (1)NAME_SEQ, \
+ struct_tag, \
+ 0, \
+ BOOST_PP_CAT( \
+ BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
+ BOOST_FUSION_ADAPT_STRUCT_C)
+
+# 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)
+
+# 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(0,0)ATTRIBUTES, \
+ _END), \
+ BOOST_FUSION_ADAPT_STRUCT_C)
+
+
+#endif // BOOST_PP_VARIADICS
#endif