• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2007 Joel de Guzman
3     Copyright (c) 2009-2011 Christopher Schmidt
4     Copyright (c) 2013-2014 Damien Buhl
5 
6     Distributed under the Boost Software License, Version 1.0. (See accompanying
7     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 ==============================================================================*/
9 
10 #ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP
11 #define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP
12 
13 #include <boost/fusion/support/config.hpp>
14 #include <boost/preprocessor/config/config.hpp>
15 #include <boost/preprocessor/cat.hpp>
16 #include <boost/preprocessor/empty.hpp>
17 #include <boost/preprocessor/control/iif.hpp>
18 #include <boost/preprocessor/comparison/less.hpp>
19 #include <boost/preprocessor/seq/seq.hpp>
20 #include <boost/preprocessor/variadic/to_seq.hpp>
21 
22 #include <boost/fusion/adapted/struct/detail/extension.hpp>
23 #include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
24 #include <boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp>
25 #include <boost/fusion/adapted/struct/detail/at_impl.hpp>
26 #include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
27 #include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
28 #include <boost/fusion/adapted/struct/detail/value_at_impl.hpp>
29 #include <boost/fusion/adapted/struct/detail/category_of_impl.hpp>
30 #include <boost/fusion/adapted/struct/detail/size_impl.hpp>
31 #include <boost/fusion/adapted/struct/detail/begin_impl.hpp>
32 #include <boost/fusion/adapted/struct/detail/end_impl.hpp>
33 #include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
34 #include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
35 
36 #define BOOST_FUSION_ADAPT_STRUCT_C(                                            \
37     TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE)                       \
38         BOOST_FUSION_ADAPT_STRUCT_C_BASE(                                       \
39             TEMPLATE_PARAMS_SEQ,                                                \
40             NAME_SEQ,                                                           \
41             IS_VIEW,                                                            \
42             I,                                                                  \
43             BOOST_PP_IIF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY),   \
44             BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE),                   \
45             BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE),              \
46             BOOST_PP_LESS(                                                      \
47                 BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 2))
48 
49 
50 
51 #if BOOST_PP_VARIADICS
52 
53 #   define BOOST_FUSION_ADAPT_TPL_STRUCT(TEMPLATE_PARAMS_SEQ,NAME_SEQ, ...)     \
54         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
55             (1)TEMPLATE_PARAMS_SEQ,                                             \
56             (1)NAME_SEQ,                                                        \
57             struct_tag,                                                         \
58             0,                                                                  \
59             BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(                        \
60                 BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)),                         \
61             BOOST_FUSION_ADAPT_STRUCT_C)
62 
63 #   define BOOST_FUSION_ADAPT_STRUCT(...)                                       \
64         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
65             (0),                                                                \
66             (0)(BOOST_PP_SEQ_HEAD(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))),      \
67             struct_tag,                                                         \
68             0,                                                                  \
69             BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(                        \
70               BOOST_PP_SEQ_TAIL(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))),        \
71             BOOST_FUSION_ADAPT_STRUCT_C)
72 
73 #   define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(...)                               \
74         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
75             (0),                                                                \
76             (0)(BOOST_PP_SEQ_HEAD(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))),      \
77             struct_tag,                                                         \
78             1,                                                                  \
79             BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(                        \
80               BOOST_PP_SEQ_TAIL(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))),        \
81             BOOST_FUSION_ADAPT_STRUCT_C)
82 
83 #else // BOOST_PP_VARIADICS
84 
85 #   define BOOST_FUSION_ADAPT_TPL_STRUCT(                                       \
86         TEMPLATE_PARAMS_SEQ,NAME_SEQ, ATTRIBUTES)                               \
87         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
88             (1)TEMPLATE_PARAMS_SEQ,                                             \
89             (1)NAME_SEQ,                                                        \
90             struct_tag,                                                         \
91             0,                                                                  \
92             BOOST_PP_CAT(                                                       \
93                 BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END),        \
94             BOOST_FUSION_ADAPT_STRUCT_C)
95 
96 #   define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES)                          \
97         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
98             (0),                                                                \
99             (0)(NAME),                                                          \
100             struct_tag,                                                         \
101             0,                                                                  \
102             BOOST_PP_CAT(                                                       \
103                 BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,              \
104                 _END),                                                          \
105             BOOST_FUSION_ADAPT_STRUCT_C)
106 
107 #   define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES)                  \
108         BOOST_FUSION_ADAPT_STRUCT_BASE(                                         \
109             (0),                                                                \
110             (0)(NAME),                                                          \
111             struct_tag,                                                         \
112             1,                                                                  \
113             BOOST_PP_CAT(                                                       \
114                 BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,              \
115                 _END),                                                          \
116             BOOST_FUSION_ADAPT_STRUCT_C)
117 
118 
119 #endif // BOOST_PP_VARIADICS
120 
121 #endif
122