]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/local_function/include/boost/local_function/aux_/preprocessor/traits/decl_/append.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / local_function / include / boost / local_function / aux_ / preprocessor / traits / decl_ / append.hpp
1
2 // Copyright (C) 2009-2012 Lorenzo Caminiti
3 // Distributed under the Boost Software License, Version 1.0
4 // (see accompanying file LICENSE_1_0.txt or a copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 // Home at http://www.boost.org/libs/local_function
7
8 #ifndef BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_HPP_
9 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_HPP_
10
11 #include <boost/local_function/aux_/preprocessor/traits/decl_returns.hpp>
12 #include <boost/local_function/aux_/preprocessor/traits/decl_params.hpp>
13 #include <boost/local_function/aux_/preprocessor/traits/decl_const_binds.hpp>
14 #include <boost/local_function/aux_/preprocessor/traits/decl_binds.hpp>
15 #include <boost/local_function/aux_/preprocessor/traits/decl_error.hpp>
16 #include <boost/local_function/aux_/preprocessor/traits/param.hpp>
17 #include <boost/local_function/detail/preprocessor/keyword/return.hpp>
18 #include <boost/preprocessor/facilities/empty.hpp>
19 #include <boost/preprocessor/arithmetic/dec.hpp>
20 #include <boost/preprocessor/list/append.hpp>
21 #include <boost/preprocessor/list/size.hpp>
22 #include <boost/preprocessor/list/at.hpp>
23 #include <boost/preprocessor/list/first_n.hpp>
24
25 // PRIVATE //
26
27 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT_( \
28 params, default_value) \
29 /* `DEC` ok because precondition that unbinds are not nil-list */ \
30 BOOST_PP_LIST_APPEND( \
31 BOOST_PP_LIST_FIRST_N(BOOST_PP_DEC(BOOST_PP_LIST_SIZE(params)), \
32 params) \
33 , \
34 ( /* list 2-tuple */ \
35 ( /* (param_decl, default) 2-tuple */ \
36 BOOST_LOCAL_FUNCTION_AUX_PP_PARAM_TRAITS_DECL( \
37 BOOST_PP_LIST_AT(params, BOOST_PP_DEC( \
38 BOOST_PP_LIST_SIZE(params)))) \
39 , \
40 default_value BOOST_PP_EMPTY \
41 ) \
42 , \
43 BOOST_PP_NIL \
44 ) \
45 )
46
47 // PUBLIC //
48
49 // return_type: `return result_type`.
50 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_RETURN( \
51 decl_traits, return_type) \
52 ( /* returns */ \
53 BOOST_PP_LIST_APPEND( \
54 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits), \
55 ( BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_RETURN_REMOVE_FRONT( \
56 return_type), BOOST_PP_NIL ) ) \
57 , /* params and defaults */ \
58 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
59 , /* const-bind vars */ \
60 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
61 , /* const-bind `this` types */ \
62 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
63 decl_traits) \
64 , /* bind vars */ \
65 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
66 , /* bind `this` types */ \
67 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
68 , /* error message (if any) */ \
69 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
70 )
71
72
73 // param_decl: `[auto | register] type_ name_`.
74 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM( \
75 decl_traits, param_decl) \
76 ( /* returns */ \
77 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
78 , /* params and defaults */ \
79 BOOST_PP_LIST_APPEND( \
80 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits), \
81 /* append param (with no default -- EMPTY) */ \
82 ( (param_decl, BOOST_PP_EMPTY), BOOST_PP_NIL ) ) \
83 , /* const-bind vars */ \
84 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
85 , /* const-bind `this` types */ \
86 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
87 decl_traits) \
88 , /* bind vars */ \
89 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
90 , /* bind `this` types */ \
91 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
92 , /* error message (if any) */ \
93 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
94 )
95
96 // default_value: a valid parameter default value (`-1`, etc).
97 // Precondition: already added unbinds are not nil-list.
98 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT( \
99 decl_traits, default_value) \
100 ( /* returns */ \
101 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
102 , /* unbind params and defaults */ \
103 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT_( \
104 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits), \
105 default_value) /* append default to last added param */ \
106 , /* const-bind vars */ \
107 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
108 , /* const-bind `this` types */ \
109 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
110 decl_traits) \
111 , /* bind vars */ \
112 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
113 , /* bind `this` types */ \
114 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
115 , /* error message (if any) */ \
116 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
117 )
118
119 // var_without_type: `[&] var_` (var_ != this).
120 // var_with_type: `PP_EMPTY | type [&] var_` (var_ != this).
121 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND( \
122 decl_traits, var_without_type, var_with_type) \
123 ( /* returns */ \
124 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
125 , /* params and defaults */ \
126 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
127 , /* const-bind vars */ \
128 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
129 , /* const-bind `this` types */ \
130 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
131 decl_traits) \
132 , /* bind vars */ \
133 BOOST_PP_LIST_APPEND( \
134 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits), \
135 ( (var_without_type, var_with_type), BOOST_PP_NIL ) ) \
136 , /* bind `this` types */ \
137 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
138 , /* error message (if any) */ \
139 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
140 )
141
142 // this_type: `PP_EMPTY | type`.
143 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND_THIS_TYPE( \
144 decl_traits, this_type) \
145 ( /* returns */ \
146 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
147 , /* params and defaults */ \
148 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
149 , /* const-bind vars */ \
150 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
151 , /* const-bind `this` types */ \
152 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
153 decl_traits) \
154 , /* bind vars */ \
155 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
156 , /* bind `this` types */ \
157 BOOST_PP_LIST_APPEND( \
158 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES( \
159 decl_traits), \
160 ( (this_type), BOOST_PP_NIL ) ) \
161 , /* error message (if any) */ \
162 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
163 )
164
165 // var_without_type: `[&] var_` (var_ != this).
166 // var_with_type: `BOOST_PP_EMPTY | type_ [&] name_` (var_ != this).
167 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND( \
168 decl_traits, var_without_type, var_with_type) \
169 ( /* returns */ \
170 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
171 , /* params and defaults */ \
172 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
173 , /* const-bind vars */ \
174 BOOST_PP_LIST_APPEND( \
175 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS( \
176 decl_traits), \
177 ( (var_without_type, var_with_type), BOOST_PP_NIL ) ) \
178 , /* const-bind `this` types */ \
179 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
180 decl_traits) \
181 , /* bind vars */ \
182 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
183 , /* bind `this` types */ \
184 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
185 , /* error message (if any) */ \
186 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
187 )
188
189 // this_type: `PP_EMPTY | type`.
190 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND_THIS_TYPE( \
191 decl_traits, this_type) \
192 ( /* returns */ \
193 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
194 , /* params and defaults */ \
195 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
196 , /* const-bind vars */ \
197 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
198 , /* const-bind `this` types */ \
199 BOOST_PP_LIST_APPEND( \
200 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
201 decl_traits), \
202 ( (this_type), BOOST_PP_NIL ) ) \
203 , /* bind vars */ \
204 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
205 , /* bind `this` types */ \
206 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
207 , /* error message (if any) */ \
208 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
209 )
210
211 #endif // #include guard
212