root/trunk/infrastructure/pyd/generators/ftype.txt

Revision 38, 18.6 kB (checked in by KirkMcDonald, 2 years ago)

More opApply wrapping, docs

Line 
1 /**
2  * This module contains template for inferring the number of arguments,
3  * the return type, and argument types of an arbitrary function pointer.
4  *
5  * This module was automatically generated by ftype.py
6  *
7  * Written by Daniel Keep.
8  * Released to public domain—share and enjoy (just leave my name in it,
9  * pretty please).
10  */
11 module pyd.ftype;
12 private:
13
14 /* *** NumberOfArgs(Tf) *** */
15
16 typedef uint Arglen0 = 0;
17 typedef uint Arglen1 = 1;
18 typedef uint Arglen2 = 2;
19 typedef uint Arglen3 = 3;
20 typedef uint Arglen4 = 4;
21 typedef uint Arglen5 = 5;
22 typedef uint Arglen6 = 6;
23 typedef uint Arglen7 = 7;
24 typedef uint Arglen8 = 8;
25 typedef uint Arglen9 = 9;
26 typedef uint Arglen10 = 10;
27
28 template
29 ArglenT(Tr)
30 {
31     Arglen0
32     ArglenT(Tr function() fn) { assert(false); }
33 }
34
35 template
36 ArglenT(Tr, Ta1)
37 {
38     Arglen1
39     ArglenT(Tr function(Ta1) fn) { assert(false); }
40 }
41
42 template
43 ArglenT(Tr, Ta1, Ta2)
44 {
45     Arglen2
46     ArglenT(Tr function(Ta1, Ta2) fn) { assert(false); }
47 }
48
49 template
50 ArglenT(Tr, Ta1, Ta2, Ta3)
51 {
52     Arglen3
53     ArglenT(Tr function(Ta1, Ta2, Ta3) fn) { assert(false); }
54 }
55
56 template
57 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4)
58 {
59     Arglen4
60     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4) fn) { assert(false); }
61 }
62
63 template
64 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
65 {
66     Arglen5
67     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
68 }
69
70 template
71 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
72 {
73     Arglen6
74     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
75 }
76
77 template
78 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
79 {
80     Arglen7
81     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
82 }
83
84 template
85 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
86 {
87     Arglen8
88     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
89 }
90
91 template
92 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
93 {
94     Arglen9
95     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
96 }
97
98 template
99 ArglenT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
100 {
101     Arglen10
102     ArglenT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
103 }
104
105 template
106 ArglenConvT(T)
107 {
108     const uint ArglenConvT = T.init;
109 }
110
111 template
112 NumberOfArgsT(Tf)
113 {
114     private Tf fptr;
115     alias typeof(ArglenT(fptr)) type;
116 }
117
118 template
119 NumberOfArgsSwitchT(Tf)
120 {
121     static if( is( typeof(*Tf) == function ) )
122         alias NumberOfArgsT!(Tf).type type;
123     else static if( is( Tf U == delegate ) )
124         alias NumberOfArgsSwitchT!(U*).type type;
125 }
126
127 /**
128  * This template will attempt to determine the number of arguments the
129  * supplied function pointer or delegate type takes.  It supports a maximum of
130  * 10 arguments.
131  *
132  * Example:
133  * ----------------------------------------
134  * void fnWithThreeArgs(byte a, short b, int c) {}
135  * const uint numArgs = NumberOfArgs!(typeof(&fnWithThreeArgs));
136  * ----------------------------------------
137  */
138 public
139 template
140 NumberOfArgs(Tf)
141 {
142     const uint NumberOfArgs = ArglenConvT!(NumberOfArgsSwitchT!(Tf).type);
143 }
144
145 template
146 ArgleninoutT(Tr)
147 {
148     Arglen0
149     ArgleninoutT(Tr function() fn) { assert(false); }
150 }
151
152 template
153 ArgleninoutT(Tr, Ta1)
154 {
155     Arglen1
156     ArgleninoutT(Tr function(inout Ta1) fn) { assert(false); }
157 }
158
159 template
160 ArgleninoutT(Tr, Ta1, Ta2)
161 {
162     Arglen2
163     ArgleninoutT(Tr function(inout Ta1, inout Ta2) fn) { assert(false); }
164 }
165
166 template
167 ArgleninoutT(Tr, Ta1, Ta2, Ta3)
168 {
169     Arglen3
170     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3) fn) { assert(false); }
171 }
172
173 template
174 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4)
175 {
176     Arglen4
177     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4) fn) { assert(false); }
178 }
179
180 template
181 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
182 {
183     Arglen5
184     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5) fn) { assert(false); }
185 }
186
187 template
188 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
189 {
190     Arglen6
191     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5, inout Ta6) fn) { assert(false); }
192 }
193
194 template
195 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
196 {
197     Arglen7
198     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5, inout Ta6, inout Ta7) fn) { assert(false); }
199 }
200
201 template
202 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
203 {
204     Arglen8
205     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5, inout Ta6, inout Ta7, inout Ta8) fn) { assert(false); }
206 }
207
208 template
209 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
210 {
211     Arglen9
212     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5, inout Ta6, inout Ta7, inout Ta8, inout Ta9) fn) { assert(false); }
213 }
214
215 template
216 ArgleninoutT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
217 {
218     Arglen10
219     ArgleninoutT(Tr function(inout Ta1, inout Ta2, inout Ta3, inout Ta4, inout Ta5, inout Ta6, inout Ta7, inout Ta8, inout Ta9, inout Ta10) fn) { assert(false); }
220 }
221
222 template
223 NumberOfArgsInoutT(Tf)
224 {
225     private Tf fptr;
226     alias typeof(ArgleninoutT(fptr)) type;
227 }
228
229 template
230 NumberOfArgsSwitchInoutT(Tf)
231 {
232     static if( is( typeof(*Tf) == function ) )
233         alias NumberOfArgsInoutT!(Tf).type type;
234     else static if( is( Tf U == delegate ) )
235         alias NumberOfArgsSwitchInoutT!(U*).type type;
236 }
237
238 public
239 template
240 NumberOfArgsInout(Tf)
241 {
242     const uint NumberOfArgsInout = ArglenConvT!(NumberOfArgsSwitchInoutT!(Tf).type);
243 }
244
245 template
246 ReturnTypeT(Tf)
247 {
248     private Tf fptr;
249     static if( is( typeof(*Tf) U == function ) )
250         alias U type;
251     else static if( is( Tf U == delegate ) )
252         alias ReturnType!(U*) type;
253     else
254         static assert(false, "ReturnType argument must be function pointer"
255                 " or delegate.");
256 }
257
258 /**
259  * This template will attempt to discern the return type of the supplied
260  * function pointer or delegate type.  It supports callables with a maximum of
261  * 10 arguments.
262  *
263  * Example:
264  * ----------------------------------------
265  * uint returnsANumber() { return 42; }
266  * alias ReturnType!(typeof(&returnsANumber)) RType; // RType == uint
267  * ----------------------------------------
268  */
269 public
270 template
271 ReturnType(Tf)
272 {
273     alias ReturnTypeT!(Tf).type ReturnType;
274 }
275
276 /* *** ArgType(Tf, n) *** */
277
278 template
279 Arg1TypeT(Tr, Ta1)
280 {
281     Ta1 Arg1TypeT(Tr function(Ta1) fn) { assert(false); }
282 }
283
284 template
285 Arg1TypeT(Tr, Ta1, Ta2)
286 {
287     Ta1 Arg1TypeT(Tr function(Ta1, Ta2) fn) { assert(false); }
288 }
289
290 template
291 Arg1TypeT(Tr, Ta1, Ta2, Ta3)
292 {
293     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3) fn) { assert(false); }
294 }
295
296 template
297 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4)
298 {
299     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4) fn) { assert(false); }
300 }
301
302 template
303 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
304 {
305     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
306 }
307
308 template
309 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
310 {
311     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
312 }
313
314 template
315 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
316 {
317     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
318 }
319
320 template
321 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
322 {
323     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
324 }
325
326 template
327 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
328 {
329     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
330 }
331
332 template
333 Arg1TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
334 {
335     Ta1 Arg1TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
336 }
337
338 template
339 Arg2TypeT(Tr, Ta1, Ta2)
340 {
341     Ta2 Arg2TypeT(Tr function(Ta1, Ta2) fn) { assert(false); }
342 }
343
344 template
345 Arg2TypeT(Tr, Ta1, Ta2, Ta3)
346 {
347     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3) fn) { assert(false); }
348 }
349
350 template
351 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4)
352 {
353     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4) fn) { assert(false); }
354 }
355
356 template
357 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
358 {
359     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
360 }
361
362 template
363 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
364 {
365     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
366 }
367
368 template
369 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
370 {
371     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
372 }
373
374 template
375 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
376 {
377     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
378 }
379
380 template
381 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
382 {
383     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
384 }
385
386 template
387 Arg2TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
388 {
389     Ta2 Arg2TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
390 }
391
392 template
393 Arg3TypeT(Tr, Ta1, Ta2, Ta3)
394 {
395     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3) fn) { assert(false); }
396 }
397
398 template
399 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4)
400 {
401     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4) fn) { assert(false); }
402 }
403
404 template
405 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
406 {
407     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
408 }
409
410 template
411 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
412 {
413     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
414 }
415
416 template
417 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
418 {
419     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
420 }
421
422 template
423 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
424 {
425     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
426 }
427
428 template
429 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
430 {
431     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
432 }
433
434 template
435 Arg3TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
436 {
437     Ta3 Arg3TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
438 }
439
440 template
441 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4)
442 {
443     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4) fn) { assert(false); }
444 }
445
446 template
447 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
448 {
449     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
450 }
451
452 template
453 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
454 {
455     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
456 }
457
458 template
459 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
460 {
461     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
462 }
463
464 template
465 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
466 {
467     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
468 }
469
470 template
471 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
472 {
473     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
474 }
475
476 template
477 Arg4TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
478 {
479     Ta4 Arg4TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
480 }
481
482 template
483 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5)
484 {
485     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5) fn) { assert(false); }
486 }
487
488 template
489 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
490 {
491     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
492 }
493
494 template
495 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
496 {
497     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
498 }
499
500 template
501 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
502 {
503     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
504 }
505
506 template
507 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
508 {
509     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
510 }
511
512 template
513 Arg5TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
514 {
515     Ta5 Arg5TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
516 }
517
518 template
519 Arg6TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6)
520 {
521     Ta6 Arg6TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6) fn) { assert(false); }
522 }
523
524 template
525 Arg6TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
526 {
527     Ta6 Arg6TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
528 }
529
530 template
531 Arg6TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
532 {
533     Ta6 Arg6TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
534 }
535
536 template
537 Arg6TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
538 {
539     Ta6 Arg6TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
540 }
541
542 template
543 Arg6TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
544 {
545     Ta6 Arg6TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
546 }
547
548 template
549 Arg7TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7)
550 {
551     Ta7 Arg7TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7) fn) { assert(false); }
552 }
553
554 template
555 Arg7TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
556 {
557     Ta7 Arg7TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
558 }
559
560 template
561 Arg7TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
562 {
563     Ta7 Arg7TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
564 }
565
566 template
567 Arg7TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
568 {
569     Ta7 Arg7TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
570 }
571
572 template
573 Arg8TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8)
574 {
575     Ta8 Arg8TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8) fn) { assert(false); }
576 }
577
578 template
579 Arg8TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
580 {
581     Ta8 Arg8TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
582 }
583
584 template
585 Arg8TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
586 {
587     Ta8 Arg8TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
588 }
589
590 template
591 Arg9TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9)
592 {
593     Ta9 Arg9TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9) fn) { assert(false); }
594 }
595
596 template
597 Arg9TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
598 {
599     Ta9 Arg9TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
600 }
601
602 template
603 Arg10TypeT(Tr, Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10)
604 {
605     Ta10 Arg10TypeT(Tr function(Ta1, Ta2, Ta3, Ta4, Ta5, Ta6, Ta7, Ta8, Ta9, Ta10) fn) { assert(false); }
606 }
607
608 template
609 ArgTypeT(Tf, uint n)
610 {
611     private Tf fptr;
612     static if( n == 1 )
613         alias typeof(Arg1TypeT(fptr)) type;
614     else static if( n == 2 )
615         alias typeof(Arg2TypeT(fptr)) type;
616     else static if( n == 3 )
617         alias typeof(Arg3TypeT(fptr)) type;
618     else static if( n == 4 )
619         alias typeof(Arg4TypeT(fptr)) type;
620     else static if( n == 5 )
621         alias typeof(Arg5TypeT(fptr)) type;
622     else static if( n == 6 )
623         alias typeof(Arg6TypeT(fptr)) type;
624     else static if( n == 7 )
625         alias typeof(Arg7TypeT(fptr)) type;
626     else static if( n == 8 )
627         alias typeof(Arg8TypeT(fptr)) type;
628     else static if( n == 9 )
629         alias typeof(Arg9TypeT(fptr)) type;
630     else static if( n == 10 )
631         alias typeof(Arg10TypeT(fptr)) type;
632     else
633         static assert(false,
634                 "Maximum of 10 arguments supported.");
635 }
636
637 template
638 ArgTypeSwitchT(Tf, uint n)
639 {
640     static if( is( typeof(*Tf) == function ) )
641         alias ArgTypeT!(Tf, n).type type;
642     else static if( is( Tf U == delegate ) )
643         alias ArgTypeSwitchT!(U*, n).type type;
644     else
645         static assert(false, "ArgType argument must be a function pointer"
646                 " or a delegate.");
647 }
648
649 /**
650  * This template will attempt to extract the type of the nth argument of the
651  * given function pointer or delegate type.  It supports callables with up to
652  * 10 arguments.
653  *
654  * Example:
655  * ----------------------------------------
656  * void intShortBool(int a, short b, bool c) {}
657  * alias ArgType!(typeof(&intShortBool), 2) TArg2; // TArg2 == short
658  * ----------------------------------------
659  */
660 public
661 template
662 ArgType(Tf, uint n)
663 {
664     alias ArgTypeSwitchT!(Tf, n).type ArgType;
665 }
666
667 /* *** Unit tests *** */
668
669 unittest
670 {
671     alias int function()                                    fn_0args;
672     alias byte[] function(char)                             fn_1arg;
673     alias float[dchar] function(int, int[])                 fn_2args;
674     alias void function(int, float[char[]], ifloat[byte])   fn_3args;
675
676     alias int[] delegate()                                  dg_0args;
677     alias real delegate(uint[])                             dg_1arg;
678     alias void delegate(char[][char[]], bool[short])        dg_2args;
679     alias dchar[wchar] delegate(byte, short, int)           dg_3args;
680
681     // ** Test NumberOfArgs(Tf) ** //
682
683     static assert( NumberOfArgs!(fn_0args) == 0 );
684     static assert( NumberOfArgs!(fn_1arg) == 1 );
685     static assert( NumberOfArgs!(fn_2args) == 2 );
686     static assert( NumberOfArgs!(fn_3args) == 3 );
687     static assert( NumberOfArgs!(dg_0args) == 0 );
688     static assert( NumberOfArgs!(dg_1arg) == 1 );
689     static assert( NumberOfArgs!(dg_2args) == 2 );
690     static assert( NumberOfArgs!(dg_3args) == 3 );
691
692     // ** Test ReturnType(Tf) ** //
693
694     static assert( is( ReturnType!(fn_0args) == int ) );
695     static assert( is( ReturnType!(fn_1arg) == byte[] ) );
696     static assert( is( ReturnType!(fn_2args) == float[dchar] ) );
697     static assert( is( ReturnType!(fn_3args) == void ) );
698     static assert( is( ReturnType!(dg_0args) == int[] ) );
699     static assert( is( ReturnType!(dg_1arg) == real ) );
700     static assert( is( ReturnType!(dg_2args) == void ) );
701     static assert( is( ReturnType!(dg_3args) == dchar[wchar] ) );
702
703     // ** Test ArgType(Tf, n) ** //
704
705     static assert( is( ArgType!(fn_1arg, 1) == char ) );
706     static assert( is( ArgType!(fn_2args, 2) == int[] ) );
707     static assert( is( ArgType!(fn_3args, 3) == ifloat[byte] ) );
708     static assert( is( ArgType!(dg_2args, 1) == char[][char[]] ) );
709     static assert( is( ArgType!(dg_3args, 1) == byte ) );
710     static assert( is( ArgType!(dg_3args, 2) == short ) );
711
712     pragma(msg, "ftype: passed static unit tests.");
713 }
Note: See TracBrowser for help on using the browser.