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 
8 namespace re2 {
9 
10 template <typename Result, typename Param0, typename Param1, typename Arg,
11           Result (*Func)(Param0, Param1, const Arg* const [], int count)>
12 class VariadicFunction2 {
13  public:
operator()14   Result operator()(Param0 p0, Param1 p1) const {
15     return Func(p0, p1, 0, 0);
16   }
17 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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 
operator()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