1 #ifndef CLHEP_TYPE_TRAITS_H
2 #define CLHEP_TYPE_TRAITS_H
13 #include "CLHEP/Utility/defs.h"
17 #if defined(__GXX_EXPERIMENTAL_CXX0X__)
18 # define CLHEP_HAS_RVALUE_REFERENCE
20 # define CLHEP_NO_RVALUE_REFERENCE
31 template<
typename T, T v >
struct integral_constant;
32 typedef integral_constant<bool, true >
true_type;
33 typedef integral_constant<bool, false >
false_type;
36 template<
typename T >
struct is_void;
37 template<
typename T >
struct is_integral;
38 template<
typename T >
struct is_floating_point;
39 template<
typename T >
struct is_array;
40 template<
typename T >
struct is_pointer;
41 template<
typename T >
struct is_lvalue_reference;
42 template<
typename T >
struct is_rvalue_reference;
43 template<
typename T >
struct is_member_object_pointer;
44 template<
typename T >
struct is_member_function_pointer;
45 template<
typename T >
struct is_enum;
46 template<
typename T >
struct is_union;
47 template<
typename T >
struct is_class;
48 template<
typename T >
struct is_function;
51 template<
typename T >
struct is_reference;
52 template<
typename T >
struct is_arithmetic;
53 template<
typename T >
struct is_fundamental;
54 template<
typename T >
struct is_object;
55 template<
typename T >
struct is_scalar;
56 template<
typename T >
struct is_compound;
57 template<
typename T >
struct is_member_pointer;
60 template<
typename T >
struct is_const;
61 template<
typename T >
struct is_volatile;
63 template<
typename T >
struct is_trivial;
64 template<
typename T >
struct is_trivially_copyable;
65 template<
typename T >
struct is_standard_layout;
66 template<
typename T >
struct is_pod;
67 template<
typename T >
struct is_literal_type;
68 template<
typename T >
struct is_empty;
69 template<
typename T >
struct is_polymorphic;
71 template<
typename T >
struct is_abstract;
73 template<
typename T,
typename... Args >
struct is_constructible;
74 template<
typename T,
typename... Args >
struct is_nothrow_constructible;
75 template<
typename T >
struct has_default_constructor;
76 template<
typename T >
struct has_copy_constructor;
77 template<
typename T >
struct has_copy_assign;
78 template<
typename T >
struct has_move_constructor;
79 template<
typename T >
struct has_move_assign;
80 template<
typename T >
struct has_trivial_default_constructor;
81 template<
typename T >
struct has_trivial_copy_constructor;
82 template<
typename T >
struct has_trivial_move_constructor;
83 template<
typename T >
struct has_trivial_copy_assign;
84 template<
typename T >
struct has_trivial_move_assign;
85 template<
typename T >
struct has_trivial_destructor;
86 template<
typename T >
struct has_nothrow_default_constructor;
87 template<
typename T >
struct has_nothrow_copy_constructor;
88 template<
typename T >
struct has_nothrow_move_constructor;
89 template<
typename T >
struct has_nothrow_copy_assign;
90 template<
typename T >
struct has_nothrow_move_assign;
91 template<
typename T >
struct has_virtual_destructor;
93 template<
typename T >
struct is_signed;
94 template<
typename T >
struct is_unsigned;
96 template<
typename T >
struct alignment_of;
98 template<
typename T >
struct rank;
99 template<
typename T,
unsigned I = 0 >
struct extent;
102 template<
typename T,
typename U >
struct is_same;
104 template<
typename Base,
typename Derived >
struct is_base_of;
106 template<
typename From,
typename To >
struct is_convertible;
108 template<
typename From,
typename To >
struct is_explicitly_convertible;
112 template<
typename T >
struct remove_const;
113 template<
typename T >
struct remove_volatile;
114 template<
typename T >
struct remove_cv;
115 template<
typename T >
struct add_const;
116 template<
typename T >
struct add_volatile;
117 template<
typename T >
struct add_cv;
120 template<
typename T >
struct remove_reference;
121 template<
typename T >
struct add_lvalue_reference;
122 template<
typename T >
struct add_rvalue_reference;
126 template<
typename T >
struct make_signed;
127 template<
typename T >
struct make_unsigned;
131 template<
typename T >
struct remove_extent;
132 template<
typename T >
struct remove_all_extents;
135 template<
typename T >
struct remove_pointer;
136 template<
typename T >
struct add_pointer;
140 template< std::
size_t Len, std::
size_t Align >
struct aligned_storage;
141 template< std::size_t Len,
typename... Types >
struct aligned_union;
142 template<
typename T >
struct decay;
144 template<
bool,
typename T =
void >
struct enable_if;
145 template<
bool,
typename T,
typename F >
struct conditional;
147 template<
typename... T >
struct common_type;
148 template<
typename T >
struct underlying_type;
149 template<
typename >
typename result_of;
150 template<
typename F,
typename... ArgTypes >
typename result_of<F(ArgTypes...)>;
154 template<
typename From,
typename To >
struct is_ptr_convertible;
155 template<
typename From,
typename To,
typename R=
void >
struct enable_if_convertible;
156 template<
typename From,
typename To,
typename R=
void >
struct enable_if_ptr_convertible;
157 template<
typename P,
typename R=
void >
struct enable_if_auto_ptr;
164 template<
typename T, T v >
165 struct integral_constant
182 typedef char (&
yes_t);
183 typedef char (&
no_t ) [2];
216 template<
typename U >
218 template<
typename U >
226 template<
typename T >
230 = (
sizeof(isAclass <T>(0)) ==
sizeof(
yes_t) ) ?
_class
237 template<
typename T >
238 struct encode<T const> :
public encode<T> { };
239 template<
typename T >
240 struct encode<T volatile> :
public encode<T> { };
241 template<
typename T >
242 struct encode<T const volatile> :
public encode<T> { };
245 template<
typename T >
248 template<
typename T >
249 struct encode<T const[]>
251 template<
typename T >
252 struct encode<T volatile[]>
254 template<
typename T >
255 struct encode<T const volatile[]>
257 template<
typename T,
unsigned N >
260 template<
typename T,
unsigned N >
261 struct encode<T const[N]>
263 template<
typename T,
unsigned N >
264 struct encode<T volatile[N]>
266 template<
typename T,
unsigned N >
267 struct encode<T const volatile[N]>
278 struct encode<long
double>
286 struct encode<signed char>
292 struct encode<unsigned char>
296 struct encode<wchar_t>
303 struct encode<unsigned short>
309 struct encode<unsigned int>
315 struct encode<unsigned long>
319 template<
typename T,
typename C >
320 struct encode<T (C::*)()>
322 template<
typename T,
typename C >
323 struct encode<T (C::*)() const>
325 template<
typename T,
typename C >
326 struct encode<T (C::*)() volatile>
328 template<
typename T,
typename C >
329 struct encode<T (C::*)() const volatile>
331 template<
typename T,
typename C
333 struct encode<T (C::*)(A1)>
335 template<
typename T,
typename C
337 struct encode<T (C::*)(A1) const>
339 template<
typename T,
typename C
341 struct encode<T (C::*)(A1) volatile>
343 template<
typename T,
typename C
345 struct encode<T (C::*)(A1) const volatile>
347 template<
typename T,
typename C
348 ,
typename A1,
typename A2 >
349 struct encode<T (C::*)(A1,A2)>
351 template<
typename T,
typename C
352 ,
typename A1,
typename A2 >
353 struct encode<T (C::*)(A1,A2) const>
355 template<
typename T,
typename C
356 ,
typename A1,
typename A2 >
357 struct encode<T (C::*)(A1,A2) volatile>
359 template<
typename T,
typename C
360 ,
typename A1,
typename A2 >
361 struct encode<T (C::*)(A1,A2) const volatile>
363 template<
typename T,
typename C
364 ,
typename A1,
typename A2,
typename A3 >
365 struct encode<T (C::*)(A1,A2,A3)>
367 template<
typename T,
typename C
368 ,
typename A1,
typename A2,
typename A3 >
369 struct encode<T (C::*)(A1,A2,A3) const>
371 template<
typename T,
typename C
372 ,
typename A1,
typename A2,
typename A3 >
373 struct encode<T (C::*)(A1,A2,A3) volatile>
375 template<
typename T,
typename C
376 ,
typename A1,
typename A2,
typename A3 >
377 struct encode<T (C::*)(A1,A2,A3) const volatile>
379 template<
typename T,
typename C
380 ,
typename A1,
typename A2,
typename A3,
typename A4 >
381 struct encode<T (C::*)(A1,A2,A3,A4)>
383 template<
typename T,
typename C
384 ,
typename A1,
typename A2,
typename A3,
typename A4 >
385 struct encode<T (C::*)(A1,A2,A3,A4) const>
387 template<
typename T,
typename C
388 ,
typename A1,
typename A2,
typename A3,
typename A4 >
389 struct encode<T (C::*)(A1,A2,A3,A4) volatile>
391 template<
typename T,
typename C
392 ,
typename A1,
typename A2,
typename A3,
typename A4 >
393 struct encode<T (C::*)(A1,A2,A3,A4) const volatile>
395 template<
typename T,
typename C
396 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
397 struct encode<T (C::*)(A1,A2,A3,A4,A5)>
399 template<
typename T,
typename C
400 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
401 struct encode<T (C::*)(A1,A2,A3,A4,A5) const>
403 template<
typename T,
typename C
404 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
405 struct encode<T (C::*)(A1,A2,A3,A4,A5) volatile>
407 template<
typename T,
typename C
408 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
409 struct encode<T (C::*)(A1,A2,A3,A4,A5) const volatile>
413 template<
typename T,
typename C >
414 struct encode<T C::*>
418 template<
typename T >
423 template<
typename T >
428 #if defined(CLHEP_HAS_RVALUE_REFERENCE)
429 template<
typename T >
432 #endif // CLHEP_HAS_RVALUE_REFERENCE
440 template<
typename T,
unsigned int p >
441 struct primary : integral_constant<bool, bool(p & encode<T>::value)> { };
450 template<
typename T >
452 :
public tt::primary<T, tt::_void > { };
459 template<
typename T >
461 :
public tt::primary<T, tt::_integral > { };
468 template<
typename T >
469 struct is_floating_point
470 :
public tt::primary<T, tt::_floating_point > { };
476 template<
typename T >
478 :
public tt::primary<T, tt::_array > { };
485 template<
typename T >
487 :
public tt::primary<T, tt::_pointer > { };
494 template<
typename T >
495 struct is_lvalue_reference
496 :
public tt::primary<T, tt::_lvalue_reference > { };
503 template<
typename T >
struct is_rvalue_reference
504 :
public tt::primary<T, tt::_rvalue_reference > { };
511 template<
typename T >
struct is_member_object_pointer
512 :
public conditional< is_member_function_pointer<T>::value
514 , tt::primary<T, tt::_member_object_pointer>
523 template<
typename T >
524 struct is_member_function_pointer
525 :
public tt::primary<T, tt::_member_function_pointer > { };
532 template<
typename T >
534 :
public tt::primary<T, tt::_enum > { };
541 template<
typename T >
543 :
public tt::primary<T, tt::_union > { };
550 template<
typename T >
552 :
public tt::primary<T, tt::_class > { };
559 template<
typename T >
561 :
public tt::primary<T, tt::_function > { };
568 template<
typename T >
570 :
public tt::primary< T, tt::_lvalue_reference
571 | tt::_rvalue_reference
580 template<
typename T >
582 :
public tt::primary< T, tt::_integral
583 | tt::_floating_point
592 template<
typename T >
593 struct is_fundamental
594 :
public tt::primary< T, tt::_integral
595 | tt::_floating_point
605 template<
typename T >
607 :
public tt::primary< T, tt::_array
610 | tt::_floating_point
612 | tt::_member_object_pointer
613 | tt::_member_function_pointer
624 template<
typename T >
626 :
public tt::primary< T, tt::_integral
627 | tt::_floating_point
630 | tt::_member_object_pointer
631 | tt::_member_function_pointer
640 template<
typename T >
642 :
public tt::primary< T, tt::_array
644 | tt::_lvalue_reference
645 | tt::_rvalue_reference
646 | tt::_member_object_pointer
647 | tt::_member_function_pointer
660 template<
typename T >
661 struct is_member_pointer
662 :
public tt::primary< T, tt::_member_object_pointer
663 | tt::_member_function_pointer
674 template<
typename T >
677 static bool const is_c =
false;
678 static bool const is_v =
false;
687 template<
typename T >
690 static bool const is_c =
true;
691 static bool const is_v =
false;
700 template<
typename T >
701 struct cv<T volatile>
703 static bool const is_c =
false;
704 static bool const is_v =
true;
713 template<
typename T >
714 struct cv<T const volatile>
716 static bool const is_c =
true;
717 static bool const is_v =
true;
726 template<
typename T >
729 static bool const is_c =
false;
730 static bool const is_v =
false;
746 template<
typename T >
755 template<
typename T >
757 :
public integral_constant<bool, tt::cv<T>::is_v > { };
766 template<
typename,
bool >
767 struct is_abstract_class
770 template<
typename C >
771 struct is_abstract_class<C,true>
774 template<
typename T >
775 static no_t take( T (*)[1] );
776 template<
typename T >
777 static yes_t take( ... );
780 static bool const value =
sizeof( take<C>(0) ) ==
sizeof(
yes_t);
790 template<
typename T >
792 :
public tt::is_abstract_class< T
807 struct is_signed<signed char>
810 struct is_signed<short>
813 struct is_signed<int>
816 struct is_signed<long>
819 template<
typename T >
820 struct is_signed<T const>
821 :
public is_signed<T> { };
822 template<
typename T >
823 struct is_signed<T volatile>
824 :
public is_signed<T> { };
825 template<
typename T >
826 struct is_signed<T const volatile>
827 :
public is_signed<T> { };
839 struct is_unsigned<unsigned char>
842 struct is_unsigned<unsigned short>
845 struct is_unsigned<unsigned int>
848 struct is_unsigned<unsigned long>
851 template<
typename T >
852 struct is_unsigned<T const>
853 :
public is_unsigned<T> { };
854 template<
typename T >
855 struct is_unsigned<T volatile>
856 :
public is_unsigned<T> { };
857 template<
typename T >
858 struct is_unsigned<T const volatile>
859 :
public is_unsigned<T> { };
868 template<
typename T >
874 static int const rank = 0;
876 template<
unsigned I >
880 template<
typename T,
unsigned N >
888 template<
unsigned I >
897 template<
typename T >
903 static int const rank = 1;
905 template<
unsigned I >
916 template<
typename T >
918 :
public integral_constant<int, tt::arr<T>::rank> { };
925 template<
typename T,
unsigned I >
927 :
public integral_constant<int, tt::arr<T>::template extent<I>::value> { };
934 template<
typename T,
typename U >
936 template<
typename T >
937 struct is_same<T,T> :
public true_type { };
946 struct any_conversion
948 template<
typename T >
950 template<
typename T >
963 template<
typename From,
typename To,
bool >
967 template<
typename From,
typename To >
968 struct converts<From,To,false>
971 static yes_t take( To,
int );
972 static no_t take( any_conversion, ... );
976 static bool const value
977 =
sizeof( take( from, 0 ) ) ==
sizeof(
yes_t);
987 template<
typename From,
typename To >
988 struct is_convertible
989 :
public tt::converts<From,To,is_abstract<To>::value> { };
991 template< >
struct is_convertible<void,void>
994 template<
typename T >
995 struct is_convertible<T,void>
998 template<
typename T >
999 struct is_convertible<void,T>
1003 struct is_convertible<const void,const void>
1006 template<
typename T >
1007 struct is_convertible<T,const void>
1010 template<
typename T >
1011 struct is_convertible<const void,T>
1015 struct is_convertible<volatile void,volatile void>
1018 template<
typename T >
1019 struct is_convertible<T,volatile void>
1022 template<
typename T >
1023 struct is_convertible<volatile void,T>
1027 struct is_convertible<const volatile void,const volatile void>
1030 template<
typename T >
1031 struct is_convertible<T,const volatile void>
1034 template<
typename T >
1035 struct is_convertible<const volatile void,T>
1038 template<
typename From,
int N,
typename To >
1039 struct is_convertible<From[N],To>
1040 :
public is_convertible<From*,To> { };
1042 template<
typename From,
typename To,
int N >
1043 struct is_convertible<From,To[N]>
1051 template<
typename T >
1062 template<
typename T >
1073 template<
typename T >
1084 template<
typename T >
1095 template<
typename T >
1106 template<
typename T >
1119 template<
typename T
1125 #if defined(CLHEP_HAS_RVALUE_REFERENCE)
1126 typedef T&& add_rref_type;
1127 #endif // CLHEP_HAS_RVALUE_REFERENCE
1131 template<
typename T >
1139 #if defined(CLHEP_HAS_RVALUE_REFERENCE)
1140 template<
typename T >
1143 typedef T& add_lref_type;
1144 typedef T&& add_rref_type;
1145 typedef T rem_ref_type;
1147 #endif // CLHEP_HAS_RVALUE_REFERENCE
1149 template<
typename T >
1164 template<
typename T >
1175 template<
typename T >
1186 template<
typename T >
1199 template<
typename T >
1206 template<
typename T >
1213 template<
typename T >
1214 struct ptr<T *
const>
1220 template<
typename T >
1221 struct ptr<T *
volatile>
1227 template<
typename T >
1228 struct ptr<T *
const volatile>
1241 template<
typename T >
1252 template<
typename T >
1263 template<
typename T >
1274 template<
typename T >
1285 template<
typename T >
struct enable_if<true ,T> {
typedef T
type; };
1286 template<
typename T >
struct enable_if<false,T> { };
1293 template<
typename T,
typename F >
struct conditional<true ,T,F> {
typedef T
type; };
1294 template<
typename T,
typename F >
struct conditional<false,T,F> {
typedef F
type; };
1301 template<
typename From,
typename To >
1309 static bool const value
1310 =
sizeof(
take( static_cast<From*>(0) ) ) ==
sizeof(
tt::yes_t);
1318 template<
typename From
1322 struct enable_if_convertible
1323 :
public enable_if< is_convertible<From,To>::value, R > { };
1330 template<
typename From
1334 struct enable_if_ptr_convertible
1335 :
public enable_if< is_ptr_convertible<From,To>::value, R > { };
1342 template<
typename P
1345 struct enable_if_auto_ptr { };
1347 template<
typename P,
typename R >
1348 struct enable_if_auto_ptr< std::auto_ptr<P>, R >
1359 #endif // CLHEP_TYPE_TRAITS_H