variadic_function.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright 2010 The RE2 Authors. All Rights Reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5#ifndef RE2_VARIADIC_FUNCTION_H_ 6#define RE2_VARIADIC_FUNCTION_H_ 7 8namespace re2 { 9 10template <typename Result, typename Param0, typename Param1, typename Arg, 11 Result (*Func)(Param0, Param1, const Arg* const [], int count)> 12class VariadicFunction2 { 13 public: 14 Result operator()(Param0 p0, Param1 p1) const { 15 return Func(p0, p1, 0, 0); 16 } 17 18 Result operator()(Param0 p0, Param1 p1, const Arg& a0) const { 19 const Arg* const args[] = { &a0 }; 20 return Func(p0, p1, args, 1); 21 } 22 23 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1) const { 24 const Arg* const args[] = { &a0, &a1 }; 25 return Func(p0, p1, args, 2); 26 } 27 28 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 29 const Arg& a2) const { 30 const Arg* const args[] = { &a0, &a1, &a2 }; 31 return Func(p0, p1, args, 3); 32 } 33 34 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 35 const Arg& a2, const Arg& a3) const { 36 const Arg* const args[] = { &a0, &a1, &a2, &a3 }; 37 return Func(p0, p1, args, 4); 38 } 39 40 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 41 const Arg& a2, const Arg& a3, const Arg& a4) const { 42 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4 }; 43 return Func(p0, p1, args, 5); 44 } 45 46 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 47 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5) const { 48 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5 }; 49 return Func(p0, p1, args, 6); 50 } 51 52 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 53 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 54 const Arg& a6) const { 55 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6 }; 56 return Func(p0, p1, args, 7); 57 } 58 59 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 60 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 61 const Arg& a6, const Arg& a7) const { 62 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7 }; 63 return Func(p0, p1, args, 8); 64 } 65 66 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 67 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 68 const Arg& a6, const Arg& a7, const Arg& a8) const { 69 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8 }; 70 return Func(p0, p1, args, 9); 71 } 72 73 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 74 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 75 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9) const { 76 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 77 &a9 }; 78 return Func(p0, p1, args, 10); 79 } 80 81 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 82 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 83 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 84 const Arg& a10) const { 85 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 86 &a9, &a10 }; 87 return Func(p0, p1, args, 11); 88 } 89 90 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 91 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 92 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 93 const Arg& a10, const Arg& a11) const { 94 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 95 &a9, &a10, &a11 }; 96 return Func(p0, p1, args, 12); 97 } 98 99 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 100 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 101 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 102 const Arg& a10, const Arg& a11, const Arg& a12) const { 103 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 104 &a9, &a10, &a11, &a12 }; 105 return Func(p0, p1, args, 13); 106 } 107 108 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 109 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 110 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 111 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13) const { 112 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 113 &a9, &a10, &a11, &a12, &a13 }; 114 return Func(p0, p1, args, 14); 115 } 116 117 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 118 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 119 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 120 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 121 const Arg& a14) const { 122 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 123 &a9, &a10, &a11, &a12, &a13, &a14 }; 124 return Func(p0, p1, args, 15); 125 } 126 127 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 128 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 129 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 130 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 131 const Arg& a14, const Arg& a15) const { 132 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 133 &a9, &a10, &a11, &a12, &a13, &a14, &a15 }; 134 return Func(p0, p1, args, 16); 135 } 136 137 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 138 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 139 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 140 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 141 const Arg& a14, const Arg& a15, const Arg& a16) const { 142 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 143 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16 }; 144 return Func(p0, p1, args, 17); 145 } 146 147 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 148 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 149 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 150 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 151 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17) const { 152 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 153 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17 }; 154 return Func(p0, p1, args, 18); 155 } 156 157 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 158 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 159 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 160 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 161 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 162 const Arg& a18) const { 163 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 164 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18 }; 165 return Func(p0, p1, args, 19); 166 } 167 168 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 169 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 170 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 171 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 172 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 173 const Arg& a18, const Arg& a19) const { 174 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 175 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19 }; 176 return Func(p0, p1, args, 20); 177 } 178 179 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 180 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 181 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 182 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 183 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 184 const Arg& a18, const Arg& a19, const Arg& a20) const { 185 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 186 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, 187 &a20 }; 188 return Func(p0, p1, args, 21); 189 } 190 191 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 192 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 193 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 194 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 195 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 196 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21) const { 197 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 198 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 199 &a21 }; 200 return Func(p0, p1, args, 22); 201 } 202 203 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 204 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 205 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 206 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 207 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 208 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 209 const Arg& a22) const { 210 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 211 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 212 &a21, &a22 }; 213 return Func(p0, p1, args, 23); 214 } 215 216 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 217 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 218 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 219 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 220 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 221 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 222 const Arg& a22, const Arg& a23) const { 223 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 224 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 225 &a21, &a22, &a23 }; 226 return Func(p0, p1, args, 24); 227 } 228 229 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 230 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 231 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 232 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 233 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 234 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 235 const Arg& a22, const Arg& a23, const Arg& a24) const { 236 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 237 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 238 &a21, &a22, &a23, &a24 }; 239 return Func(p0, p1, args, 25); 240 } 241 242 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 243 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 244 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 245 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 246 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 247 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 248 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25) const { 249 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 250 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 251 &a21, &a22, &a23, &a24, &a25 }; 252 return Func(p0, p1, args, 26); 253 } 254 255 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 256 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 257 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 258 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 259 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 260 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 261 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 262 const Arg& a26) const { 263 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 264 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 265 &a21, &a22, &a23, &a24, &a25, &a26 }; 266 return Func(p0, p1, args, 27); 267 } 268 269 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 270 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 271 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 272 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 273 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 274 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 275 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 276 const Arg& a26, const Arg& a27) const { 277 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 278 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 279 &a21, &a22, &a23, &a24, &a25, &a26, &a27 }; 280 return Func(p0, p1, args, 28); 281 } 282 283 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 284 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 285 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 286 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 287 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 288 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 289 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 290 const Arg& a26, const Arg& a27, const Arg& a28) const { 291 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 292 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 293 &a21, &a22, &a23, &a24, &a25, &a26, &a27, &a28 }; 294 return Func(p0, p1, args, 29); 295 } 296 297 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 298 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 299 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 300 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 301 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 302 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 303 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 304 const Arg& a26, const Arg& a27, const Arg& a28, const Arg& a29) const { 305 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 306 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 307 &a21, &a22, &a23, &a24, &a25, &a26, &a27, &a28, &a29 }; 308 return Func(p0, p1, args, 30); 309 } 310 311 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 312 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 313 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 314 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 315 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 316 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 317 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 318 const Arg& a26, const Arg& a27, const Arg& a28, const Arg& a29, 319 const Arg& a30) const { 320 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 321 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 322 &a21, &a22, &a23, &a24, &a25, &a26, &a27, &a28, &a29, &a30 }; 323 return Func(p0, p1, args, 31); 324 } 325 326 Result operator()(Param0 p0, Param1 p1, const Arg& a0, const Arg& a1, 327 const Arg& a2, const Arg& a3, const Arg& a4, const Arg& a5, 328 const Arg& a6, const Arg& a7, const Arg& a8, const Arg& a9, 329 const Arg& a10, const Arg& a11, const Arg& a12, const Arg& a13, 330 const Arg& a14, const Arg& a15, const Arg& a16, const Arg& a17, 331 const Arg& a18, const Arg& a19, const Arg& a20, const Arg& a21, 332 const Arg& a22, const Arg& a23, const Arg& a24, const Arg& a25, 333 const Arg& a26, const Arg& a27, const Arg& a28, const Arg& a29, 334 const Arg& a30, const Arg& a31) const { 335 const Arg* const args[] = { &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, 336 &a9, &a10, &a11, &a12, &a13, &a14, &a15, &a16, &a17, &a18, &a19, &a20, 337 &a21, &a22, &a23, &a24, &a25, &a26, &a27, &a28, &a29, &a30, &a31 }; 338 return Func(p0, p1, args, 32); 339 } 340}; 341 342} // namespace re2 343 344#endif // RE2_VARIADIC_FUNCTION_H_ 345