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