]> git.cworth.org Git - vogl/blob - src/extlib/loki/include/loki/TypeTraits.h
Initial vogl checkin
[vogl] / src / extlib / loki / include / loki / TypeTraits.h
1 ////////////////////////////////////////////////////////////////////////////////
2 // The Loki Library
3 // Copyright (c) 2001 by Andrei Alexandrescu
4 // This code accompanies the book:
5 // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
6 //     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
7 // Permission to use, copy, modify, distribute and sell this software for any
8 //     purpose is hereby granted without fee, provided that the above copyright
9 //     notice appear in all copies and that both that copyright notice and this
10 //     permission notice appear in supporting documentation.
11 // The author or Addison-Wesley Longman make no representations about the
12 //     suitability of this software for any purpose. It is provided "as is"
13 //     without express or implied warranty.
14 ////////////////////////////////////////////////////////////////////////////////
15 #ifndef LOKI_TYPETRAITS_INC_
16 #define LOKI_TYPETRAITS_INC_
17
18 // $Id: TypeTraits.h 835 2007-08-02 19:39:02Z syntheticpp $
19
20
21 #include "Typelist.h"
22 #include "Sequence.h"
23
24 #if (defined _MSC_VER) && (_MSC_VER < 1400)
25 #include <string>
26 #endif
27
28
29 #ifdef _MSC_VER
30 #pragma warning( push )
31 #pragma warning( disable : 4180 ) //qualifier applied to function type has no meaning; ignored
32 #endif
33
34 // Notes:
35 // unsigned ints = unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int
36 // signed ints = signed char, short int,int, long int, long long int
37 // integral = bool, char, wchar_t, or signed/unsigned ints
38
39 #define LOKI_IS_CONST_BIT                                       0
40 #define LOKI_IS_VOLATILE_BIT                            1
41 #define LOKI_IS_REFERENCE_BIT                   2
42 #define LOKI_IS_FUNCTION                                        3
43
44 #define LOKI_IS_FUNCTION_POINTER                4
45 #define LOKI_IS_MEMBER_FUNCTION_POINTER 5
46 #define LOKI_IS_MEMBER_POINTER                  6
47 #define LOKI_IS_POINTER                                         7
48
49 #define LOKI_IS_STD_UNSIGNED_INT                        8
50 #define LOKI_IS_STD_SIGNED_INT                  9
51 #define LOKI_IS_STD_INTEGRAL                            10
52 #define LOKI_IS_STD_FUNDAMENTAL                 11
53
54 #define LOKI_IS_UNSIGNED_INT                            12
55 #define LOKI_IS_SIGNED_INT                                      13
56 #define LOKI_IS_INTEGRAL                                        14
57 #define LOKI_IS_FLOAT                                           15
58
59 #define LOKI_IS_ARITH                                           16
60 #define LOKI_IS_FUNDAMENTAL                             17
61 #define LOKI_IS_SIGNED_LONG                             18
62 #define LOKI_IS_UNSIGNED_LONG                           19
63
64 #define LOKI_TYPE_BITMASK(x) (1U << (x))
65
66 namespace Loki
67 {
68 ////////////////////////////////////////////////////////////////////////////////
69 // class template IsCustomUnsignedInt
70 // Offers a means to integrate nonstandard built-in unsigned integral types
71 // (such as unsigned __int64 or unsigned long long int) with the TypeTraits
72 //     class template defined below.
73 // Invocation: IsCustomUnsignedInt<T> where T is any type
74 // Defines 'value', an enum that is 1 iff T is a custom built-in unsigned
75 //     integral type
76 // Specialize this class template for nonstandard unsigned integral types
77 //     and define value = 1 in those specializations
78 ////////////////////////////////////////////////////////////////////////////////
79
80 template <typename T>
81 struct IsCustomUnsignedInt
82 {
83         enum { value = 0 };
84 };
85
86 ////////////////////////////////////////////////////////////////////////////////
87 // class template IsCustomSignedInt
88 // Offers a means to integrate nonstandard built-in unsigned integral types
89 // (such as unsigned __int64 or unsigned long long int) with the TypeTraits
90 //     class template defined below.
91 // Invocation: IsCustomSignedInt<T> where T is any type
92 // Defines 'value', an enum that is 1 iff T is a custom built-in signed
93 //     integral type
94 // Specialize this class template for nonstandard unsigned integral types
95 //     and define value = 1 in those specializations
96 ////////////////////////////////////////////////////////////////////////////////
97
98 template <typename T>
99 struct IsCustomSignedInt
100 {
101         enum { value = 0 };
102 };
103
104 ////////////////////////////////////////////////////////////////////////////////
105 // class template IsCustomFloat
106 // Offers a means to integrate nonstandard floating point types with the
107 //     TypeTraits class template defined below.
108 // Invocation: IsCustomFloat<T> where T is any type
109 // Defines 'value', an enum that is 1 iff T is a custom built-in
110 //     floating point type
111 // Specialize this class template for nonstandard unsigned integral types
112 //     and define value = 1 in those specializations
113 ////////////////////////////////////////////////////////////////////////////////
114
115 template <typename T>
116 struct IsCustomFloat
117 {
118         enum { value = 0 };
119 };
120
121 ////////////////////////////////////////////////////////////////////////////////
122 // Helper types for class template TypeTraits defined below
123 ////////////////////////////////////////////////////////////////////////////////
124
125 namespace Private
126 {
127 #ifndef LOKI_DISABLE_TYPELIST_MACROS
128 typedef LOKI_TYPELIST_5(unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int) StdUnsignedInts;
129 typedef LOKI_TYPELIST_5(signed char, short int,int, long int, long long int) StdSignedInts;
130 typedef LOKI_TYPELIST_3(bool, char, wchar_t) StdOtherInts;
131 typedef LOKI_TYPELIST_3(float, double, long double) StdFloats;
132 typedef LOKI_TYPELIST_1(long) StdSignedLong;
133 typedef LOKI_TYPELIST_1(unsigned long) StdUnsignedLong;
134 #else
135 typedef Loki::Seq<unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int>::Type StdUnsignedInts;
136 typedef Loki::Seq<signed char, short int,int, long int, long long int>::Type StdSignedInts;
137 typedef Loki::Seq<bool, char, wchar_t>::Type StdOtherInts;
138 typedef Loki::Seq<float, double, long double>::Type StdFloats;
139 typedef Loki::Seq<long>::Type StdSignedLong;
140 typedef Loki::Seq<unsigned long>::Type StdUnsignedLong;
141 #endif
142 template <typename U> struct AddPointer
143 {
144         typedef U *Result;
145 };
146
147 template <typename U> struct AddPointer<U &>
148 {
149         typedef U *Result;
150 };
151
152 template <class U> struct AddReference
153 {
154         typedef U &Result;
155 };
156
157 template <class U> struct AddReference<U &>
158 {
159         typedef U &Result;
160 };
161
162 template <> struct AddReference<void>
163 {
164         typedef NullType Result;
165 };
166
167 template <class U> struct AddParameterType
168 {
169         typedef const U &Result;
170 };
171
172 template <class U> struct AddParameterType<U &>
173 {
174         typedef U &Result;
175 };
176
177 template <> struct AddParameterType<void>
178 {
179         typedef NullType Result;
180 };
181
182 template <typename T>
183 struct IsFunctionPointerRaw
184 {
185         enum {result = 0};
186 };
187
188 template <typename T>
189 struct IsFunctionPointerRaw<T( *)()>
190 {
191     enum {result = 1};
192 };
193
194 template <typename T,
195          typename P01>
196 struct IsFunctionPointerRaw<T( *)(P01)>
197 {
198     enum {result = 1};
199 };
200
201 template <typename T,
202          typename P01, typename P02>
203 struct IsFunctionPointerRaw<T( *)(
204     P01, P02)>
205 {
206     enum {result = 1};
207 };
208
209 template <typename T,
210          typename P01, typename P02, typename P03>
211 struct IsFunctionPointerRaw<T( *)(
212     P01, P02, P03)>
213 {
214     enum {result = 1};
215 };
216
217 template <typename T,
218          typename P01, typename P02, typename P03, typename P04>
219 struct IsFunctionPointerRaw<T( *)(
220     P01, P02, P03, P04)>
221 {
222     enum {result = 1};
223 };
224
225 template <typename T,
226          typename P01, typename P02, typename P03, typename P04, typename P05>
227 struct IsFunctionPointerRaw<T( *)(
228     P01, P02, P03, P04, P05)>
229 {
230     enum {result = 1};
231 };
232
233 template <typename T,
234          typename P01, typename P02, typename P03, typename P04, typename P05,
235          typename P06>
236 struct IsFunctionPointerRaw<T( *)(
237     P01, P02, P03, P04, P05,
238     P06)>
239 {
240     enum {result = 1};
241 };
242
243 template <typename T,
244          typename P01, typename P02, typename P03, typename P04, typename P05,
245          typename P06, typename P07>
246 struct IsFunctionPointerRaw<T( *)(
247     P01, P02, P03, P04, P05,
248     P06, P07)>
249 {
250     enum {result = 1};
251 };
252
253 template <typename T,
254          typename P01, typename P02, typename P03, typename P04, typename P05,
255          typename P06, typename P07, typename P08>
256 struct IsFunctionPointerRaw<T( *)(
257     P01, P02, P03, P04, P05,
258     P06, P07, P08)>
259 {
260     enum {result = 1};
261 };
262
263 template <typename T,
264          typename P01, typename P02, typename P03, typename P04, typename P05,
265          typename P06, typename P07, typename P08, typename P09>
266 struct IsFunctionPointerRaw<T( *)(
267     P01, P02, P03, P04, P05,
268     P06, P07, P08, P09)>
269 {
270     enum {result = 1};
271 };
272
273 template <typename T,
274          typename P01, typename P02, typename P03, typename P04, typename P05,
275          typename P06, typename P07, typename P08, typename P09, typename P10>
276 struct IsFunctionPointerRaw<T( *)(
277     P01, P02, P03, P04, P05,
278     P06, P07, P08, P09, P10)>
279 {
280     enum {result = 1};
281 };
282
283 template <typename T,
284          typename P01, typename P02, typename P03, typename P04, typename P05,
285          typename P06, typename P07, typename P08, typename P09, typename P10,
286          typename P11>
287 struct IsFunctionPointerRaw<T( *)(
288     P01, P02, P03, P04, P05,
289     P06, P07, P08, P09, P10,
290     P11)>
291 {
292     enum {result = 1};
293 };
294
295 template <typename T,
296          typename P01, typename P02, typename P03, typename P04, typename P05,
297          typename P06, typename P07, typename P08, typename P09, typename P10,
298          typename P11, typename P12>
299 struct IsFunctionPointerRaw<T( *)(
300     P01, P02, P03, P04, P05,
301     P06, P07, P08, P09, P10,
302     P11, P12)>
303 {
304     enum {result = 1};
305 };
306
307 template <typename T,
308          typename P01, typename P02, typename P03, typename P04, typename P05,
309          typename P06, typename P07, typename P08, typename P09, typename P10,
310          typename P11, typename P12, typename P13>
311 struct IsFunctionPointerRaw<T( *)(
312     P01, P02, P03, P04, P05,
313     P06, P07, P08, P09, P10,
314     P11, P12, P13)>
315 {
316     enum {result = 1};
317 };
318
319 template <typename T,
320          typename P01, typename P02, typename P03, typename P04, typename P05,
321          typename P06, typename P07, typename P08, typename P09, typename P10,
322          typename P11, typename P12, typename P13, typename P14>
323 struct IsFunctionPointerRaw<T( *)(
324     P01, P02, P03, P04, P05,
325     P06, P07, P08, P09, P10,
326     P11, P12, P13, P14)>
327 {
328     enum {result = 1};
329 };
330
331 template <typename T,
332          typename P01, typename P02, typename P03, typename P04, typename P05,
333          typename P06, typename P07, typename P08, typename P09, typename P10,
334          typename P11, typename P12, typename P13, typename P14, typename P15>
335 struct IsFunctionPointerRaw<T( *)(
336     P01, P02, P03, P04, P05,
337     P06, P07, P08, P09, P10,
338     P11, P12, P13, P14, P15)>
339 {
340     enum {result = 1};
341 };
342
343 template <typename T,
344          typename P01, typename P02, typename P03, typename P04, typename P05,
345          typename P06, typename P07, typename P08, typename P09, typename P10,
346          typename P11, typename P12, typename P13, typename P14, typename P15,
347          typename P16>
348 struct IsFunctionPointerRaw<T( *)(
349     P01, P02, P03, P04, P05,
350     P06, P07, P08, P09, P10,
351     P11, P12, P13, P14, P15,
352     P16)>
353 {
354     enum {result = 1};
355 };
356
357 template <typename T,
358          typename P01, typename P02, typename P03, typename P04, typename P05,
359          typename P06, typename P07, typename P08, typename P09, typename P10,
360          typename P11, typename P12, typename P13, typename P14, typename P15,
361          typename P16, typename P17>
362 struct IsFunctionPointerRaw<T( *)(
363     P01, P02, P03, P04, P05,
364     P06, P07, P08, P09, P10,
365     P11, P12, P13, P14, P15,
366     P16, P17)>
367 {
368     enum {result = 1};
369 };
370
371 template <typename T,
372          typename P01, typename P02, typename P03, typename P04, typename P05,
373          typename P06, typename P07, typename P08, typename P09, typename P10,
374          typename P11, typename P12, typename P13, typename P14, typename P15,
375          typename P16, typename P17, typename P18>
376 struct IsFunctionPointerRaw<T( *)(
377     P01, P02, P03, P04, P05,
378     P06, P07, P08, P09, P10,
379     P11, P12, P13, P14, P15,
380     P16, P17, P18)>
381 {
382     enum {result = 1};
383 };
384
385 template <typename T,
386          typename P01, typename P02, typename P03, typename P04, typename P05,
387          typename P06, typename P07, typename P08, typename P09, typename P10,
388          typename P11, typename P12, typename P13, typename P14, typename P15,
389          typename P16, typename P17, typename P18, typename P19>
390 struct IsFunctionPointerRaw<T( *)(
391     P01, P02, P03, P04, P05,
392     P06, P07, P08, P09, P10,
393     P11, P12, P13, P14, P15,
394     P16, P17, P18, P19)>
395 {
396     enum {result = 1};
397 };
398
399 template <typename T,
400          typename P01, typename P02, typename P03, typename P04, typename P05,
401          typename P06, typename P07, typename P08, typename P09, typename P10,
402          typename P11, typename P12, typename P13, typename P14, typename P15,
403          typename P16, typename P17, typename P18, typename P19, typename P20>
404 struct IsFunctionPointerRaw<T( *)(
405     P01, P02, P03, P04, P05,
406     P06, P07, P08, P09, P10,
407     P11, P12, P13, P14, P15,
408     P16, P17, P18, P19, P20)>
409 {
410     enum {result = 1};
411 };
412
413 template <typename T>
414 struct IsFunctionPointerRaw<T( *)(
415     ...)>
416 {
417     enum {result = 1};
418 };
419
420 template <typename T,
421          typename P01>
422 struct IsFunctionPointerRaw<T( *)(
423     P01, ...)>
424 {
425     enum {result = 1};
426 };
427
428 template <typename T,
429          typename P01, typename P02>
430 struct IsFunctionPointerRaw<T( *)(
431     P01, P02, ...)>
432 {
433     enum {result = 1};
434 };
435
436 template <typename T,
437          typename P01, typename P02, typename P03>
438 struct IsFunctionPointerRaw<T( *)(
439     P01, P02, P03, ...)>
440 {
441     enum {result = 1};
442 };
443
444 template <typename T,
445          typename P01, typename P02, typename P03, typename P04>
446 struct IsFunctionPointerRaw<T( *)(
447     P01, P02, P03, P04, ...)>
448 {
449     enum {result = 1};
450 };
451
452 template <typename T,
453          typename P01, typename P02, typename P03, typename P04, typename P05>
454 struct IsFunctionPointerRaw<T( *)(
455     P01, P02, P03, P04, P05,
456     ...)>
457 {
458     enum {result = 1};
459 };
460
461 template <typename T,
462          typename P01, typename P02, typename P03, typename P04, typename P05,
463          typename P06>
464 struct IsFunctionPointerRaw<T( *)(
465     P01, P02, P03, P04, P05,
466     P06, ...)>
467 {
468     enum {result = 1};
469 };
470
471 template <typename T,
472          typename P01, typename P02, typename P03, typename P04, typename P05,
473          typename P06, typename P07>
474 struct IsFunctionPointerRaw<T( *)(
475     P01, P02, P03, P04, P05,
476     P06, P07, ...)>
477 {
478     enum {result = 1};
479 };
480
481 template <typename T,
482          typename P01, typename P02, typename P03, typename P04, typename P05,
483          typename P06, typename P07, typename P08>
484 struct IsFunctionPointerRaw<T( *)(
485     P01, P02, P03, P04, P05,
486     P06, P07, P08, ...)>
487 {
488     enum {result = 1};
489 };
490
491 template <typename T,
492          typename P01, typename P02, typename P03, typename P04, typename P05,
493          typename P06, typename P07, typename P08, typename P09>
494 struct IsFunctionPointerRaw<T( *)(
495     P01, P02, P03, P04, P05,
496     P06, P07, P08, P09, ...)>
497 {
498     enum {result = 1};
499 };
500
501 template <typename T,
502          typename P01, typename P02, typename P03, typename P04, typename P05,
503          typename P06, typename P07, typename P08, typename P09, typename P10>
504 struct IsFunctionPointerRaw<T( *)(
505     P01, P02, P03, P04, P05,
506     P06, P07, P08, P09, P10,
507     ...)>
508 {
509     enum {result = 1};
510 };
511
512 template <typename T,
513          typename P01, typename P02, typename P03, typename P04, typename P05,
514          typename P06, typename P07, typename P08, typename P09, typename P10,
515          typename P11>
516 struct IsFunctionPointerRaw<T( *)(
517     P01, P02, P03, P04, P05,
518     P06, P07, P08, P09, P10,
519     P11, ...)>
520 {
521     enum {result = 1};
522 };
523
524 template <typename T,
525          typename P01, typename P02, typename P03, typename P04, typename P05,
526          typename P06, typename P07, typename P08, typename P09, typename P10,
527          typename P11, typename P12>
528 struct IsFunctionPointerRaw<T( *)(
529     P01, P02, P03, P04, P05,
530     P06, P07, P08, P09, P10,
531     P11, P12, ...)>
532 {
533     enum {result = 1};
534 };
535
536 template <typename T,
537          typename P01, typename P02, typename P03, typename P04, typename P05,
538          typename P06, typename P07, typename P08, typename P09, typename P10,
539          typename P11, typename P12, typename P13>
540 struct IsFunctionPointerRaw<T( *)(
541     P01, P02, P03, P04, P05,
542     P06, P07, P08, P09, P10,
543     P11, P12, P13, ...)>
544 {
545     enum {result = 1};
546 };
547
548 template <typename T,
549          typename P01, typename P02, typename P03, typename P04, typename P05,
550          typename P06, typename P07, typename P08, typename P09, typename P10,
551          typename P11, typename P12, typename P13, typename P14>
552 struct IsFunctionPointerRaw<T( *)(
553     P01, P02, P03, P04, P05,
554     P06, P07, P08, P09, P10,
555     P11, P12, P13, P14, ...)>
556 {
557     enum {result = 1};
558 };
559
560 template <typename T,
561          typename P01, typename P02, typename P03, typename P04, typename P05,
562          typename P06, typename P07, typename P08, typename P09, typename P10,
563          typename P11, typename P12, typename P13, typename P14, typename P15>
564 struct IsFunctionPointerRaw<T( *)(
565     P01, P02, P03, P04, P05,
566     P06, P07, P08, P09, P10,
567     P11, P12, P13, P14, P15,
568     ...)>
569 {
570     enum {result = 1};
571 };
572
573 template <typename T,
574          typename P01, typename P02, typename P03, typename P04, typename P05,
575          typename P06, typename P07, typename P08, typename P09, typename P10,
576          typename P11, typename P12, typename P13, typename P14, typename P15,
577          typename P16>
578 struct IsFunctionPointerRaw<T( *)(
579     P01, P02, P03, P04, P05,
580     P06, P07, P08, P09, P10,
581     P11, P12, P13, P14, P15,
582     P16, ...)>
583 {
584     enum {result = 1};
585 };
586
587 template <typename T,
588          typename P01, typename P02, typename P03, typename P04, typename P05,
589          typename P06, typename P07, typename P08, typename P09, typename P10,
590          typename P11, typename P12, typename P13, typename P14, typename P15,
591          typename P16, typename P17>
592 struct IsFunctionPointerRaw<T( *)(
593     P01, P02, P03, P04, P05,
594     P06, P07, P08, P09, P10,
595     P11, P12, P13, P14, P15,
596     P16, P17, ...)>
597 {
598     enum {result = 1};
599 };
600
601 template <typename T,
602          typename P01, typename P02, typename P03, typename P04, typename P05,
603          typename P06, typename P07, typename P08, typename P09, typename P10,
604          typename P11, typename P12, typename P13, typename P14, typename P15,
605          typename P16, typename P17, typename P18>
606 struct IsFunctionPointerRaw<T( *)(
607     P01, P02, P03, P04, P05,
608     P06, P07, P08, P09, P10,
609     P11, P12, P13, P14, P15,
610     P16, P17, P18, ...)>
611 {
612     enum {result = 1};
613 };
614
615 template <typename T,
616          typename P01, typename P02, typename P03, typename P04, typename P05,
617          typename P06, typename P07, typename P08, typename P09, typename P10,
618          typename P11, typename P12, typename P13, typename P14, typename P15,
619          typename P16, typename P17, typename P18, typename P19>
620 struct IsFunctionPointerRaw<T( *)(
621     P01, P02, P03, P04, P05,
622     P06, P07, P08, P09, P10,
623     P11, P12, P13, P14, P15,
624     P16, P17, P18, P19, ...)>
625 {
626     enum {result = 1};
627 };
628
629 template <typename T,
630          typename P01, typename P02, typename P03, typename P04, typename P05,
631          typename P06, typename P07, typename P08, typename P09, typename P10,
632          typename P11, typename P12, typename P13, typename P14, typename P15,
633          typename P16, typename P17, typename P18, typename P19, typename P20>
634 struct IsFunctionPointerRaw<T( *)(
635     P01, P02, P03, P04, P05,
636     P06, P07, P08, P09, P10,
637     P11, P12, P13, P14, P15,
638     P16, P17, P18, P19, P20,
639     ...)>
640 {
641     enum {result = 1};
642 };
643
644
645 template <typename T>
646 struct IsMemberFunctionPointerRaw
647 {
648         enum {result = 0};
649 };
650
651 template <typename T, typename S>
652 struct IsMemberFunctionPointerRaw<T (S:: *)()>
653 {
654     enum {result = 1};
655 };
656
657 template <typename T, typename S,
658          typename P01>
659 struct IsMemberFunctionPointerRaw<T (S:: *)(P01)>
660 {
661     enum {result = 1};
662 };
663
664 template <typename T, typename S,
665          typename P01, typename P02>
666 struct IsMemberFunctionPointerRaw<T (S:: *)(
667     P01, P02)>
668 {
669     enum {result = 1};
670 };
671
672 template <typename T, typename S,
673          typename P01, typename P02, typename P03>
674 struct IsMemberFunctionPointerRaw<T (S:: *)(
675     P01, P02, P03)>
676 {
677     enum {result = 1};
678 };
679
680 template <typename T, typename S,
681          typename P01, typename P02, typename P03, typename P04>
682 struct IsMemberFunctionPointerRaw<T (S:: *)(
683     P01, P02, P03, P04)>
684 {
685     enum {result = 1};
686 };
687
688 template <typename T, typename S,
689          typename P01, typename P02, typename P03, typename P04, typename P05>
690 struct IsMemberFunctionPointerRaw<T (S:: *)(
691     P01, P02, P03, P04, P05)>
692 {
693     enum {result = 1};
694 };
695
696 template <typename T, typename S,
697          typename P01, typename P02, typename P03, typename P04, typename P05,
698          typename P06>
699 struct IsMemberFunctionPointerRaw<T (S:: *)(
700     P01, P02, P03, P04, P05,
701     P06)>
702 {
703     enum {result = 1};
704 };
705
706 template <typename T, typename S,
707          typename P01, typename P02, typename P03, typename P04, typename P05,
708          typename P06, typename P07>
709 struct IsMemberFunctionPointerRaw<T (S:: *)(
710     P01, P02, P03, P04, P05,
711     P06, P07)>
712 {
713     enum {result = 1};
714 };
715
716 template <typename T, typename S,
717          typename P01, typename P02, typename P03, typename P04, typename P05,
718          typename P06, typename P07, typename P08>
719 struct IsMemberFunctionPointerRaw<T (S:: *)(
720     P01, P02, P03, P04, P05,
721     P06, P07, P08)>
722 {
723     enum {result = 1};
724 };
725
726 template <typename T, typename S,
727          typename P01, typename P02, typename P03, typename P04, typename P05,
728          typename P06, typename P07, typename P08, typename P09>
729 struct IsMemberFunctionPointerRaw<T (S:: *)(
730     P01, P02, P03, P04, P05,
731     P06, P07, P08, P09)>
732 {
733     enum {result = 1};
734 };
735
736 template <typename T, typename S,
737          typename P01, typename P02, typename P03, typename P04, typename P05,
738          typename P06, typename P07, typename P08, typename P09, typename P10>
739 struct IsMemberFunctionPointerRaw<T (S:: *)(
740     P01, P02, P03, P04, P05,
741     P06, P07, P08, P09, P10)>
742 {
743     enum {result = 1};
744 };
745
746 template <typename T, typename S,
747          typename P01, typename P02, typename P03, typename P04, typename P05,
748          typename P06, typename P07, typename P08, typename P09, typename P10,
749          typename P11>
750 struct IsMemberFunctionPointerRaw<T (S:: *)(
751     P01, P02, P03, P04, P05,
752     P06, P07, P08, P09, P10,
753     P11)>
754 {
755     enum {result = 1};
756 };
757
758 template <typename T, typename S,
759          typename P01, typename P02, typename P03, typename P04, typename P05,
760          typename P06, typename P07, typename P08, typename P09, typename P10,
761          typename P11, typename P12>
762 struct IsMemberFunctionPointerRaw<T (S:: *)(
763     P01, P02, P03, P04, P05,
764     P06, P07, P08, P09, P10,
765     P11, P12)>
766 {
767     enum {result = 1};
768 };
769
770 template <typename T, typename S,
771          typename P01, typename P02, typename P03, typename P04, typename P05,
772          typename P06, typename P07, typename P08, typename P09, typename P10,
773          typename P11, typename P12, typename P13>
774 struct IsMemberFunctionPointerRaw<T (S:: *)(
775     P01, P02, P03, P04, P05,
776     P06, P07, P08, P09, P10,
777     P11, P12, P13)>
778 {
779     enum {result = 1};
780 };
781
782 template <typename T, typename S,
783          typename P01, typename P02, typename P03, typename P04, typename P05,
784          typename P06, typename P07, typename P08, typename P09, typename P10,
785          typename P11, typename P12, typename P13, typename P14>
786 struct IsMemberFunctionPointerRaw<T (S:: *)(
787     P01, P02, P03, P04, P05,
788     P06, P07, P08, P09, P10,
789     P11, P12, P13, P14)>
790 {
791     enum {result = 1};
792 };
793
794 template <typename T, typename S,
795          typename P01, typename P02, typename P03, typename P04, typename P05,
796          typename P06, typename P07, typename P08, typename P09, typename P10,
797          typename P11, typename P12, typename P13, typename P14, typename P15>
798 struct IsMemberFunctionPointerRaw<T (S:: *)(
799     P01, P02, P03, P04, P05,
800     P06, P07, P08, P09, P10,
801     P11, P12, P13, P14, P15)>
802 {
803     enum {result = 1};
804 };
805
806 template <typename T, typename S,
807          typename P01, typename P02, typename P03, typename P04, typename P05,
808          typename P06, typename P07, typename P08, typename P09, typename P10,
809          typename P11, typename P12, typename P13, typename P14, typename P15,
810          typename P16>
811 struct IsMemberFunctionPointerRaw<T (S:: *)(
812     P01, P02, P03, P04, P05,
813     P06, P07, P08, P09, P10,
814     P11, P12, P13, P14, P15,
815     P16)>
816 {
817     enum {result = 1};
818 };
819
820 template <typename T, typename S,
821          typename P01, typename P02, typename P03, typename P04, typename P05,
822          typename P06, typename P07, typename P08, typename P09, typename P10,
823          typename P11, typename P12, typename P13, typename P14, typename P15,
824          typename P16, typename P17>
825 struct IsMemberFunctionPointerRaw<T (S:: *)(
826     P01, P02, P03, P04, P05,
827     P06, P07, P08, P09, P10,
828     P11, P12, P13, P14, P15,
829     P16, P17)>
830 {
831     enum {result = 1};
832 };
833
834 template <typename T, typename S,
835          typename P01, typename P02, typename P03, typename P04, typename P05,
836          typename P06, typename P07, typename P08, typename P09, typename P10,
837          typename P11, typename P12, typename P13, typename P14, typename P15,
838          typename P16, typename P17, typename P18>
839 struct IsMemberFunctionPointerRaw<T (S:: *)(
840     P01, P02, P03, P04, P05,
841     P06, P07, P08, P09, P10,
842     P11, P12, P13, P14, P15,
843     P16, P17, P18)>
844 {
845     enum {result = 1};
846 };
847
848 template <typename T, typename S,
849          typename P01, typename P02, typename P03, typename P04, typename P05,
850          typename P06, typename P07, typename P08, typename P09, typename P10,
851          typename P11, typename P12, typename P13, typename P14, typename P15,
852          typename P16, typename P17, typename P18, typename P19>
853 struct IsMemberFunctionPointerRaw<T (S:: *)(
854     P01, P02, P03, P04, P05,
855     P06, P07, P08, P09, P10,
856     P11, P12, P13, P14, P15,
857     P16, P17, P18, P19)>
858 {
859     enum {result = 1};
860 };
861
862 template <typename T, typename S,
863          typename P01, typename P02, typename P03, typename P04, typename P05,
864          typename P06, typename P07, typename P08, typename P09, typename P10,
865          typename P11, typename P12, typename P13, typename P14, typename P15,
866          typename P16, typename P17, typename P18, typename P19, typename P20>
867 struct IsMemberFunctionPointerRaw<T (S:: *)(
868     P01, P02, P03, P04, P05,
869     P06, P07, P08, P09, P10,
870     P11, P12, P13, P14, P15,
871     P16, P17, P18, P19, P20)>
872 {
873     enum {result = 1};
874 };
875
876 template <typename T, typename S>
877 struct IsMemberFunctionPointerRaw<T (S:: *)(
878     ...)>
879 {
880     enum {result = 1};
881 };
882
883 template <typename T, typename S,
884          typename P01>
885 struct IsMemberFunctionPointerRaw<T (S:: *)(
886     P01, ...)>
887 {
888     enum {result = 1};
889 };
890
891 template <typename T, typename S,
892          typename P01, typename P02>
893 struct IsMemberFunctionPointerRaw<T (S:: *)(
894     P01, P02, ...)>
895 {
896     enum {result = 1};
897 };
898
899 template <typename T, typename S,
900          typename P01, typename P02, typename P03>
901 struct IsMemberFunctionPointerRaw<T (S:: *)(
902     P01, P02, P03, ...)>
903 {
904     enum {result = 1};
905 };
906
907 template <typename T, typename S,
908          typename P01, typename P02, typename P03, typename P04>
909 struct IsMemberFunctionPointerRaw<T (S:: *)(
910     P01, P02, P03, P04, ...)>
911 {
912     enum {result = 1};
913 };
914
915 template <typename T, typename S,
916          typename P01, typename P02, typename P03, typename P04, typename P05>
917 struct IsMemberFunctionPointerRaw<T (S:: *)(
918     P01, P02, P03, P04, P05,
919     ...)>
920 {
921     enum {result = 1};
922 };
923
924 template <typename T, typename S,
925          typename P01, typename P02, typename P03, typename P04, typename P05,
926          typename P06>
927 struct IsMemberFunctionPointerRaw<T (S:: *)(
928     P01, P02, P03, P04, P05,
929     P06, ...)>
930 {
931     enum {result = 1};
932 };
933
934 template <typename T, typename S,
935          typename P01, typename P02, typename P03, typename P04, typename P05,
936          typename P06, typename P07>
937 struct IsMemberFunctionPointerRaw<T (S:: *)(
938     P01, P02, P03, P04, P05,
939     P06, P07, ...)>
940 {
941     enum {result = 1};
942 };
943
944 template <typename T, typename S,
945          typename P01, typename P02, typename P03, typename P04, typename P05,
946          typename P06, typename P07, typename P08>
947 struct IsMemberFunctionPointerRaw<T (S:: *)(
948     P01, P02, P03, P04, P05,
949     P06, P07, P08, ...)>
950 {
951     enum {result = 1};
952 };
953
954 template <typename T, typename S,
955          typename P01, typename P02, typename P03, typename P04, typename P05,
956          typename P06, typename P07, typename P08, typename P09>
957 struct IsMemberFunctionPointerRaw<T (S:: *)(
958     P01, P02, P03, P04, P05,
959     P06, P07, P08, P09, ...)>
960 {
961     enum {result = 1};
962 };
963
964 template <typename T, typename S,
965          typename P01, typename P02, typename P03, typename P04, typename P05,
966          typename P06, typename P07, typename P08, typename P09, typename P10>
967 struct IsMemberFunctionPointerRaw<T (S:: *)(
968     P01, P02, P03, P04, P05,
969     P06, P07, P08, P09, P10,
970     ...)>
971 {
972     enum {result = 1};
973 };
974
975 template <typename T, typename S,
976          typename P01, typename P02, typename P03, typename P04, typename P05,
977          typename P06, typename P07, typename P08, typename P09, typename P10,
978          typename P11>
979 struct IsMemberFunctionPointerRaw<T (S:: *)(
980     P01, P02, P03, P04, P05,
981     P06, P07, P08, P09, P10,
982     P11, ...)>
983 {
984     enum {result = 1};
985 };
986
987 template <typename T, typename S,
988          typename P01, typename P02, typename P03, typename P04, typename P05,
989          typename P06, typename P07, typename P08, typename P09, typename P10,
990          typename P11, typename P12>
991 struct IsMemberFunctionPointerRaw<T (S:: *)(
992     P01, P02, P03, P04, P05,
993     P06, P07, P08, P09, P10,
994     P11, P12, ...)>
995 {
996     enum {result = 1};
997 };
998
999 template <typename T, typename S,
1000          typename P01, typename P02, typename P03, typename P04, typename P05,
1001          typename P06, typename P07, typename P08, typename P09, typename P10,
1002          typename P11, typename P12, typename P13>
1003 struct IsMemberFunctionPointerRaw<T (S:: *)(
1004     P01, P02, P03, P04, P05,
1005     P06, P07, P08, P09, P10,
1006     P11, P12, P13, ...)>
1007 {
1008     enum {result = 1};
1009 };
1010
1011 template <typename T, typename S,
1012          typename P01, typename P02, typename P03, typename P04, typename P05,
1013          typename P06, typename P07, typename P08, typename P09, typename P10,
1014          typename P11, typename P12, typename P13, typename P14>
1015 struct IsMemberFunctionPointerRaw<T (S:: *)(
1016     P01, P02, P03, P04, P05,
1017     P06, P07, P08, P09, P10,
1018     P11, P12, P13, P14, ...)>
1019 {
1020     enum {result = 1};
1021 };
1022
1023 template <typename T, typename S,
1024          typename P01, typename P02, typename P03, typename P04, typename P05,
1025          typename P06, typename P07, typename P08, typename P09, typename P10,
1026          typename P11, typename P12, typename P13, typename P14, typename P15>
1027 struct IsMemberFunctionPointerRaw<T (S:: *)(
1028     P01, P02, P03, P04, P05,
1029     P06, P07, P08, P09, P10,
1030     P11, P12, P13, P14, P15,
1031     ...)>
1032 {
1033     enum {result = 1};
1034 };
1035
1036 template <typename T, typename S,
1037          typename P01, typename P02, typename P03, typename P04, typename P05,
1038          typename P06, typename P07, typename P08, typename P09, typename P10,
1039          typename P11, typename P12, typename P13, typename P14, typename P15,
1040          typename P16>
1041 struct IsMemberFunctionPointerRaw<T (S:: *)(
1042     P01, P02, P03, P04, P05,
1043     P06, P07, P08, P09, P10,
1044     P11, P12, P13, P14, P15,
1045     P16, ...)>
1046 {
1047     enum {result = 1};
1048 };
1049
1050 template <typename T, typename S,
1051          typename P01, typename P02, typename P03, typename P04, typename P05,
1052          typename P06, typename P07, typename P08, typename P09, typename P10,
1053          typename P11, typename P12, typename P13, typename P14, typename P15,
1054          typename P16, typename P17>
1055 struct IsMemberFunctionPointerRaw<T (S:: *)(
1056     P01, P02, P03, P04, P05,
1057     P06, P07, P08, P09, P10,
1058     P11, P12, P13, P14, P15,
1059     P16, P17, ...)>
1060 {
1061     enum {result = 1};
1062 };
1063
1064 template <typename T, typename S,
1065          typename P01, typename P02, typename P03, typename P04, typename P05,
1066          typename P06, typename P07, typename P08, typename P09, typename P10,
1067          typename P11, typename P12, typename P13, typename P14, typename P15,
1068          typename P16, typename P17, typename P18>
1069 struct IsMemberFunctionPointerRaw<T (S:: *)(
1070     P01, P02, P03, P04, P05,
1071     P06, P07, P08, P09, P10,
1072     P11, P12, P13, P14, P15,
1073     P16, P17, P18, ...)>
1074 {
1075     enum {result = 1};
1076 };
1077
1078 template <typename T, typename S,
1079          typename P01, typename P02, typename P03, typename P04, typename P05,
1080          typename P06, typename P07, typename P08, typename P09, typename P10,
1081          typename P11, typename P12, typename P13, typename P14, typename P15,
1082          typename P16, typename P17, typename P18, typename P19>
1083 struct IsMemberFunctionPointerRaw<T (S:: *)(
1084     P01, P02, P03, P04, P05,
1085     P06, P07, P08, P09, P10,
1086     P11, P12, P13, P14, P15,
1087     P16, P17, P18, P19, ...)>
1088 {
1089     enum {result = 1};
1090 };
1091
1092 template <typename T, typename S,
1093          typename P01, typename P02, typename P03, typename P04, typename P05,
1094          typename P06, typename P07, typename P08, typename P09, typename P10,
1095          typename P11, typename P12, typename P13, typename P14, typename P15,
1096          typename P16, typename P17, typename P18, typename P19, typename P20>
1097 struct IsMemberFunctionPointerRaw<T (S:: *)(
1098     P01, P02, P03, P04, P05,
1099     P06, P07, P08, P09, P10,
1100     P11, P12, P13, P14, P15,
1101     P16, P17, P18, P19, P20,
1102     ...)>
1103 {
1104     enum {result = 1};
1105 };
1106
1107 // Const versions
1108
1109 template <typename T, typename S>
1110 struct IsMemberFunctionPointerRaw<T (S:: *)() const>
1111 {
1112     enum {result = 1};
1113 };
1114
1115 template <typename T, typename S,
1116          typename P01>
1117 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) const>
1118 {
1119     enum {result = 1};
1120 };
1121
1122 template <typename T, typename S,
1123          typename P01, typename P02>
1124 struct IsMemberFunctionPointerRaw<T (S:: *)(
1125     P01, P02) const>
1126 {
1127     enum {result = 1};
1128 };
1129
1130 template <typename T, typename S,
1131          typename P01, typename P02, typename P03>
1132 struct IsMemberFunctionPointerRaw<T (S:: *)(
1133     P01, P02, P03) const>
1134 {
1135     enum {result = 1};
1136 };
1137
1138 template <typename T, typename S,
1139          typename P01, typename P02, typename P03, typename P04>
1140 struct IsMemberFunctionPointerRaw<T (S:: *)(
1141     P01, P02, P03, P04) const>
1142 {
1143     enum {result = 1};
1144 };
1145
1146 template <typename T, typename S,
1147          typename P01, typename P02, typename P03, typename P04, typename P05>
1148 struct IsMemberFunctionPointerRaw<T (S:: *)(
1149     P01, P02, P03, P04, P05) const>
1150 {
1151     enum {result = 1};
1152 };
1153
1154 template <typename T, typename S,
1155          typename P01, typename P02, typename P03, typename P04, typename P05,
1156          typename P06>
1157 struct IsMemberFunctionPointerRaw<T (S:: *)(
1158     P01, P02, P03, P04, P05,
1159     P06) const>
1160 {
1161     enum {result = 1};
1162 };
1163
1164 template <typename T, typename S,
1165          typename P01, typename P02, typename P03, typename P04, typename P05,
1166          typename P06, typename P07>
1167 struct IsMemberFunctionPointerRaw<T (S:: *)(
1168     P01, P02, P03, P04, P05,
1169     P06, P07) const>
1170 {
1171     enum {result = 1};
1172 };
1173
1174 template <typename T, typename S,
1175          typename P01, typename P02, typename P03, typename P04, typename P05,
1176          typename P06, typename P07, typename P08>
1177 struct IsMemberFunctionPointerRaw<T (S:: *)(
1178     P01, P02, P03, P04, P05,
1179     P06, P07, P08) const>
1180 {
1181     enum {result = 1};
1182 };
1183
1184 template <typename T, typename S,
1185          typename P01, typename P02, typename P03, typename P04, typename P05,
1186          typename P06, typename P07, typename P08, typename P09>
1187 struct IsMemberFunctionPointerRaw<T (S:: *)(
1188     P01, P02, P03, P04, P05,
1189     P06, P07, P08, P09) const>
1190 {
1191     enum {result = 1};
1192 };
1193
1194 template <typename T, typename S,
1195          typename P01, typename P02, typename P03, typename P04, typename P05,
1196          typename P06, typename P07, typename P08, typename P09, typename P10>
1197 struct IsMemberFunctionPointerRaw<T (S:: *)(
1198     P01, P02, P03, P04, P05,
1199     P06, P07, P08, P09, P10) const>
1200 {
1201     enum {result = 1};
1202 };
1203
1204 template <typename T, typename S,
1205          typename P01, typename P02, typename P03, typename P04, typename P05,
1206          typename P06, typename P07, typename P08, typename P09, typename P10,
1207          typename P11>
1208 struct IsMemberFunctionPointerRaw<T (S:: *)(
1209     P01, P02, P03, P04, P05,
1210     P06, P07, P08, P09, P10,
1211     P11) const>
1212 {
1213     enum {result = 1};
1214 };
1215
1216 template <typename T, typename S,
1217          typename P01, typename P02, typename P03, typename P04, typename P05,
1218          typename P06, typename P07, typename P08, typename P09, typename P10,
1219          typename P11, typename P12>
1220 struct IsMemberFunctionPointerRaw<T (S:: *)(
1221     P01, P02, P03, P04, P05,
1222     P06, P07, P08, P09, P10,
1223     P11, P12) const>
1224 {
1225     enum {result = 1};
1226 };
1227
1228 template <typename T, typename S,
1229          typename P01, typename P02, typename P03, typename P04, typename P05,
1230          typename P06, typename P07, typename P08, typename P09, typename P10,
1231          typename P11, typename P12, typename P13>
1232 struct IsMemberFunctionPointerRaw<T (S:: *)(
1233     P01, P02, P03, P04, P05,
1234     P06, P07, P08, P09, P10,
1235     P11, P12, P13) const>
1236 {
1237     enum {result = 1};
1238 };
1239
1240 template <typename T, typename S,
1241          typename P01, typename P02, typename P03, typename P04, typename P05,
1242          typename P06, typename P07, typename P08, typename P09, typename P10,
1243          typename P11, typename P12, typename P13, typename P14>
1244 struct IsMemberFunctionPointerRaw<T (S:: *)(
1245     P01, P02, P03, P04, P05,
1246     P06, P07, P08, P09, P10,
1247     P11, P12, P13, P14) const>
1248 {
1249     enum {result = 1};
1250 };
1251
1252 template <typename T, typename S,
1253          typename P01, typename P02, typename P03, typename P04, typename P05,
1254          typename P06, typename P07, typename P08, typename P09, typename P10,
1255          typename P11, typename P12, typename P13, typename P14, typename P15>
1256 struct IsMemberFunctionPointerRaw<T (S:: *)(
1257     P01, P02, P03, P04, P05,
1258     P06, P07, P08, P09, P10,
1259     P11, P12, P13, P14, P15) const>
1260 {
1261     enum {result = 1};
1262 };
1263
1264 template <typename T, typename S,
1265          typename P01, typename P02, typename P03, typename P04, typename P05,
1266          typename P06, typename P07, typename P08, typename P09, typename P10,
1267          typename P11, typename P12, typename P13, typename P14, typename P15,
1268          typename P16>
1269 struct IsMemberFunctionPointerRaw<T (S:: *)(
1270     P01, P02, P03, P04, P05,
1271     P06, P07, P08, P09, P10,
1272     P11, P12, P13, P14, P15,
1273     P16) const>
1274 {
1275     enum {result = 1};
1276 };
1277
1278 template <typename T, typename S,
1279          typename P01, typename P02, typename P03, typename P04, typename P05,
1280          typename P06, typename P07, typename P08, typename P09, typename P10,
1281          typename P11, typename P12, typename P13, typename P14, typename P15,
1282          typename P16, typename P17>
1283 struct IsMemberFunctionPointerRaw<T (S:: *)(
1284     P01, P02, P03, P04, P05,
1285     P06, P07, P08, P09, P10,
1286     P11, P12, P13, P14, P15,
1287     P16, P17) const>
1288 {
1289     enum {result = 1};
1290 };
1291
1292 template <typename T, typename S,
1293          typename P01, typename P02, typename P03, typename P04, typename P05,
1294          typename P06, typename P07, typename P08, typename P09, typename P10,
1295          typename P11, typename P12, typename P13, typename P14, typename P15,
1296          typename P16, typename P17, typename P18>
1297 struct IsMemberFunctionPointerRaw<T (S:: *)(
1298     P01, P02, P03, P04, P05,
1299     P06, P07, P08, P09, P10,
1300     P11, P12, P13, P14, P15,
1301     P16, P17, P18) const>
1302 {
1303     enum {result = 1};
1304 };
1305
1306 template <typename T, typename S,
1307          typename P01, typename P02, typename P03, typename P04, typename P05,
1308          typename P06, typename P07, typename P08, typename P09, typename P10,
1309          typename P11, typename P12, typename P13, typename P14, typename P15,
1310          typename P16, typename P17, typename P18, typename P19>
1311 struct IsMemberFunctionPointerRaw<T (S:: *)(
1312     P01, P02, P03, P04, P05,
1313     P06, P07, P08, P09, P10,
1314     P11, P12, P13, P14, P15,
1315     P16, P17, P18, P19) const>
1316 {
1317     enum {result = 1};
1318 };
1319
1320 template <typename T, typename S,
1321          typename P01, typename P02, typename P03, typename P04, typename P05,
1322          typename P06, typename P07, typename P08, typename P09, typename P10,
1323          typename P11, typename P12, typename P13, typename P14, typename P15,
1324          typename P16, typename P17, typename P18, typename P19, typename P20>
1325 struct IsMemberFunctionPointerRaw<T (S:: *)(
1326     P01, P02, P03, P04, P05,
1327     P06, P07, P08, P09, P10,
1328     P11, P12, P13, P14, P15,
1329     P16, P17, P18, P19, P20) const>
1330 {
1331     enum {result = 1};
1332 };
1333
1334 template <typename T, typename S>
1335 struct IsMemberFunctionPointerRaw<T (S:: *)(
1336     ...) const>
1337 {
1338     enum {result = 1};
1339 };
1340
1341 template <typename T, typename S,
1342          typename P01>
1343 struct IsMemberFunctionPointerRaw<T (S:: *)(
1344     P01, ...) const>
1345 {
1346     enum {result = 1};
1347 };
1348
1349 template <typename T, typename S,
1350          typename P01, typename P02>
1351 struct IsMemberFunctionPointerRaw<T (S:: *)(
1352     P01, P02, ...) const>
1353 {
1354     enum {result = 1};
1355 };
1356
1357 template <typename T, typename S,
1358          typename P01, typename P02, typename P03>
1359 struct IsMemberFunctionPointerRaw<T (S:: *)(
1360     P01, P02, P03, ...) const>
1361 {
1362     enum {result = 1};
1363 };
1364
1365 template <typename T, typename S,
1366          typename P01, typename P02, typename P03, typename P04>
1367 struct IsMemberFunctionPointerRaw<T (S:: *)(
1368     P01, P02, P03, P04, ...) const>
1369 {
1370     enum {result = 1};
1371 };
1372
1373 template <typename T, typename S,
1374          typename P01, typename P02, typename P03, typename P04, typename P05>
1375 struct IsMemberFunctionPointerRaw<T (S:: *)(
1376     P01, P02, P03, P04, P05,
1377     ...) const>
1378 {
1379     enum {result = 1};
1380 };
1381
1382 template <typename T, typename S,
1383          typename P01, typename P02, typename P03, typename P04, typename P05,
1384          typename P06>
1385 struct IsMemberFunctionPointerRaw<T (S:: *)(
1386     P01, P02, P03, P04, P05,
1387     P06, ...) const>
1388 {
1389     enum {result = 1};
1390 };
1391
1392 template <typename T, typename S,
1393          typename P01, typename P02, typename P03, typename P04, typename P05,
1394          typename P06, typename P07>
1395 struct IsMemberFunctionPointerRaw<T (S:: *)(
1396     P01, P02, P03, P04, P05,
1397     P06, P07, ...) const>
1398 {
1399     enum {result = 1};
1400 };
1401
1402 template <typename T, typename S,
1403          typename P01, typename P02, typename P03, typename P04, typename P05,
1404          typename P06, typename P07, typename P08>
1405 struct IsMemberFunctionPointerRaw<T (S:: *)(
1406     P01, P02, P03, P04, P05,
1407     P06, P07, P08, ...) const>
1408 {
1409     enum {result = 1};
1410 };
1411
1412 template <typename T, typename S,
1413          typename P01, typename P02, typename P03, typename P04, typename P05,
1414          typename P06, typename P07, typename P08, typename P09>
1415 struct IsMemberFunctionPointerRaw<T (S:: *)(
1416     P01, P02, P03, P04, P05,
1417     P06, P07, P08, P09, ...) const>
1418 {
1419     enum {result = 1};
1420 };
1421
1422 template <typename T, typename S,
1423          typename P01, typename P02, typename P03, typename P04, typename P05,
1424          typename P06, typename P07, typename P08, typename P09, typename P10>
1425 struct IsMemberFunctionPointerRaw<T (S:: *)(
1426     P01, P02, P03, P04, P05,
1427     P06, P07, P08, P09, P10,
1428     ...) const>
1429 {
1430     enum {result = 1};
1431 };
1432
1433 template <typename T, typename S,
1434          typename P01, typename P02, typename P03, typename P04, typename P05,
1435          typename P06, typename P07, typename P08, typename P09, typename P10,
1436          typename P11>
1437 struct IsMemberFunctionPointerRaw<T (S:: *)(
1438     P01, P02, P03, P04, P05,
1439     P06, P07, P08, P09, P10,
1440     P11, ...) const>
1441 {
1442     enum {result = 1};
1443 };
1444
1445 template <typename T, typename S,
1446          typename P01, typename P02, typename P03, typename P04, typename P05,
1447          typename P06, typename P07, typename P08, typename P09, typename P10,
1448          typename P11, typename P12>
1449 struct IsMemberFunctionPointerRaw<T (S:: *)(
1450     P01, P02, P03, P04, P05,
1451     P06, P07, P08, P09, P10,
1452     P11, P12, ...) const>
1453 {
1454     enum {result = 1};
1455 };
1456
1457 template <typename T, typename S,
1458          typename P01, typename P02, typename P03, typename P04, typename P05,
1459          typename P06, typename P07, typename P08, typename P09, typename P10,
1460          typename P11, typename P12, typename P13>
1461 struct IsMemberFunctionPointerRaw<T (S:: *)(
1462     P01, P02, P03, P04, P05,
1463     P06, P07, P08, P09, P10,
1464     P11, P12, P13, ...) const>
1465 {
1466     enum {result = 1};
1467 };
1468
1469 template <typename T, typename S,
1470          typename P01, typename P02, typename P03, typename P04, typename P05,
1471          typename P06, typename P07, typename P08, typename P09, typename P10,
1472          typename P11, typename P12, typename P13, typename P14>
1473 struct IsMemberFunctionPointerRaw<T (S:: *)(
1474     P01, P02, P03, P04, P05,
1475     P06, P07, P08, P09, P10,
1476     P11, P12, P13, P14, ...) const>
1477 {
1478     enum {result = 1};
1479 };
1480
1481 template <typename T, typename S,
1482          typename P01, typename P02, typename P03, typename P04, typename P05,
1483          typename P06, typename P07, typename P08, typename P09, typename P10,
1484          typename P11, typename P12, typename P13, typename P14, typename P15>
1485 struct IsMemberFunctionPointerRaw<T (S:: *)(
1486     P01, P02, P03, P04, P05,
1487     P06, P07, P08, P09, P10,
1488     P11, P12, P13, P14, P15,
1489     ...) const>
1490 {
1491     enum {result = 1};
1492 };
1493
1494 template <typename T, typename S,
1495          typename P01, typename P02, typename P03, typename P04, typename P05,
1496          typename P06, typename P07, typename P08, typename P09, typename P10,
1497          typename P11, typename P12, typename P13, typename P14, typename P15,
1498          typename P16>
1499 struct IsMemberFunctionPointerRaw<T (S:: *)(
1500     P01, P02, P03, P04, P05,
1501     P06, P07, P08, P09, P10,
1502     P11, P12, P13, P14, P15,
1503     P16, ...) const>
1504 {
1505     enum {result = 1};
1506 };
1507
1508 template <typename T, typename S,
1509          typename P01, typename P02, typename P03, typename P04, typename P05,
1510          typename P06, typename P07, typename P08, typename P09, typename P10,
1511          typename P11, typename P12, typename P13, typename P14, typename P15,
1512          typename P16, typename P17>
1513 struct IsMemberFunctionPointerRaw<T (S:: *)(
1514     P01, P02, P03, P04, P05,
1515     P06, P07, P08, P09, P10,
1516     P11, P12, P13, P14, P15,
1517     P16, P17, ...) const>
1518 {
1519     enum {result = 1};
1520 };
1521
1522 template <typename T, typename S,
1523          typename P01, typename P02, typename P03, typename P04, typename P05,
1524          typename P06, typename P07, typename P08, typename P09, typename P10,
1525          typename P11, typename P12, typename P13, typename P14, typename P15,
1526          typename P16, typename P17, typename P18>
1527 struct IsMemberFunctionPointerRaw<T (S:: *)(
1528     P01, P02, P03, P04, P05,
1529     P06, P07, P08, P09, P10,
1530     P11, P12, P13, P14, P15,
1531     P16, P17, P18, ...) const>
1532 {
1533     enum {result = 1};
1534 };
1535
1536 template <typename T, typename S,
1537          typename P01, typename P02, typename P03, typename P04, typename P05,
1538          typename P06, typename P07, typename P08, typename P09, typename P10,
1539          typename P11, typename P12, typename P13, typename P14, typename P15,
1540          typename P16, typename P17, typename P18, typename P19>
1541 struct IsMemberFunctionPointerRaw<T (S:: *)(
1542     P01, P02, P03, P04, P05,
1543     P06, P07, P08, P09, P10,
1544     P11, P12, P13, P14, P15,
1545     P16, P17, P18, P19, ...) const>
1546 {
1547     enum {result = 1};
1548 };
1549
1550 template <typename T, typename S,
1551          typename P01, typename P02, typename P03, typename P04, typename P05,
1552          typename P06, typename P07, typename P08, typename P09, typename P10,
1553          typename P11, typename P12, typename P13, typename P14, typename P15,
1554          typename P16, typename P17, typename P18, typename P19, typename P20>
1555 struct IsMemberFunctionPointerRaw<T (S:: *)(
1556     P01, P02, P03, P04, P05,
1557     P06, P07, P08, P09, P10,
1558     P11, P12, P13, P14, P15,
1559     P16, P17, P18, P19, P20,
1560     ...) const>
1561 {
1562     enum {result = 1};
1563 };
1564
1565 // Volatile versions
1566
1567 template <typename T, typename S>
1568 struct IsMemberFunctionPointerRaw<T (S:: *)() volatile>
1569 {
1570     enum {result = 1};
1571 };
1572
1573 template <typename T, typename S,
1574          typename P01>
1575 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) volatile>
1576 {
1577     enum {result = 1};
1578 };
1579
1580 template <typename T, typename S,
1581          typename P01, typename P02>
1582 struct IsMemberFunctionPointerRaw<T (S:: *)(
1583     P01, P02) volatile>
1584 {
1585     enum {result = 1};
1586 };
1587
1588 template <typename T, typename S,
1589          typename P01, typename P02, typename P03>
1590 struct IsMemberFunctionPointerRaw<T (S:: *)(
1591     P01, P02, P03) volatile>
1592 {
1593     enum {result = 1};
1594 };
1595
1596 template <typename T, typename S,
1597          typename P01, typename P02, typename P03, typename P04>
1598 struct IsMemberFunctionPointerRaw<T (S:: *)(
1599     P01, P02, P03, P04) volatile>
1600 {
1601     enum {result = 1};
1602 };
1603
1604 template <typename T, typename S,
1605          typename P01, typename P02, typename P03, typename P04, typename P05>
1606 struct IsMemberFunctionPointerRaw<T (S:: *)(
1607     P01, P02, P03, P04, P05) volatile>
1608 {
1609     enum {result = 1};
1610 };
1611
1612 template <typename T, typename S,
1613          typename P01, typename P02, typename P03, typename P04, typename P05,
1614          typename P06>
1615 struct IsMemberFunctionPointerRaw<T (S:: *)(
1616     P01, P02, P03, P04, P05,
1617     P06) volatile>
1618 {
1619     enum {result = 1};
1620 };
1621
1622 template <typename T, typename S,
1623          typename P01, typename P02, typename P03, typename P04, typename P05,
1624          typename P06, typename P07>
1625 struct IsMemberFunctionPointerRaw<T (S:: *)(
1626     P01, P02, P03, P04, P05,
1627     P06, P07) volatile>
1628 {
1629     enum {result = 1};
1630 };
1631
1632 template <typename T, typename S,
1633          typename P01, typename P02, typename P03, typename P04, typename P05,
1634          typename P06, typename P07, typename P08>
1635 struct IsMemberFunctionPointerRaw<T (S:: *)(
1636     P01, P02, P03, P04, P05,
1637     P06, P07, P08) volatile>
1638 {
1639     enum {result = 1};
1640 };
1641
1642 template <typename T, typename S,
1643          typename P01, typename P02, typename P03, typename P04, typename P05,
1644          typename P06, typename P07, typename P08, typename P09>
1645 struct IsMemberFunctionPointerRaw<T (S:: *)(
1646     P01, P02, P03, P04, P05,
1647     P06, P07, P08, P09) volatile>
1648 {
1649     enum {result = 1};
1650 };
1651
1652 template <typename T, typename S,
1653          typename P01, typename P02, typename P03, typename P04, typename P05,
1654          typename P06, typename P07, typename P08, typename P09, typename P10>
1655 struct IsMemberFunctionPointerRaw<T (S:: *)(
1656     P01, P02, P03, P04, P05,
1657     P06, P07, P08, P09, P10) volatile>
1658 {
1659     enum {result = 1};
1660 };
1661
1662 template <typename T, typename S,
1663          typename P01, typename P02, typename P03, typename P04, typename P05,
1664          typename P06, typename P07, typename P08, typename P09, typename P10,
1665          typename P11>
1666 struct IsMemberFunctionPointerRaw<T (S:: *)(
1667     P01, P02, P03, P04, P05,
1668     P06, P07, P08, P09, P10,
1669     P11) volatile>
1670 {
1671     enum {result = 1};
1672 };
1673
1674 template <typename T, typename S,
1675          typename P01, typename P02, typename P03, typename P04, typename P05,
1676          typename P06, typename P07, typename P08, typename P09, typename P10,
1677          typename P11, typename P12>
1678 struct IsMemberFunctionPointerRaw<T (S:: *)(
1679     P01, P02, P03, P04, P05,
1680     P06, P07, P08, P09, P10,
1681     P11, P12) volatile>
1682 {
1683     enum {result = 1};
1684 };
1685
1686 template <typename T, typename S,
1687          typename P01, typename P02, typename P03, typename P04, typename P05,
1688          typename P06, typename P07, typename P08, typename P09, typename P10,
1689          typename P11, typename P12, typename P13>
1690 struct IsMemberFunctionPointerRaw<T (S:: *)(
1691     P01, P02, P03, P04, P05,
1692     P06, P07, P08, P09, P10,
1693     P11, P12, P13) volatile>
1694 {
1695     enum {result = 1};
1696 };
1697
1698 template <typename T, typename S,
1699          typename P01, typename P02, typename P03, typename P04, typename P05,
1700          typename P06, typename P07, typename P08, typename P09, typename P10,
1701          typename P11, typename P12, typename P13, typename P14>
1702 struct IsMemberFunctionPointerRaw<T (S:: *)(
1703     P01, P02, P03, P04, P05,
1704     P06, P07, P08, P09, P10,
1705     P11, P12, P13, P14) volatile>
1706 {
1707     enum {result = 1};
1708 };
1709
1710 template <typename T, typename S,
1711          typename P01, typename P02, typename P03, typename P04, typename P05,
1712          typename P06, typename P07, typename P08, typename P09, typename P10,
1713          typename P11, typename P12, typename P13, typename P14, typename P15>
1714 struct IsMemberFunctionPointerRaw<T (S:: *)(
1715     P01, P02, P03, P04, P05,
1716     P06, P07, P08, P09, P10,
1717     P11, P12, P13, P14, P15) volatile>
1718 {
1719     enum {result = 1};
1720 };
1721
1722 template <typename T, typename S,
1723          typename P01, typename P02, typename P03, typename P04, typename P05,
1724          typename P06, typename P07, typename P08, typename P09, typename P10,
1725          typename P11, typename P12, typename P13, typename P14, typename P15,
1726          typename P16>
1727 struct IsMemberFunctionPointerRaw<T (S:: *)(
1728     P01, P02, P03, P04, P05,
1729     P06, P07, P08, P09, P10,
1730     P11, P12, P13, P14, P15,
1731     P16) volatile>
1732 {
1733     enum {result = 1};
1734 };
1735
1736 template <typename T, typename S,
1737          typename P01, typename P02, typename P03, typename P04, typename P05,
1738          typename P06, typename P07, typename P08, typename P09, typename P10,
1739          typename P11, typename P12, typename P13, typename P14, typename P15,
1740          typename P16, typename P17>
1741 struct IsMemberFunctionPointerRaw<T (S:: *)(
1742     P01, P02, P03, P04, P05,
1743     P06, P07, P08, P09, P10,
1744     P11, P12, P13, P14, P15,
1745     P16, P17) volatile>
1746 {
1747     enum {result = 1};
1748 };
1749
1750 template <typename T, typename S,
1751          typename P01, typename P02, typename P03, typename P04, typename P05,
1752          typename P06, typename P07, typename P08, typename P09, typename P10,
1753          typename P11, typename P12, typename P13, typename P14, typename P15,
1754          typename P16, typename P17, typename P18>
1755 struct IsMemberFunctionPointerRaw<T (S:: *)(
1756     P01, P02, P03, P04, P05,
1757     P06, P07, P08, P09, P10,
1758     P11, P12, P13, P14, P15,
1759     P16, P17, P18) volatile>
1760 {
1761     enum {result = 1};
1762 };
1763
1764 template <typename T, typename S,
1765          typename P01, typename P02, typename P03, typename P04, typename P05,
1766          typename P06, typename P07, typename P08, typename P09, typename P10,
1767          typename P11, typename P12, typename P13, typename P14, typename P15,
1768          typename P16, typename P17, typename P18, typename P19>
1769 struct IsMemberFunctionPointerRaw<T (S:: *)(
1770     P01, P02, P03, P04, P05,
1771     P06, P07, P08, P09, P10,
1772     P11, P12, P13, P14, P15,
1773     P16, P17, P18, P19) volatile>
1774 {
1775     enum {result = 1};
1776 };
1777
1778 template <typename T, typename S,
1779          typename P01, typename P02, typename P03, typename P04, typename P05,
1780          typename P06, typename P07, typename P08, typename P09, typename P10,
1781          typename P11, typename P12, typename P13, typename P14, typename P15,
1782          typename P16, typename P17, typename P18, typename P19, typename P20>
1783 struct IsMemberFunctionPointerRaw<T (S:: *)(
1784     P01, P02, P03, P04, P05,
1785     P06, P07, P08, P09, P10,
1786     P11, P12, P13, P14, P15,
1787     P16, P17, P18, P19, P20) volatile>
1788 {
1789     enum {result = 1};
1790 };
1791
1792 template <typename T, typename S>
1793 struct IsMemberFunctionPointerRaw<T (S:: *)(
1794     ...) volatile>
1795 {
1796     enum {result = 1};
1797 };
1798
1799 template <typename T, typename S,
1800          typename P01>
1801 struct IsMemberFunctionPointerRaw<T (S:: *)(
1802     P01, ...) volatile>
1803 {
1804     enum {result = 1};
1805 };
1806
1807 template <typename T, typename S,
1808          typename P01, typename P02>
1809 struct IsMemberFunctionPointerRaw<T (S:: *)(
1810     P01, P02, ...) volatile>
1811 {
1812     enum {result = 1};
1813 };
1814
1815 template <typename T, typename S,
1816          typename P01, typename P02, typename P03>
1817 struct IsMemberFunctionPointerRaw<T (S:: *)(
1818     P01, P02, P03, ...) volatile>
1819 {
1820     enum {result = 1};
1821 };
1822
1823 template <typename T, typename S,
1824          typename P01, typename P02, typename P03, typename P04>
1825 struct IsMemberFunctionPointerRaw<T (S:: *)(
1826     P01, P02, P03, P04, ...) volatile>
1827 {
1828     enum {result = 1};
1829 };
1830
1831 template <typename T, typename S,
1832          typename P01, typename P02, typename P03, typename P04, typename P05>
1833 struct IsMemberFunctionPointerRaw<T (S:: *)(
1834     P01, P02, P03, P04, P05,
1835     ...) volatile>
1836 {
1837     enum {result = 1};
1838 };
1839
1840 template <typename T, typename S,
1841          typename P01, typename P02, typename P03, typename P04, typename P05,
1842          typename P06>
1843 struct IsMemberFunctionPointerRaw<T (S:: *)(
1844     P01, P02, P03, P04, P05,
1845     P06, ...) volatile>
1846 {
1847     enum {result = 1};
1848 };
1849
1850 template <typename T, typename S,
1851          typename P01, typename P02, typename P03, typename P04, typename P05,
1852          typename P06, typename P07>
1853 struct IsMemberFunctionPointerRaw<T (S:: *)(
1854     P01, P02, P03, P04, P05,
1855     P06, P07, ...) volatile>
1856 {
1857     enum {result = 1};
1858 };
1859
1860 template <typename T, typename S,
1861          typename P01, typename P02, typename P03, typename P04, typename P05,
1862          typename P06, typename P07, typename P08>
1863 struct IsMemberFunctionPointerRaw<T (S:: *)(
1864     P01, P02, P03, P04, P05,
1865     P06, P07, P08, ...) volatile>
1866 {
1867     enum {result = 1};
1868 };
1869
1870 template <typename T, typename S,
1871          typename P01, typename P02, typename P03, typename P04, typename P05,
1872          typename P06, typename P07, typename P08, typename P09>
1873 struct IsMemberFunctionPointerRaw<T (S:: *)(
1874     P01, P02, P03, P04, P05,
1875     P06, P07, P08, P09, ...) volatile>
1876 {
1877     enum {result = 1};
1878 };
1879
1880 template <typename T, typename S,
1881          typename P01, typename P02, typename P03, typename P04, typename P05,
1882          typename P06, typename P07, typename P08, typename P09, typename P10>
1883 struct IsMemberFunctionPointerRaw<T (S:: *)(
1884     P01, P02, P03, P04, P05,
1885     P06, P07, P08, P09, P10,
1886     ...) volatile>
1887 {
1888     enum {result = 1};
1889 };
1890
1891 template <typename T, typename S,
1892          typename P01, typename P02, typename P03, typename P04, typename P05,
1893          typename P06, typename P07, typename P08, typename P09, typename P10,
1894          typename P11>
1895 struct IsMemberFunctionPointerRaw<T (S:: *)(
1896     P01, P02, P03, P04, P05,
1897     P06, P07, P08, P09, P10,
1898     P11, ...) volatile>
1899 {
1900     enum {result = 1};
1901 };
1902
1903 template <typename T, typename S,
1904          typename P01, typename P02, typename P03, typename P04, typename P05,
1905          typename P06, typename P07, typename P08, typename P09, typename P10,
1906          typename P11, typename P12>
1907 struct IsMemberFunctionPointerRaw<T (S:: *)(
1908     P01, P02, P03, P04, P05,
1909     P06, P07, P08, P09, P10,
1910     P11, P12, ...) volatile>
1911 {
1912     enum {result = 1};
1913 };
1914
1915 template <typename T, typename S,
1916          typename P01, typename P02, typename P03, typename P04, typename P05,
1917          typename P06, typename P07, typename P08, typename P09, typename P10,
1918          typename P11, typename P12, typename P13>
1919 struct IsMemberFunctionPointerRaw<T (S:: *)(
1920     P01, P02, P03, P04, P05,
1921     P06, P07, P08, P09, P10,
1922     P11, P12, P13, ...) volatile>
1923 {
1924     enum {result = 1};
1925 };
1926
1927 template <typename T, typename S,
1928          typename P01, typename P02, typename P03, typename P04, typename P05,
1929          typename P06, typename P07, typename P08, typename P09, typename P10,
1930          typename P11, typename P12, typename P13, typename P14>
1931 struct IsMemberFunctionPointerRaw<T (S:: *)(
1932     P01, P02, P03, P04, P05,
1933     P06, P07, P08, P09, P10,
1934     P11, P12, P13, P14, ...) volatile>
1935 {
1936     enum {result = 1};
1937 };
1938
1939 template <typename T, typename S,
1940          typename P01, typename P02, typename P03, typename P04, typename P05,
1941          typename P06, typename P07, typename P08, typename P09, typename P10,
1942          typename P11, typename P12, typename P13, typename P14, typename P15>
1943 struct IsMemberFunctionPointerRaw<T (S:: *)(
1944     P01, P02, P03, P04, P05,
1945     P06, P07, P08, P09, P10,
1946     P11, P12, P13, P14, P15,
1947     ...) volatile>
1948 {
1949     enum {result = 1};
1950 };
1951
1952 template <typename T, typename S,
1953          typename P01, typename P02, typename P03, typename P04, typename P05,
1954          typename P06, typename P07, typename P08, typename P09, typename P10,
1955          typename P11, typename P12, typename P13, typename P14, typename P15,
1956          typename P16>
1957 struct IsMemberFunctionPointerRaw<T (S:: *)(
1958     P01, P02, P03, P04, P05,
1959     P06, P07, P08, P09, P10,
1960     P11, P12, P13, P14, P15,
1961     P16, ...) volatile>
1962 {
1963     enum {result = 1};
1964 };
1965
1966 template <typename T, typename S,
1967          typename P01, typename P02, typename P03, typename P04, typename P05,
1968          typename P06, typename P07, typename P08, typename P09, typename P10,
1969          typename P11, typename P12, typename P13, typename P14, typename P15,
1970          typename P16, typename P17>
1971 struct IsMemberFunctionPointerRaw<T (S:: *)(
1972     P01, P02, P03, P04, P05,
1973     P06, P07, P08, P09, P10,
1974     P11, P12, P13, P14, P15,
1975     P16, P17, ...) volatile>
1976 {
1977     enum {result = 1};
1978 };
1979
1980 template <typename T, typename S,
1981          typename P01, typename P02, typename P03, typename P04, typename P05,
1982          typename P06, typename P07, typename P08, typename P09, typename P10,
1983          typename P11, typename P12, typename P13, typename P14, typename P15,
1984          typename P16, typename P17, typename P18>
1985 struct IsMemberFunctionPointerRaw<T (S:: *)(
1986     P01, P02, P03, P04, P05,
1987     P06, P07, P08, P09, P10,
1988     P11, P12, P13, P14, P15,
1989     P16, P17, P18, ...) volatile>
1990 {
1991     enum {result = 1};
1992 };
1993
1994 template <typename T, typename S,
1995          typename P01, typename P02, typename P03, typename P04, typename P05,
1996          typename P06, typename P07, typename P08, typename P09, typename P10,
1997          typename P11, typename P12, typename P13, typename P14, typename P15,
1998          typename P16, typename P17, typename P18, typename P19>
1999 struct IsMemberFunctionPointerRaw<T (S:: *)(
2000     P01, P02, P03, P04, P05,
2001     P06, P07, P08, P09, P10,
2002     P11, P12, P13, P14, P15,
2003     P16, P17, P18, P19, ...) volatile>
2004 {
2005     enum {result = 1};
2006 };
2007
2008 template <typename T, typename S,
2009          typename P01, typename P02, typename P03, typename P04, typename P05,
2010          typename P06, typename P07, typename P08, typename P09, typename P10,
2011          typename P11, typename P12, typename P13, typename P14, typename P15,
2012          typename P16, typename P17, typename P18, typename P19, typename P20>
2013 struct IsMemberFunctionPointerRaw<T (S:: *)(
2014     P01, P02, P03, P04, P05,
2015     P06, P07, P08, P09, P10,
2016     P11, P12, P13, P14, P15,
2017     P16, P17, P18, P19, P20,
2018     ...) volatile>
2019 {
2020     enum {result = 1};
2021 };
2022
2023 // Const volatile versions
2024
2025 template <typename T, typename S>
2026 struct IsMemberFunctionPointerRaw<T (S:: *)() const volatile>
2027 {
2028     enum {result = 1};
2029 };
2030
2031 template <typename T, typename S,
2032          typename P01>
2033 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) const volatile>
2034 {
2035     enum {result = 1};
2036 };
2037
2038 template <typename T, typename S,
2039          typename P01, typename P02>
2040 struct IsMemberFunctionPointerRaw<T (S:: *)(
2041     P01, P02) const volatile>
2042 {
2043     enum {result = 1};
2044 };
2045
2046 template <typename T, typename S,
2047          typename P01, typename P02, typename P03>
2048 struct IsMemberFunctionPointerRaw<T (S:: *)(
2049     P01, P02, P03) const volatile>
2050 {
2051     enum {result = 1};
2052 };
2053
2054 template <typename T, typename S,
2055          typename P01, typename P02, typename P03, typename P04>
2056 struct IsMemberFunctionPointerRaw<T (S:: *)(
2057     P01, P02, P03, P04) const volatile>
2058 {
2059     enum {result = 1};
2060 };
2061
2062 template <typename T, typename S,
2063          typename P01, typename P02, typename P03, typename P04, typename P05>
2064 struct IsMemberFunctionPointerRaw<T (S:: *)(
2065     P01, P02, P03, P04, P05) const volatile>
2066 {
2067     enum {result = 1};
2068 };
2069
2070 template <typename T, typename S,
2071          typename P01, typename P02, typename P03, typename P04, typename P05,
2072          typename P06>
2073 struct IsMemberFunctionPointerRaw<T (S:: *)(
2074     P01, P02, P03, P04, P05,
2075     P06) const volatile>
2076 {
2077     enum {result = 1};
2078 };
2079
2080 template <typename T, typename S,
2081          typename P01, typename P02, typename P03, typename P04, typename P05,
2082          typename P06, typename P07>
2083 struct IsMemberFunctionPointerRaw<T (S:: *)(
2084     P01, P02, P03, P04, P05,
2085     P06, P07) const volatile>
2086 {
2087     enum {result = 1};
2088 };
2089
2090 template <typename T, typename S,
2091          typename P01, typename P02, typename P03, typename P04, typename P05,
2092          typename P06, typename P07, typename P08>
2093 struct IsMemberFunctionPointerRaw<T (S:: *)(
2094     P01, P02, P03, P04, P05,
2095     P06, P07, P08) const volatile>
2096 {
2097     enum {result = 1};
2098 };
2099
2100 template <typename T, typename S,
2101          typename P01, typename P02, typename P03, typename P04, typename P05,
2102          typename P06, typename P07, typename P08, typename P09>
2103 struct IsMemberFunctionPointerRaw<T (S:: *)(
2104     P01, P02, P03, P04, P05,
2105     P06, P07, P08, P09) const volatile>
2106 {
2107     enum {result = 1};
2108 };
2109
2110 template <typename T, typename S,
2111          typename P01, typename P02, typename P03, typename P04, typename P05,
2112          typename P06, typename P07, typename P08, typename P09, typename P10>
2113 struct IsMemberFunctionPointerRaw<T (S:: *)(
2114     P01, P02, P03, P04, P05,
2115     P06, P07, P08, P09, P10) const volatile>
2116 {
2117     enum {result = 1};
2118 };
2119
2120 template <typename T, typename S,
2121          typename P01, typename P02, typename P03, typename P04, typename P05,
2122          typename P06, typename P07, typename P08, typename P09, typename P10,
2123          typename P11>
2124 struct IsMemberFunctionPointerRaw<T (S:: *)(
2125     P01, P02, P03, P04, P05,
2126     P06, P07, P08, P09, P10,
2127     P11) const volatile>
2128 {
2129     enum {result = 1};
2130 };
2131
2132 template <typename T, typename S,
2133          typename P01, typename P02, typename P03, typename P04, typename P05,
2134          typename P06, typename P07, typename P08, typename P09, typename P10,
2135          typename P11, typename P12>
2136 struct IsMemberFunctionPointerRaw<T (S:: *)(
2137     P01, P02, P03, P04, P05,
2138     P06, P07, P08, P09, P10,
2139     P11, P12) const volatile>
2140 {
2141     enum {result = 1};
2142 };
2143
2144 template <typename T, typename S,
2145          typename P01, typename P02, typename P03, typename P04, typename P05,
2146          typename P06, typename P07, typename P08, typename P09, typename P10,
2147          typename P11, typename P12, typename P13>
2148 struct IsMemberFunctionPointerRaw<T (S:: *)(
2149     P01, P02, P03, P04, P05,
2150     P06, P07, P08, P09, P10,
2151     P11, P12, P13) const volatile>
2152 {
2153     enum {result = 1};
2154 };
2155
2156 template <typename T, typename S,
2157          typename P01, typename P02, typename P03, typename P04, typename P05,
2158          typename P06, typename P07, typename P08, typename P09, typename P10,
2159          typename P11, typename P12, typename P13, typename P14>
2160 struct IsMemberFunctionPointerRaw<T (S:: *)(
2161     P01, P02, P03, P04, P05,
2162     P06, P07, P08, P09, P10,
2163     P11, P12, P13, P14) const volatile>
2164 {
2165     enum {result = 1};
2166 };
2167
2168 template <typename T, typename S,
2169          typename P01, typename P02, typename P03, typename P04, typename P05,
2170          typename P06, typename P07, typename P08, typename P09, typename P10,
2171          typename P11, typename P12, typename P13, typename P14, typename P15>
2172 struct IsMemberFunctionPointerRaw<T (S:: *)(
2173     P01, P02, P03, P04, P05,
2174     P06, P07, P08, P09, P10,
2175     P11, P12, P13, P14, P15) const volatile>
2176 {
2177     enum {result = 1};
2178 };
2179
2180 template <typename T, typename S,
2181          typename P01, typename P02, typename P03, typename P04, typename P05,
2182          typename P06, typename P07, typename P08, typename P09, typename P10,
2183          typename P11, typename P12, typename P13, typename P14, typename P15,
2184          typename P16>
2185 struct IsMemberFunctionPointerRaw<T (S:: *)(
2186     P01, P02, P03, P04, P05,
2187     P06, P07, P08, P09, P10,
2188     P11, P12, P13, P14, P15,
2189     P16) const volatile>
2190 {
2191     enum {result = 1};
2192 };
2193
2194 template <typename T, typename S,
2195          typename P01, typename P02, typename P03, typename P04, typename P05,
2196          typename P06, typename P07, typename P08, typename P09, typename P10,
2197          typename P11, typename P12, typename P13, typename P14, typename P15,
2198          typename P16, typename P17>
2199 struct IsMemberFunctionPointerRaw<T (S:: *)(
2200     P01, P02, P03, P04, P05,
2201     P06, P07, P08, P09, P10,
2202     P11, P12, P13, P14, P15,
2203     P16, P17) const volatile>
2204 {
2205     enum {result = 1};
2206 };
2207
2208 template <typename T, typename S,
2209          typename P01, typename P02, typename P03, typename P04, typename P05,
2210          typename P06, typename P07, typename P08, typename P09, typename P10,
2211          typename P11, typename P12, typename P13, typename P14, typename P15,
2212          typename P16, typename P17, typename P18>
2213 struct IsMemberFunctionPointerRaw<T (S:: *)(
2214     P01, P02, P03, P04, P05,
2215     P06, P07, P08, P09, P10,
2216     P11, P12, P13, P14, P15,
2217     P16, P17, P18) const volatile>
2218 {
2219     enum {result = 1};
2220 };
2221
2222 template <typename T, typename S,
2223          typename P01, typename P02, typename P03, typename P04, typename P05,
2224          typename P06, typename P07, typename P08, typename P09, typename P10,
2225          typename P11, typename P12, typename P13, typename P14, typename P15,
2226          typename P16, typename P17, typename P18, typename P19>
2227 struct IsMemberFunctionPointerRaw<T (S:: *)(
2228     P01, P02, P03, P04, P05,
2229     P06, P07, P08, P09, P10,
2230     P11, P12, P13, P14, P15,
2231     P16, P17, P18, P19) const volatile>
2232 {
2233     enum {result = 1};
2234 };
2235
2236 template <typename T, typename S,
2237          typename P01, typename P02, typename P03, typename P04, typename P05,
2238          typename P06, typename P07, typename P08, typename P09, typename P10,
2239          typename P11, typename P12, typename P13, typename P14, typename P15,
2240          typename P16, typename P17, typename P18, typename P19, typename P20>
2241 struct IsMemberFunctionPointerRaw<T (S:: *)(
2242     P01, P02, P03, P04, P05,
2243     P06, P07, P08, P09, P10,
2244     P11, P12, P13, P14, P15,
2245     P16, P17, P18, P19, P20) const volatile>
2246 {
2247     enum {result = 1};
2248 };
2249
2250 template <typename T, typename S>
2251 struct IsMemberFunctionPointerRaw<T (S:: *)(
2252     ...) const volatile>
2253 {
2254     enum {result = 1};
2255 };
2256
2257 template <typename T, typename S,
2258          typename P01>
2259 struct IsMemberFunctionPointerRaw<T (S:: *)(
2260     P01, ...) const volatile>
2261 {
2262     enum {result = 1};
2263 };
2264
2265 template <typename T, typename S,
2266          typename P01, typename P02>
2267 struct IsMemberFunctionPointerRaw<T (S:: *)(
2268     P01, P02, ...) const volatile>
2269 {
2270     enum {result = 1};
2271 };
2272
2273 template <typename T, typename S,
2274          typename P01, typename P02, typename P03>
2275 struct IsMemberFunctionPointerRaw<T (S:: *)(
2276     P01, P02, P03, ...) const volatile>
2277 {
2278     enum {result = 1};
2279 };
2280
2281 template <typename T, typename S,
2282          typename P01, typename P02, typename P03, typename P04>
2283 struct IsMemberFunctionPointerRaw<T (S:: *)(
2284     P01, P02, P03, P04, ...) const volatile>
2285 {
2286     enum {result = 1};
2287 };
2288
2289 template <typename T, typename S,
2290          typename P01, typename P02, typename P03, typename P04, typename P05>
2291 struct IsMemberFunctionPointerRaw<T (S:: *)(
2292     P01, P02, P03, P04, P05,
2293     ...) const volatile>
2294 {
2295     enum {result = 1};
2296 };
2297
2298 template <typename T, typename S,
2299          typename P01, typename P02, typename P03, typename P04, typename P05,
2300          typename P06>
2301 struct IsMemberFunctionPointerRaw<T (S:: *)(
2302     P01, P02, P03, P04, P05,
2303     P06, ...) const volatile>
2304 {
2305     enum {result = 1};
2306 };
2307
2308 template <typename T, typename S,
2309          typename P01, typename P02, typename P03, typename P04, typename P05,
2310          typename P06, typename P07>
2311 struct IsMemberFunctionPointerRaw<T (S:: *)(
2312     P01, P02, P03, P04, P05,
2313     P06, P07, ...) const volatile>
2314 {
2315     enum {result = 1};
2316 };
2317
2318 template <typename T, typename S,
2319          typename P01, typename P02, typename P03, typename P04, typename P05,
2320          typename P06, typename P07, typename P08>
2321 struct IsMemberFunctionPointerRaw<T (S:: *)(
2322     P01, P02, P03, P04, P05,
2323     P06, P07, P08, ...) const volatile>
2324 {
2325     enum {result = 1};
2326 };
2327
2328 template <typename T, typename S,
2329          typename P01, typename P02, typename P03, typename P04, typename P05,
2330          typename P06, typename P07, typename P08, typename P09>
2331 struct IsMemberFunctionPointerRaw<T (S:: *)(
2332     P01, P02, P03, P04, P05,
2333     P06, P07, P08, P09, ...) const volatile>
2334 {
2335     enum {result = 1};
2336 };
2337
2338 template <typename T, typename S,
2339          typename P01, typename P02, typename P03, typename P04, typename P05,
2340          typename P06, typename P07, typename P08, typename P09, typename P10>
2341 struct IsMemberFunctionPointerRaw<T (S:: *)(
2342     P01, P02, P03, P04, P05,
2343     P06, P07, P08, P09, P10,
2344     ...) const volatile>
2345 {
2346     enum {result = 1};
2347 };
2348
2349 template <typename T, typename S,
2350          typename P01, typename P02, typename P03, typename P04, typename P05,
2351          typename P06, typename P07, typename P08, typename P09, typename P10,
2352          typename P11>
2353 struct IsMemberFunctionPointerRaw<T (S:: *)(
2354     P01, P02, P03, P04, P05,
2355     P06, P07, P08, P09, P10,
2356     P11, ...) const volatile>
2357 {
2358     enum {result = 1};
2359 };
2360
2361 template <typename T, typename S,
2362          typename P01, typename P02, typename P03, typename P04, typename P05,
2363          typename P06, typename P07, typename P08, typename P09, typename P10,
2364          typename P11, typename P12>
2365 struct IsMemberFunctionPointerRaw<T (S:: *)(
2366     P01, P02, P03, P04, P05,
2367     P06, P07, P08, P09, P10,
2368     P11, P12, ...) const volatile>
2369 {
2370     enum {result = 1};
2371 };
2372
2373 template <typename T, typename S,
2374          typename P01, typename P02, typename P03, typename P04, typename P05,
2375          typename P06, typename P07, typename P08, typename P09, typename P10,
2376          typename P11, typename P12, typename P13>
2377 struct IsMemberFunctionPointerRaw<T (S:: *)(
2378     P01, P02, P03, P04, P05,
2379     P06, P07, P08, P09, P10,
2380     P11, P12, P13, ...) const volatile>
2381 {
2382     enum {result = 1};
2383 };
2384
2385 template <typename T, typename S,
2386          typename P01, typename P02, typename P03, typename P04, typename P05,
2387          typename P06, typename P07, typename P08, typename P09, typename P10,
2388          typename P11, typename P12, typename P13, typename P14>
2389 struct IsMemberFunctionPointerRaw<T (S:: *)(
2390     P01, P02, P03, P04, P05,
2391     P06, P07, P08, P09, P10,
2392     P11, P12, P13, P14, ...) const volatile>
2393 {
2394     enum {result = 1};
2395 };
2396
2397 template <typename T, typename S,
2398          typename P01, typename P02, typename P03, typename P04, typename P05,
2399          typename P06, typename P07, typename P08, typename P09, typename P10,
2400          typename P11, typename P12, typename P13, typename P14, typename P15>
2401 struct IsMemberFunctionPointerRaw<T (S:: *)(
2402     P01, P02, P03, P04, P05,
2403     P06, P07, P08, P09, P10,
2404     P11, P12, P13, P14, P15,
2405     ...) const volatile>
2406 {
2407     enum {result = 1};
2408 };
2409
2410 template <typename T, typename S,
2411          typename P01, typename P02, typename P03, typename P04, typename P05,
2412          typename P06, typename P07, typename P08, typename P09, typename P10,
2413          typename P11, typename P12, typename P13, typename P14, typename P15,
2414          typename P16>
2415 struct IsMemberFunctionPointerRaw<T (S:: *)(
2416     P01, P02, P03, P04, P05,
2417     P06, P07, P08, P09, P10,
2418     P11, P12, P13, P14, P15,
2419     P16, ...) const volatile>
2420 {
2421     enum {result = 1};
2422 };
2423
2424 template <typename T, typename S,
2425          typename P01, typename P02, typename P03, typename P04, typename P05,
2426          typename P06, typename P07, typename P08, typename P09, typename P10,
2427          typename P11, typename P12, typename P13, typename P14, typename P15,
2428          typename P16, typename P17>
2429 struct IsMemberFunctionPointerRaw<T (S:: *)(
2430     P01, P02, P03, P04, P05,
2431     P06, P07, P08, P09, P10,
2432     P11, P12, P13, P14, P15,
2433     P16, P17, ...) const volatile>
2434 {
2435     enum {result = 1};
2436 };
2437
2438 template <typename T, typename S,
2439          typename P01, typename P02, typename P03, typename P04, typename P05,
2440          typename P06, typename P07, typename P08, typename P09, typename P10,
2441          typename P11, typename P12, typename P13, typename P14, typename P15,
2442          typename P16, typename P17, typename P18>
2443 struct IsMemberFunctionPointerRaw<T (S:: *)(
2444     P01, P02, P03, P04, P05,
2445     P06, P07, P08, P09, P10,
2446     P11, P12, P13, P14, P15,
2447     P16, P17, P18, ...) const volatile>
2448 {
2449     enum {result = 1};
2450 };
2451
2452 template <typename T, typename S,
2453          typename P01, typename P02, typename P03, typename P04, typename P05,
2454          typename P06, typename P07, typename P08, typename P09, typename P10,
2455          typename P11, typename P12, typename P13, typename P14, typename P15,
2456          typename P16, typename P17, typename P18, typename P19>
2457 struct IsMemberFunctionPointerRaw<T (S:: *)(
2458     P01, P02, P03, P04, P05,
2459     P06, P07, P08, P09, P10,
2460     P11, P12, P13, P14, P15,
2461     P16, P17, P18, P19, ...) const volatile>
2462 {
2463     enum {result = 1};
2464 };
2465
2466 template <typename T, typename S,
2467          typename P01, typename P02, typename P03, typename P04, typename P05,
2468          typename P06, typename P07, typename P08, typename P09, typename P10,
2469          typename P11, typename P12, typename P13, typename P14, typename P15,
2470          typename P16, typename P17, typename P18, typename P19, typename P20>
2471 struct IsMemberFunctionPointerRaw<T (S:: *)(
2472     P01, P02, P03, P04, P05,
2473     P06, P07, P08, P09, P10,
2474     P11, P12, P13, P14, P15,
2475     P16, P17, P18, P19, P20,
2476     ...) const volatile>
2477 {
2478     enum {result = 1};
2479 };
2480
2481 }// namespace Private
2482
2483 ////////////////////////////////////////////////////////////////////////////////
2484 // class template TypeTraits
2485 //
2486 // Figures out at compile time various properties of any given type
2487 // Invocations (T is a type, TypeTraits<T>::Property):
2488 //
2489 // - isPointer       : returns true if T is a pointer type
2490 // - PointeeType     : returns the type to which T points if T is a pointer
2491 //                     type, NullType otherwise
2492 // - isReference     : returns true if T is a reference type
2493 // - ReferredType    : returns the type to which T refers if T is a reference
2494 //                     type, NullType otherwise
2495 // - isMemberPointer : returns true if T is a pointer to member type
2496 // - isStdUnsignedInt: returns true if T is a standard unsigned integral type
2497 // - isStdSignedInt  : returns true if T is a standard signed integral type
2498 // - isStdIntegral   : returns true if T is a standard integral type
2499 // - isStdFloat      : returns true if T is a standard floating-point type
2500 // - isStdArith      : returns true if T is a standard arithmetic type
2501 // - isStdFundamental: returns true if T is a standard fundamental type
2502 // - isUnsignedInt   : returns true if T is a unsigned integral type
2503 // - isSignedInt     : returns true if T is a signed integral type
2504 // - isIntegral      : returns true if T is a integral type
2505 // - isFloat         : returns true if T is a floating-point type
2506 // - isArith         : returns true if T is a arithmetic type
2507 // - isFundamental   : returns true if T is a fundamental type
2508 // - ParameterType   : returns the optimal type to be used as a parameter for
2509 //                     functions that take Ts
2510 // - isConst         : returns true if T is a const-qualified type
2511 // - NonConstType    : Type with removed 'const' qualifier from T, if any
2512 // - isVolatile      : returns true if T is a volatile-qualified type
2513 // - NonVolatileType : Type with removed 'volatile' qualifier from T, if any
2514 // - UnqualifiedType : Type with removed 'const' and 'volatile' qualifiers from
2515 //                     T, if any
2516 // - ParameterType   : returns the optimal type to be used as a parameter
2517 //                       for functions that take 'const T's
2518 //
2519 ////////////////////////////////////////////////////////////////////////////////
2520
2521 template <typename T>
2522 class TypeTraits
2523 {
2524 private:
2525
2526         template <class U> struct ReferenceTraits
2527         {
2528                 enum { result = false };
2529                 typedef U ReferredType;
2530         };
2531
2532         template <class U> struct ReferenceTraits<U &>
2533         {
2534                 enum { result = true };
2535                 typedef U ReferredType;
2536         };
2537
2538         template <class U> struct PointerTraits
2539         {
2540                 enum { result = false };
2541                 typedef NullType PointeeType;
2542         };
2543
2544         template <class U> struct PointerTraits<U *>
2545         {
2546                 enum { result = true };
2547                 typedef U PointeeType;
2548         };
2549
2550         template <class U> struct PointerTraits<U* &>
2551         {
2552                 enum { result = true };
2553                 typedef U PointeeType;
2554         };
2555
2556         template <class U> struct PToMTraits
2557         {
2558                 enum { result = false };
2559         };
2560
2561         template <class U, class V> struct PToMTraits<U V:: *>
2562         {
2563                 enum { result = true };
2564         };
2565
2566         template <class U, class V> struct PToMTraits<U V::* &>
2567         {
2568                 enum { result = true };
2569         };
2570
2571         template <class U> struct FunctionPointerTraits
2572         {
2573                 enum { result = Private::IsFunctionPointerRaw<U>::result };
2574         };
2575
2576         template <typename U> struct PToMFunctionTraits
2577         {
2578                 enum { result = Private::IsMemberFunctionPointerRaw<U>::result };
2579         };
2580
2581         template <class U> struct UnConst
2582         {
2583                 typedef U Result;
2584                 enum { isConst = 0 };
2585         };
2586
2587         template <class U> struct UnConst<const U>
2588         {
2589                 typedef U Result;
2590                 enum { isConst = 1 };
2591         };
2592
2593         template <class U> struct UnConst<const U &>
2594         {
2595                 typedef U &Result;
2596                 enum { isConst = 1 };
2597         };
2598
2599         template <class U> struct UnVolatile
2600         {
2601                 typedef U Result;
2602                 enum { isVolatile = 0 };
2603         };
2604
2605         template <class U> struct UnVolatile<volatile U>
2606         {
2607                 typedef U Result;
2608                 enum { isVolatile = 1 };
2609         };
2610
2611         template <class U> struct UnVolatile<volatile U &>
2612         {
2613                 typedef U &Result;
2614                 enum { isVolatile = 1 };
2615         };
2616
2617 public:
2618         typedef typename UnConst<T>::Result
2619         NonConstType;
2620         typedef typename UnVolatile<T>::Result
2621         NonVolatileType;
2622         typedef typename UnVolatile<typename UnConst<T>::Result>::Result
2623         UnqualifiedType;
2624         typedef typename PointerTraits<UnqualifiedType>::PointeeType
2625         PointeeType;
2626         typedef typename ReferenceTraits<T>::ReferredType
2627         ReferredType;
2628
2629         enum { isConst          = UnConst<T>::isConst };
2630         enum { isVolatile       = UnVolatile<T>::isVolatile };
2631         enum { isReference      = ReferenceTraits<UnqualifiedType>::result };
2632         enum { isFunction       = FunctionPointerTraits<typename Private::AddPointer<T>::Result >::result };
2633         enum { isFunctionPointer= FunctionPointerTraits<
2634                                   typename ReferenceTraits<UnqualifiedType>::ReferredType >::result
2635              };
2636         enum { isMemberFunctionPointer= PToMFunctionTraits<
2637                                         typename ReferenceTraits<UnqualifiedType>::ReferredType >::result
2638              };
2639         enum { isMemberPointer  = PToMTraits<
2640                                   typename ReferenceTraits<UnqualifiedType>::ReferredType >::result ||
2641                                   isMemberFunctionPointer
2642              };
2643         enum { isPointer        = PointerTraits<
2644                                   typename ReferenceTraits<UnqualifiedType>::ReferredType >::result ||
2645                                   isFunctionPointer
2646              };
2647
2648         enum { isStdUnsignedInt = TL::IndexOf<Private::StdUnsignedInts, UnqualifiedType>::value >= 0 ||
2649                TL::IndexOf<Private::StdUnsignedInts,
2650                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2651              };
2652         enum { isStdSignedInt   = TL::IndexOf<Private::StdSignedInts, UnqualifiedType>::value >= 0 ||
2653                TL::IndexOf<Private::StdSignedInts,
2654                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2655              };
2656         enum { isStdIntegral    = isStdUnsignedInt || isStdSignedInt ||
2657                                   TL::IndexOf<Private::StdOtherInts, UnqualifiedType>::value >= 0 ||
2658                TL::IndexOf<Private::StdOtherInts,
2659                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2660              };
2661
2662         enum { isStdFloat       = TL::IndexOf<Private::StdFloats, UnqualifiedType>::value >= 0 ||
2663                TL::IndexOf<Private::StdFloats,
2664                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2665              };
2666
2667         enum { isStdSignedLong  = TL::IndexOf<Private::StdSignedLong, UnqualifiedType>::value >= 0 ||
2668                TL::IndexOf<Private::StdSignedLong,
2669                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2670              };
2671
2672         enum { isStdUnsignedLong  = TL::IndexOf<Private::StdUnsignedLong, UnqualifiedType>::value >= 0 ||
2673                TL::IndexOf<Private::StdUnsignedLong,
2674                typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2675              };
2676
2677         enum { isStdArith       = isStdIntegral || isStdFloat };
2678         enum { isStdFundamental = isStdArith || isStdFloat || Conversion<T, void>::sameType };
2679
2680         enum { isUnsignedInt    = isStdUnsignedInt || IsCustomUnsignedInt<UnqualifiedType>::value };
2681         enum { isSignedInt      = isStdSignedInt || IsCustomSignedInt<UnqualifiedType>::value };
2682         enum { isIntegral       = isStdIntegral || isUnsignedInt || isSignedInt };
2683         enum { isFloat          = isStdFloat || IsCustomFloat<UnqualifiedType>::value };
2684         enum { isArith          = isIntegral || isFloat };
2685         enum { isFundamental    = isStdFundamental || isArith };
2686
2687         enum { typeFlags =
2688                    ((uint)isConst                               << LOKI_IS_CONST_BIT) +
2689                    ((uint)isVolatile                    << LOKI_IS_VOLATILE_BIT) +
2690                    ((uint)isReference                   << LOKI_IS_REFERENCE_BIT) +
2691                    ((uint)isFunction                    << LOKI_IS_FUNCTION) +
2692                    ((uint)isFunctionPointer << LOKI_IS_FUNCTION_POINTER) +
2693                    ((uint)isMemberFunctionPointer << LOKI_IS_MEMBER_FUNCTION_POINTER) +
2694                    ((uint)isMemberPointer       << LOKI_IS_MEMBER_POINTER) +
2695                    ((uint)isPointer                     << LOKI_IS_POINTER) +
2696                    ((uint)isStdUnsignedInt      << LOKI_IS_STD_UNSIGNED_INT) +
2697                    ((uint)isStdSignedInt                << LOKI_IS_STD_SIGNED_INT) +
2698                    ((uint)isStdIntegral         << LOKI_IS_STD_INTEGRAL) +
2699                    ((uint)isStdFundamental      << LOKI_IS_STD_FUNDAMENTAL) +
2700                    ((uint)isUnsignedInt         << LOKI_IS_UNSIGNED_INT) +
2701                    ((uint)isSignedInt                   << LOKI_IS_SIGNED_INT) +
2702                    ((uint)isIntegral                    << LOKI_IS_INTEGRAL) +
2703                    ((uint)isFloat                               << LOKI_IS_FLOAT) +
2704                    ((uint)isArith                               << LOKI_IS_ARITH) +
2705                    ((uint)isFundamental         << LOKI_IS_FUNDAMENTAL) +
2706                    ((uint)isStdSignedLong   << LOKI_IS_SIGNED_LONG) +
2707                    ((uint)isStdUnsignedLong << LOKI_IS_UNSIGNED_LONG)
2708              };
2709
2710         typedef typename Select<isStdArith || isPointer || isMemberPointer, T,
2711                 typename Private::AddParameterType<T>::Result>::Result
2712                 ParameterType;
2713 };
2714
2715 template<typename T>
2716 struct type_is_ptr
2717 {
2718         enum
2719         {
2720                 result = TypeTraits<T>::isPointer
2721         };
2722 };
2723
2724 template<>
2725 struct type_is_ptr<void>
2726 {
2727         enum
2728         {
2729                 result = false
2730         };
2731 };
2732
2733 template<>
2734 struct type_is_ptr<const void>
2735 {
2736         enum
2737         {
2738                 result = false
2739         };
2740 };
2741 }
2742
2743 #ifdef _MSC_VER
2744 #pragma warning( pop )
2745 #endif // _MSC_VER
2746
2747
2748 #endif // end file guardian
2749