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