35 #ifndef EASTL_INTERNAL_TYPE_COMPOUND_H 36 #define EASTL_INTERNAL_TYPE_COMPOUND_H 70 T (*is_array_tester1(empty<T>))(empty<T>);
71 char is_array_tester1(...);
74 no_type is_array_tester2(T(*)(empty<T>));
75 yes_type is_array_tester2(...);
78 struct is_array_helper {
79 static empty<T> emptyInstance;
83 struct is_array :
public integral_constant<bool,
84 sizeof(is_array_tester2(is_array_tester1(is_array_helper<T>::emptyInstance))) == 1
96 template <
typename T>
struct is_reference :
public false_type{};
97 template <
typename T>
struct is_reference<T&> :
public true_type{};
112 template <
typename T>
struct is_mem_fun_pointer_value :
public false_type{};
113 template <
typename R,
typename T>
struct is_mem_fun_pointer_value<R (T::*)()> :
public true_type{};
114 template <
typename R,
typename T>
struct is_mem_fun_pointer_value<R (T::*)() const> :
public true_type{};
115 template <
typename R,
typename T,
typename Arg0>
struct is_mem_fun_pointer_value<R (T::*)(Arg0)> :
public true_type{};
116 template <
typename R,
typename T,
typename Arg0>
struct is_mem_fun_pointer_value<R (T::*)(Arg0) const> :
public true_type{};
117 template <
typename R,
typename T,
typename Arg0,
typename Arg1>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1)> :
public true_type{};
118 template <
typename R,
typename T,
typename Arg0,
typename Arg1>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1) const> :
public true_type{};
119 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2)> :
public true_type{};
120 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2) const> :
public true_type{};
121 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3)> :
public true_type{};
122 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3) const> :
public true_type{};
123 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4)> :
public true_type{};
124 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4) const> :
public true_type{};
125 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)> :
public true_type{};
126 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5) const> :
public true_type{};
127 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> :
public true_type{};
128 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const> :
public true_type{};
129 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> :
public true_type{};
130 template <
typename R,
typename T,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7>
struct is_mem_fun_pointer_value<R (T::*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const> :
public true_type{};
132 template <
typename T>
133 struct is_member_function_pointer :
public integral_constant<bool, is_mem_fun_pointer_value<T>::value>{};
144 template <
typename T>
145 struct is_member_pointer :
public integral_constant<bool, is_member_function_pointer<T>::value>{};
147 template <
typename T,
typename U>
struct is_member_pointer<U T::*> :
public true_type{};
160 template <
typename T>
struct is_pointer_helper :
public false_type{};
162 template <
typename T>
struct is_pointer_helper<T*> :
public true_type{};
163 template <
typename T>
struct is_pointer_helper<T*
const> :
public true_type{};
164 template <
typename T>
struct is_pointer_helper<T*
volatile> :
public true_type{};
165 template <
typename T>
struct is_pointer_helper<T*
const volatile> :
public true_type{};
167 template <
typename T>
168 struct is_pointer_value :
public type_and<is_pointer_helper<T>::value, type_not<is_member_pointer<T>::value>::value> {};
170 template <
typename T>
171 struct is_pointer :
public integral_constant<bool, is_pointer_value<T>::value>{};
182 template<
typename T,
typename U>
183 struct is_same :
public false_type { };
186 struct is_same<T, T> :
public true_type { };
212 #if !defined(__GNUC__) || (__GNUC__ >= 3) // GCC 2.x doesn't like the code below. 213 template <
typename From,
typename To,
bool is_from_
void = false,
bool is_to_
void = false>
214 struct is_convertible_helper {
215 static yes_type Test(To);
216 static no_type Test(...);
218 typedef integral_constant<bool, sizeof(Test(from)) == sizeof(yes_type)> result;
222 template <
typename From,
typename To>
223 struct is_convertible_helper<From, To, true, false> {
typedef false_type result; };
226 template <
typename From,
typename To,
bool is_from_
void>
227 struct is_convertible_helper<From, To, is_from_void, true> {
typedef true_type result; };
229 template <
typename From,
typename To>
230 struct is_convertible :
public is_convertible_helper<From, To, is_void<From>::value, is_void<To>::value>::result {};
233 template <
typename From,
typename To>
234 struct is_convertible :
public false_type{};
248 template <
typename T>
struct is_union :
public false_type{};
250 #define EASTL_DECLARE_UNION(T) namespace eastl{ template <> struct is_union<T> : public true_type{}; template <> struct is_union<const T> : public true_type{}; } 265 #if defined(__MWERKS__) 267 template <
typename T>
268 struct is_class :
public false_type{};
269 #elif !defined(__GNUC__) || (((__GNUC__ * 100) + __GNUC_MINOR__) >= 304) // Not GCC or GCC 3.4+ 270 template <
typename U>
static yes_type is_class_helper(
void (U::*)());
271 template <
typename U>
static no_type is_class_helper(...);
273 template <
typename T>
274 struct is_class :
public integral_constant<bool,
275 sizeof(is_class_helper<T>(0)) == sizeof(yes_type) && !is_union<T>::value
279 template <
typename T>
280 struct is_class :
public false_type{};
291 struct int_convertible{ int_convertible(
int); };
293 template <
bool is_arithmetic_or_reference>
294 struct is_enum_helper {
template <
typename T>
struct nest :
public is_convertible<T, int_convertible>{}; };
297 struct is_enum_helper<true> {
template <
typename T>
struct nest :
public false_type {}; };
299 template <
typename T>
300 struct is_enum_helper2
302 typedef type_or<is_arithmetic<T>::value, is_reference<T>::value, is_class<T>::value> selector;
303 typedef is_enum_helper<selector::value> helper_t;
304 typedef typename add_reference<T>::type ref_t;
305 typedef typename helper_t::template nest<ref_t> result;
308 template <
typename T>
309 struct is_enum :
public integral_constant<bool, is_enum_helper2<T>::result::value>{};
311 template <>
struct is_enum<void> :
public false_type {};
312 template <>
struct is_enum<void const> :
public false_type {};
313 template <>
struct is_enum<void volatile> :
public false_type {};
314 template <>
struct is_enum<void const volatile> :
public false_type {};
316 #define EASTL_DECLARE_ENUM(T) namespace eastl{ template <> struct is_enum<T> : public true_type{}; template <> struct is_enum<const T> : public true_type{}; } 327 template <
typename T>
328 struct is_polymorphic_imp1
330 typedef typename remove_cv<T>::type t;
332 struct helper_1 :
public t
339 struct helper_2 : public t
342 virtual ~helper_2() throw();
349 static const bool value = (
sizeof(helper_1) ==
sizeof(helper_2));
352 template <
typename T>
353 struct is_polymorphic_imp2{
static const bool value =
false; };
355 template <
bool is_
class>
356 struct is_polymorphic_selector{
template <
typename T>
struct rebind{
typedef is_polymorphic_imp2<T> type; }; };
359 struct is_polymorphic_selector<true>{
template <
typename T>
struct rebind{
typedef is_polymorphic_imp1<T> type; }; };
361 template <
typename T>
362 struct is_polymorphic_value{
363 typedef is_polymorphic_selector<is_class<T>::value> selector;
364 typedef typename selector::template rebind<T> binder;
365 typedef typename binder::type imp_type;
366 static const bool value = imp_type::value;
369 template <
typename T>
370 struct is_polymorphic :
public integral_constant<bool, is_polymorphic_value<T>::value>{};
381 template <
typename R>
struct is_function_ptr_helper :
public false_type{};
382 template <
typename R>
struct is_function_ptr_helper<R (*)()> :
public true_type{};
383 template <
typename R,
typename Arg0>
struct is_function_ptr_helper<R (*)(Arg0)> :
public true_type{};
384 template <
typename R,
typename Arg0,
typename Arg1>
struct is_function_ptr_helper<R (*)(Arg0, Arg1)> :
public true_type{};
385 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2)> :
public true_type{};
386 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2, Arg3)> :
public true_type{};
387 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2, Arg3, Arg4)> :
public true_type{};
388 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)> :
public true_type{};
389 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> :
public true_type{};
390 template <
typename R,
typename Arg0,
typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7>
struct is_function_ptr_helper<R (*)(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> :
public true_type{};
392 template <
bool is_ref = true>
393 struct is_function_chooser{
template <
typename T>
struct result_ :
public false_type{}; };
396 struct is_function_chooser<false>{
template <
typename T>
struct result_ :
public is_function_ptr_helper<T*>{}; };
398 template <
typename T>
399 struct is_function_value :
public is_function_chooser<is_reference<T>::value>::template result_<T>{};
401 template <
typename T>
402 struct is_function :
public integral_constant<bool, is_function_value<T>::value>{};
421 template <
typename T>
422 struct is_object :
public integral_constant<bool,
423 !is_reference<T>::value && !is_void<T>::value && !is_function<T>::value
438 template <
typename T>
439 struct is_scalar :
public integral_constant<bool, is_arithmetic<T>::value || is_enum<T>::value>{};
441 template <
typename T>
struct is_scalar<T*> :
public true_type {};
442 template <
typename T>
struct is_scalar<T*
const> :
public true_type {};
443 template <
typename T>
struct is_scalar<T*
volatile> :
public true_type {};
444 template <
typename T>
struct is_scalar<T*
const volatile> :
public true_type {};
462 template <
typename T>
463 struct is_compound :
public integral_constant<bool, !is_fundamental<T>::value>{};
469 #endif // Header include guard EA Standard Template Library.