1 //
2 // detail/variadic_templates.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 #ifndef BOOST_ASIO_DETAIL_VARIADIC_TEMPLATES_HPP
12 #define BOOST_ASIO_DETAIL_VARIADIC_TEMPLATES_HPP
13 
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 
18 #include <boost/asio/detail/config.hpp>
19 
20 #if !defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
21 
22 # define BOOST_ASIO_VARIADIC_TPARAMS(n) BOOST_ASIO_VARIADIC_TPARAMS_##n
23 
24 # define BOOST_ASIO_VARIADIC_TPARAMS_1 \
25   typename T1
26 # define BOOST_ASIO_VARIADIC_TPARAMS_2 \
27   typename T1, typename T2
28 # define BOOST_ASIO_VARIADIC_TPARAMS_3 \
29   typename T1, typename T2, typename T3
30 # define BOOST_ASIO_VARIADIC_TPARAMS_4 \
31   typename T1, typename T2, typename T3, typename T4
32 # define BOOST_ASIO_VARIADIC_TPARAMS_5 \
33   typename T1, typename T2, typename T3, typename T4, typename T5
34 # define BOOST_ASIO_VARIADIC_TPARAMS_6 \
35   typename T1, typename T2, typename T3, typename T4, typename T5, \
36   typename T6
37 # define BOOST_ASIO_VARIADIC_TPARAMS_7 \
38   typename T1, typename T2, typename T3, typename T4, typename T5, \
39   typename T6, typename T7
40 # define BOOST_ASIO_VARIADIC_TPARAMS_8 \
41   typename T1, typename T2, typename T3, typename T4, typename T5, \
42   typename T6, typename T7, typename T8
43 
44 # define BOOST_ASIO_VARIADIC_TARGS(n) BOOST_ASIO_VARIADIC_TARGS_##n
45 
46 # define BOOST_ASIO_VARIADIC_TARGS_1 T1
47 # define BOOST_ASIO_VARIADIC_TARGS_2 T1, T2
48 # define BOOST_ASIO_VARIADIC_TARGS_3 T1, T2, T3
49 # define BOOST_ASIO_VARIADIC_TARGS_4 T1, T2, T3, T4
50 # define BOOST_ASIO_VARIADIC_TARGS_5 T1, T2, T3, T4, T5
51 # define BOOST_ASIO_VARIADIC_TARGS_6 T1, T2, T3, T4, T5, T6
52 # define BOOST_ASIO_VARIADIC_TARGS_7 T1, T2, T3, T4, T5, T6, T7
53 # define BOOST_ASIO_VARIADIC_TARGS_8 T1, T2, T3, T4, T5, T6, T7, T8
54 
55 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS(n) \
56   BOOST_ASIO_VARIADIC_BYVAL_PARAMS_##n
57 
58 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_1 T1 x1
59 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_2 T1 x1, T2 x2
60 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_3 T1 x1, T2 x2, T3 x3
61 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_4 T1 x1, T2 x2, T3 x3, T4 x4
62 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_5 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5
63 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_6 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, \
64   T6 x6
65 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_7 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, \
66   T6 x6, T7 x7
67 # define BOOST_ASIO_VARIADIC_BYVAL_PARAMS_8 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, \
68   T6 x6, T7 x7, T8 x8
69 
70 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS(n) \
71   BOOST_ASIO_VARIADIC_BYVAL_ARGS_##n
72 
73 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_1 x1
74 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_2 x1, x2
75 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_3 x1, x2, x3
76 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_4 x1, x2, x3, x4
77 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_5 x1, x2, x3, x4, x5
78 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_6 x1, x2, x3, x4, x5, x6
79 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_7 x1, x2, x3, x4, x5, x6, x7
80 # define BOOST_ASIO_VARIADIC_BYVAL_ARGS_8 x1, x2, x3, x4, x5, x6, x7, x8
81 
82 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS(n) \
83   BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_##n
84 
85 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_1 \
86   const T1& x1
87 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_2 \
88   const T1& x1, const T2& x2
89 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_3 \
90   const T1& x1, const T2& x2, const T3& x3
91 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_4 \
92   const T1& x1, const T2& x2, const T3& x3, const T4& x4
93 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_5 \
94   const T1& x1, const T2& x2, const T3& x3, const T4& x4, const T5& x5
95 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_6 \
96   const T1& x1, const T2& x2, const T3& x3, const T4& x4, const T5& x5, \
97   const T6& x6
98 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_7 \
99   const T1& x1, const T2& x2, const T3& x3, const T4& x4, const T5& x5, \
100   const T6& x6, const T7& x7
101 # define BOOST_ASIO_VARIADIC_CONSTREF_PARAMS_8 \
102   const T1& x1, const T2& x2, const T3& x3, const T4& x4, const T5& x5, \
103   const T6& x6, const T7& x7, const T8& x8
104 
105 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS(n) \
106   BOOST_ASIO_VARIADIC_MOVE_PARAMS_##n
107 
108 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_1 \
109   BOOST_ASIO_MOVE_ARG(T1) x1
110 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_2 \
111   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2
112 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_3 \
113   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
114   BOOST_ASIO_MOVE_ARG(T3) x3
115 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_4 \
116   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
117   BOOST_ASIO_MOVE_ARG(T3) x3, BOOST_ASIO_MOVE_ARG(T4) x4
118 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_5 \
119   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
120   BOOST_ASIO_MOVE_ARG(T3) x3, BOOST_ASIO_MOVE_ARG(T4) x4, \
121   BOOST_ASIO_MOVE_ARG(T5) x5
122 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_6 \
123   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
124   BOOST_ASIO_MOVE_ARG(T3) x3, BOOST_ASIO_MOVE_ARG(T4) x4, \
125   BOOST_ASIO_MOVE_ARG(T5) x5, BOOST_ASIO_MOVE_ARG(T6) x6
126 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_7 \
127   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
128   BOOST_ASIO_MOVE_ARG(T3) x3, BOOST_ASIO_MOVE_ARG(T4) x4, \
129   BOOST_ASIO_MOVE_ARG(T5) x5, BOOST_ASIO_MOVE_ARG(T6) x6, \
130   BOOST_ASIO_MOVE_ARG(T7) x7
131 # define BOOST_ASIO_VARIADIC_MOVE_PARAMS_8 \
132   BOOST_ASIO_MOVE_ARG(T1) x1, BOOST_ASIO_MOVE_ARG(T2) x2, \
133   BOOST_ASIO_MOVE_ARG(T3) x3, BOOST_ASIO_MOVE_ARG(T4) x4, \
134   BOOST_ASIO_MOVE_ARG(T5) x5, BOOST_ASIO_MOVE_ARG(T6) x6, \
135   BOOST_ASIO_MOVE_ARG(T7) x7, BOOST_ASIO_MOVE_ARG(T8) x8
136 
137 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS(n) \
138   BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_##n
139 
140 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_1 \
141   BOOST_ASIO_MOVE_ARG(T1)
142 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_2 \
143   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2)
144 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_3 \
145   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
146   BOOST_ASIO_MOVE_ARG(T3)
147 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_4 \
148   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
149   BOOST_ASIO_MOVE_ARG(T3), BOOST_ASIO_MOVE_ARG(T4)
150 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_5 \
151   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
152   BOOST_ASIO_MOVE_ARG(T3), BOOST_ASIO_MOVE_ARG(T4), \
153   BOOST_ASIO_MOVE_ARG(T5)
154 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_6 \
155   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
156   BOOST_ASIO_MOVE_ARG(T3), BOOST_ASIO_MOVE_ARG(T4), \
157   BOOST_ASIO_MOVE_ARG(T5), BOOST_ASIO_MOVE_ARG(T6)
158 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_7 \
159   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
160   BOOST_ASIO_MOVE_ARG(T3), BOOST_ASIO_MOVE_ARG(T4), \
161   BOOST_ASIO_MOVE_ARG(T5), BOOST_ASIO_MOVE_ARG(T6), \
162   BOOST_ASIO_MOVE_ARG(T7)
163 # define BOOST_ASIO_VARIADIC_UNNAMED_MOVE_PARAMS_8 \
164   BOOST_ASIO_MOVE_ARG(T1), BOOST_ASIO_MOVE_ARG(T2), \
165   BOOST_ASIO_MOVE_ARG(T3), BOOST_ASIO_MOVE_ARG(T4), \
166   BOOST_ASIO_MOVE_ARG(T5), BOOST_ASIO_MOVE_ARG(T6), \
167   BOOST_ASIO_MOVE_ARG(T7), BOOST_ASIO_MOVE_ARG(T8)
168 
169 # define BOOST_ASIO_VARIADIC_MOVE_ARGS(n) \
170   BOOST_ASIO_VARIADIC_MOVE_ARGS_##n
171 
172 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_1 \
173   BOOST_ASIO_MOVE_CAST(T1)(x1)
174 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_2 \
175   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2)
176 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_3 \
177   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
178   BOOST_ASIO_MOVE_CAST(T3)(x3)
179 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_4 \
180   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
181   BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4)
182 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_5 \
183   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
184   BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4), \
185   BOOST_ASIO_MOVE_CAST(T5)(x5)
186 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_6 \
187   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
188   BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4), \
189   BOOST_ASIO_MOVE_CAST(T5)(x5), BOOST_ASIO_MOVE_CAST(T6)(x6)
190 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_7 \
191   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
192   BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4), \
193   BOOST_ASIO_MOVE_CAST(T5)(x5), BOOST_ASIO_MOVE_CAST(T6)(x6), \
194   BOOST_ASIO_MOVE_CAST(T7)(x7)
195 # define BOOST_ASIO_VARIADIC_MOVE_ARGS_8 \
196   BOOST_ASIO_MOVE_CAST(T1)(x1), BOOST_ASIO_MOVE_CAST(T2)(x2), \
197   BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4), \
198   BOOST_ASIO_MOVE_CAST(T5)(x5), BOOST_ASIO_MOVE_CAST(T6)(x6), \
199   BOOST_ASIO_MOVE_CAST(T7)(x7), BOOST_ASIO_MOVE_CAST(T8)(x8)
200 
201 # define BOOST_ASIO_VARIADIC_DECLVAL(n) \
202   BOOST_ASIO_VARIADIC_DECLVAL_##n
203 
204 # define BOOST_ASIO_VARIADIC_DECLVAL_1 \
205   declval<T1>()
206 # define BOOST_ASIO_VARIADIC_DECLVAL_2 \
207   declval<T1>(), declval<T2>()
208 # define BOOST_ASIO_VARIADIC_DECLVAL_3 \
209   declval<T1>(), declval<T2>(), declval<T3>()
210 # define BOOST_ASIO_VARIADIC_DECLVAL_4 \
211   declval<T1>(), declval<T2>(), declval<T3>(), declval<T4>()
212 # define BOOST_ASIO_VARIADIC_DECLVAL_5 \
213   declval<T1>(), declval<T2>(), declval<T3>(), declval<T4>(), \
214   declval<T5>()
215 # define BOOST_ASIO_VARIADIC_DECLVAL_6 \
216   declval<T1>(), declval<T2>(), declval<T3>(), declval<T4>(), \
217   declval<T5>(), declval<T6>()
218 # define BOOST_ASIO_VARIADIC_DECLVAL_7 \
219   declval<T1>(), declval<T2>(), declval<T3>(), declval<T4>(), \
220   declval<T5>(), declval<T6>(), declval<T7>()
221 # define BOOST_ASIO_VARIADIC_DECLVAL_8 \
222   declval<T1>(), declval<T2>(), declval<T3>(), declval<T4>(), \
223   declval<T5>(), declval<T6>(), declval<T7>(), declval<T8>()
224 
225 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n) \
226   BOOST_ASIO_VARIADIC_MOVE_DECLVAL_##n
227 
228 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_1 \
229   declval<BOOST_ASIO_MOVE_ARG(T1)>()
230 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_2 \
231   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>()
232 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_3 \
233   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
234   declval<BOOST_ASIO_MOVE_ARG(T3)>()
235 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_4 \
236   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
237   declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>()
238 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_5 \
239   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
240   declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>(), \
241   declval<BOOST_ASIO_MOVE_ARG(T5)>()
242 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_6 \
243   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
244   declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>(), \
245   declval<BOOST_ASIO_MOVE_ARG(T5)>(), declval<BOOST_ASIO_MOVE_ARG(T6)>()
246 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_7 \
247   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
248   declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>(), \
249   declval<BOOST_ASIO_MOVE_ARG(T5)>(), declval<BOOST_ASIO_MOVE_ARG(T6)>(), \
250   declval<BOOST_ASIO_MOVE_ARG(T7)>()
251 # define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_8 \
252   declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
253   declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>(), \
254   declval<BOOST_ASIO_MOVE_ARG(T5)>(), declval<BOOST_ASIO_MOVE_ARG(T6)>(), \
255   declval<BOOST_ASIO_MOVE_ARG(T7)>(), declval<BOOST_ASIO_MOVE_ARG(T8)>()
256 
257 # define BOOST_ASIO_VARIADIC_DECAY(n) \
258   BOOST_ASIO_VARIADIC_DECAY_##n
259 
260 # define BOOST_ASIO_VARIADIC_DECAY_1 \
261   typename decay<T1>::type
262 # define BOOST_ASIO_VARIADIC_DECAY_2 \
263   typename decay<T1>::type, typename decay<T2>::type
264 # define BOOST_ASIO_VARIADIC_DECAY_3 \
265   typename decay<T1>::type, typename decay<T2>::type, \
266   typename decay<T3>::type
267 # define BOOST_ASIO_VARIADIC_DECAY_4 \
268   typename decay<T1>::type, typename decay<T2>::type, \
269   typename decay<T3>::type, typename decay<T4>::type
270 # define BOOST_ASIO_VARIADIC_DECAY_5 \
271   typename decay<T1>::type, typename decay<T2>::type, \
272   typename decay<T3>::type, typename decay<T4>::type, \
273   typename decay<T5>::type
274 # define BOOST_ASIO_VARIADIC_DECAY_6 \
275   typename decay<T1>::type, typename decay<T2>::type, \
276   typename decay<T3>::type, typename decay<T4>::type, \
277   typename decay<T5>::type, typename decay<T6>::type
278 # define BOOST_ASIO_VARIADIC_DECAY_7 \
279   typename decay<T1>::type, typename decay<T2>::type, \
280   typename decay<T3>::type, typename decay<T4>::type, \
281   typename decay<T5>::type, typename decay<T6>::type, \
282   typename decay<T7>::type
283 # define BOOST_ASIO_VARIADIC_DECAY_8 \
284   typename decay<T1>::type, typename decay<T2>::type, \
285   typename decay<T3>::type, typename decay<T4>::type, \
286   typename decay<T5>::type, typename decay<T6>::type, \
287   typename decay<T7>::type, typename decay<T8>::type
288 
289 # define BOOST_ASIO_VARIADIC_GENERATE(m) m(1) m(2) m(3) m(4) m(5) m(6) m(7) m(8)
290 # define BOOST_ASIO_VARIADIC_GENERATE_5(m) m(1) m(2) m(3) m(4) m(5)
291 
292 #endif // !defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
293 
294 #endif // BOOST_ASIO_DETAIL_VARIADIC_TEMPLATES_HPP
295