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 >
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 >
440 template<
typename T,
unsigned int p >
441 struct primary : integral_constant<bool, bool(p & encode<T>::value)> { };
450 template<
typename T >
459 template<
typename T >
468 template<
typename T >
476 template<
typename T >
485 template<
typename T >
494 template<
typename T >
496 :
public tt::primary<T, tt::_lvalue_reference > { };
504 :
public tt::primary<T, tt::_rvalue_reference > { };
512 :
public conditional< is_member_function_pointer<T>::value
514 , tt::primary<T, tt::_member_object_pointer>
523 template<
typename T >
525 :
public tt::primary<T, tt::_member_function_pointer > { };
532 template<
typename T >
541 template<
typename T >
550 template<
typename T >
559 template<
typename T >
568 template<
typename T >
571 | tt::_rvalue_reference
580 template<
typename T >
583 | tt::_floating_point
592 template<
typename T >
595 | tt::_floating_point
605 template<
typename T >
610 | tt::_floating_point
612 | tt::_member_object_pointer
613 | tt::_member_function_pointer
624 template<
typename T >
627 | tt::_floating_point
630 | tt::_member_object_pointer
631 | tt::_member_function_pointer
640 template<
typename T >
644 | tt::_lvalue_reference
645 | tt::_rvalue_reference
646 | tt::_member_object_pointer
647 | tt::_member_function_pointer
660 template<
typename T >
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 >
766 template<
typename,
bool >
767 struct is_abstract_class
770 template<
typename C >
771 struct is_abstract_class<C,true>
774 template<
typename T >
776 template<
typename T >
780 static bool const value =
sizeof( take<C>(0) ) ==
sizeof(
yes_t);
790 template<
typename T >
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> { };
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 >
925 template<
typename T,
unsigned I >
934 template<
typename T,
typename U >
936 template<
typename T >
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>
976 static bool const value
977 =
sizeof( take( from, 0 ) ) ==
sizeof(
yes_t);
987 template<
typename From,
typename To >
989 :
public tt::converts<From,To,is_abstract<To>::value> { };
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;
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;
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 >
1286 template<
typename T >
struct enable_if<false,T> { };
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
1323 :
public enable_if< is_convertible<From,To>::value, R > { };
1330 template<
typename From
1335 :
public enable_if< is_ptr_convertible<From,To>::value, R > { };
1342 template<
typename P
1347 template<
typename P,
typename R >
@ _member_function_pointer
no_t isAfunction(U(*)[1])
yes_t isAclass(void(U::*)())
integral_constant< bool, true > true_type
integral_constant< bool, false > false_type
tt::cv< T >::add_c_type type
tt::cv< T >::add_cv_type type
tt::ref< T >::add_lref_type type
tt::ptr< T >::add_ptr_type type
tt::ref< T >::add_rref_type type
tt::cv< T >::add_v_type type
static value_type const value
integral_constant< T, v > type
static tt::yes_t take(To *)
static tt::no_t take(...)
tt::arr< T >::rem_arr_type type
tt::cv< T >::rem_c_type type
tt::cv< T >::rem_cv_type type
tt::arr< T >::rem_ext_type type
tt::ptr< T >::rem_ptr_type type
tt::ref< T >::rem_ref_type type
tt::cv< T >::rem_v_type type
any_conversion(T const volatile &)
tt::arr< T >::rem_arr_type rem_arr_type
static yes_t take(To, int)
static no_t take(any_conversion,...)
T const volatile add_cv_type
T const volatile add_v_type
T const volatile add_c_type
T const volatile add_v_type
T const volatile add_cv_type
T const volatile add_c_type
T const volatile add_cv_type
T const volatile add_cv_type
static primary_code const value
static no_t take(T(*)[1])
T *const volatile * add_ptr_type
T *volatile * add_ptr_type
tt::ref< T >::rem_ref_type * add_ptr_type