14 #ifndef LLVM_ADT_VARIADICFUNCTION_H
15 #define LLVM_ADT_VARIADICFUNCTION_H
23 #define LLVM_COMMA_JOIN1(x) x ## 0
24 #define LLVM_COMMA_JOIN2(x) LLVM_COMMA_JOIN1(x), x ## 1
25 #define LLVM_COMMA_JOIN3(x) LLVM_COMMA_JOIN2(x), x ## 2
26 #define LLVM_COMMA_JOIN4(x) LLVM_COMMA_JOIN3(x), x ## 3
27 #define LLVM_COMMA_JOIN5(x) LLVM_COMMA_JOIN4(x), x ## 4
28 #define LLVM_COMMA_JOIN6(x) LLVM_COMMA_JOIN5(x), x ## 5
29 #define LLVM_COMMA_JOIN7(x) LLVM_COMMA_JOIN6(x), x ## 6
30 #define LLVM_COMMA_JOIN8(x) LLVM_COMMA_JOIN7(x), x ## 7
31 #define LLVM_COMMA_JOIN9(x) LLVM_COMMA_JOIN8(x), x ## 8
32 #define LLVM_COMMA_JOIN10(x) LLVM_COMMA_JOIN9(x), x ## 9
33 #define LLVM_COMMA_JOIN11(x) LLVM_COMMA_JOIN10(x), x ## 10
34 #define LLVM_COMMA_JOIN12(x) LLVM_COMMA_JOIN11(x), x ## 11
35 #define LLVM_COMMA_JOIN13(x) LLVM_COMMA_JOIN12(x), x ## 12
36 #define LLVM_COMMA_JOIN14(x) LLVM_COMMA_JOIN13(x), x ## 13
37 #define LLVM_COMMA_JOIN15(x) LLVM_COMMA_JOIN14(x), x ## 14
38 #define LLVM_COMMA_JOIN16(x) LLVM_COMMA_JOIN15(x), x ## 15
39 #define LLVM_COMMA_JOIN17(x) LLVM_COMMA_JOIN16(x), x ## 16
40 #define LLVM_COMMA_JOIN18(x) LLVM_COMMA_JOIN17(x), x ## 17
41 #define LLVM_COMMA_JOIN19(x) LLVM_COMMA_JOIN18(x), x ## 18
42 #define LLVM_COMMA_JOIN20(x) LLVM_COMMA_JOIN19(x), x ## 19
43 #define LLVM_COMMA_JOIN21(x) LLVM_COMMA_JOIN20(x), x ## 20
44 #define LLVM_COMMA_JOIN22(x) LLVM_COMMA_JOIN21(x), x ## 21
45 #define LLVM_COMMA_JOIN23(x) LLVM_COMMA_JOIN22(x), x ## 22
46 #define LLVM_COMMA_JOIN24(x) LLVM_COMMA_JOIN23(x), x ## 23
47 #define LLVM_COMMA_JOIN25(x) LLVM_COMMA_JOIN24(x), x ## 24
48 #define LLVM_COMMA_JOIN26(x) LLVM_COMMA_JOIN25(x), x ## 25
49 #define LLVM_COMMA_JOIN27(x) LLVM_COMMA_JOIN26(x), x ## 26
50 #define LLVM_COMMA_JOIN28(x) LLVM_COMMA_JOIN27(x), x ## 27
51 #define LLVM_COMMA_JOIN29(x) LLVM_COMMA_JOIN28(x), x ## 28
52 #define LLVM_COMMA_JOIN30(x) LLVM_COMMA_JOIN29(x), x ## 29
53 #define LLVM_COMMA_JOIN31(x) LLVM_COMMA_JOIN30(x), x ## 30
54 #define LLVM_COMMA_JOIN32(x) LLVM_COMMA_JOIN31(x), x ## 31
104 template <
typename ResultT,
typename ArgT,
105 ResultT (*
Func)(ArrayRef<const ArgT *>)>
111 #define LLVM_DEFINE_OVERLOAD(N) \
112 ResultT operator()(LLVM_COMMA_JOIN ## N(const ArgT &A)) const { \
113 const ArgT *const Args[] = { LLVM_COMMA_JOIN ## N(&A) }; \
114 return Func(makeArrayRef(Args)); \
148 #undef LLVM_DEFINE_OVERLOAD
151 template <
typename ResultT,
typename Param0T,
typename ArgT,
152 ResultT (*
Func)(Param0T, ArrayRef<const ArgT *>)>
158 #define LLVM_DEFINE_OVERLOAD(N) \
159 ResultT operator()(Param0T P0, LLVM_COMMA_JOIN ## N(const ArgT &A)) const { \
160 const ArgT *const Args[] = { LLVM_COMMA_JOIN ## N(&A) }; \
161 return Func(P0, makeArrayRef(Args)); \
195 #undef LLVM_DEFINE_OVERLOAD
198 template <
typename ResultT,
typename Param0T,
typename Param1T,
typename ArgT,
199 ResultT (*
Func)(Param0T, Param1T, ArrayRef<const ArgT *>)>
205 #define LLVM_DEFINE_OVERLOAD(N) \
206 ResultT operator()(Param0T P0, Param1T P1, \
207 LLVM_COMMA_JOIN ## N(const ArgT &A)) const { \
208 const ArgT *const Args[] = { LLVM_COMMA_JOIN ## N(&A) }; \
209 return Func(P0, P1, makeArrayRef(Args)); \
243 #undef LLVM_DEFINE_OVERLOAD
246 template <
typename ResultT,
typename Param0T,
typename Param1T,
247 typename Param2T,
typename ArgT,
248 ResultT (*
Func)(Param0T, Param1T, Param2T, ArrayRef<const ArgT *>)>
250 ResultT
operator()(Param0T P0, Param1T P1, Param2T P2)
const {
254 #define LLVM_DEFINE_OVERLOAD(N) \
255 ResultT operator()(Param0T P0, Param1T P1, Param2T P2, \
256 LLVM_COMMA_JOIN ## N(const ArgT &A)) const { \
257 const ArgT *const Args[] = { LLVM_COMMA_JOIN ## N(&A) }; \
258 return Func(P0, P1, P2, makeArrayRef(Args)); \
292 #undef LLVM_DEFINE_OVERLOAD
296 #undef LLVM_COMMA_JOIN1
297 #undef LLVM_COMMA_JOIN2
298 #undef LLVM_COMMA_JOIN3
299 #undef LLVM_COMMA_JOIN4
300 #undef LLVM_COMMA_JOIN5
301 #undef LLVM_COMMA_JOIN6
302 #undef LLVM_COMMA_JOIN7
303 #undef LLVM_COMMA_JOIN8
304 #undef LLVM_COMMA_JOIN9
305 #undef LLVM_COMMA_JOIN10
306 #undef LLVM_COMMA_JOIN11
307 #undef LLVM_COMMA_JOIN12
308 #undef LLVM_COMMA_JOIN13
309 #undef LLVM_COMMA_JOIN14
310 #undef LLVM_COMMA_JOIN15
311 #undef LLVM_COMMA_JOIN16
312 #undef LLVM_COMMA_JOIN17
313 #undef LLVM_COMMA_JOIN18
314 #undef LLVM_COMMA_JOIN19
315 #undef LLVM_COMMA_JOIN20
316 #undef LLVM_COMMA_JOIN21
317 #undef LLVM_COMMA_JOIN22
318 #undef LLVM_COMMA_JOIN23
319 #undef LLVM_COMMA_JOIN24
320 #undef LLVM_COMMA_JOIN25
321 #undef LLVM_COMMA_JOIN26
322 #undef LLVM_COMMA_JOIN27
323 #undef LLVM_COMMA_JOIN28
324 #undef LLVM_COMMA_JOIN29
325 #undef LLVM_COMMA_JOIN30
326 #undef LLVM_COMMA_JOIN31
327 #undef LLVM_COMMA_JOIN32
331 #endif // LLVM_ADT_VARIADICFUNCTION_H
ResultT operator()(Param0T P0) const
#define LLVM_DEFINE_OVERLOAD(N)
ResultT operator()(Param0T P0, Param1T P1) const
Class which can simulate a type-safe variadic function.
ResultT operator()() const
ResultT operator()(Param0T P0, Param1T P1, Param2T P2) const