@@ -128,58 +128,18 @@ namespace eastl
128128
129129 #define EASTL_TYPE_TRAIT_is_member_function_pointer_CONFORMANCE 1 // is_member_function_pointer is conforming; doesn't make mistakes.
130130
131- // To do: Revise this to support C++11 variadic templates when possible.
132- // To do: We can probably also use remove_cv to simply the multitude of types below.
133-
134- template <typename T> struct is_mem_fun_pointer_value : public false_type {};
135-
136- template <typename R, typename T> struct is_mem_fun_pointer_value <R (T::*)()> : public true_type{};
137- template <typename R, typename T> struct is_mem_fun_pointer_value <R (T::*)() const > : public true_type{};
138- template <typename R, typename T> struct is_mem_fun_pointer_value <R (T::*)() volatile > : public true_type{};
139- template <typename R, typename T> struct is_mem_fun_pointer_value <R (T::*)() const volatile > : public true_type{};
140-
141- template <typename R, typename T, typename Arg0> struct is_mem_fun_pointer_value <R (T::*)(Arg0)> : public true_type{};
142- template <typename R, typename T, typename Arg0> struct is_mem_fun_pointer_value <R (T::*)(Arg0) const > : public true_type{};
143- template <typename R, typename T, typename Arg0> struct is_mem_fun_pointer_value <R (T::*)(Arg0) volatile > : public true_type{};
144- template <typename R, typename T, typename Arg0> struct is_mem_fun_pointer_value <R (T::*)(Arg0) const volatile > : public true_type{};
145-
146- template <typename R, typename T, typename Arg0, typename Arg1> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1)> : public true_type{};
147- template <typename R, typename T, typename Arg0, typename Arg1> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1) const > : public true_type{};
148- template <typename R, typename T, typename Arg0, typename Arg1> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1) volatile > : public true_type{};
149- template <typename R, typename T, typename Arg0, typename Arg1> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1) const volatile > : public true_type{};
150-
151- 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{};
152- 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{};
153- template <typename R, typename T, typename Arg0, typename Arg1, typename Arg2> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1, Arg2) volatile > : public true_type{};
154- template <typename R, typename T, typename Arg0, typename Arg1, typename Arg2> struct is_mem_fun_pointer_value <R (T::*)(Arg0, Arg1, Arg2) const volatile > : public true_type{};
155-
156- 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{};
157- 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{};
158- 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) volatile > : public true_type{};
159- 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 volatile > : public true_type{};
160-
161- 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{};
162- 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{};
163- 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) volatile > : public true_type{};
164- 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 volatile > : public true_type{};
165-
166- 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{};
167- 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{};
168- 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) volatile > : public true_type{};
169- 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 volatile > : public true_type{};
170-
171- 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{};
172- 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{};
173- 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) volatile > : public true_type{};
174- 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 volatile > : public true_type{};
175-
176- 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{};
177- 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{};
178- 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) volatile > : public true_type{};
179- 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 volatile > : public true_type{};
131+ namespace internal
132+ {
133+ template <typename T>
134+ struct is_member_function_pointer_helper : false_type {};
180135
181- template <typename T>
182- struct is_member_function_pointer : public integral_constant <bool , is_mem_fun_pointer_value<T>::value>{};
136+ template <typename T, typename U>
137+ struct is_member_function_pointer_helper <T U::*> : is_function<T> {};
138+ }
139+
140+ template <typename T>
141+ struct is_member_function_pointer
142+ : internal::is_member_function_pointer_helper<typename remove_cv<T>::type> {};
183143
184144 #if EASTL_VARIABLE_TEMPLATES_ENABLED
185145 template <typename T>
@@ -198,13 +158,19 @@ namespace eastl
198158
199159 #define EASTL_TYPE_TRAIT_is_member_pointer_CONFORMANCE 1 // is_member_pointer is conforming; doesn't make mistakes.
200160
201- template <typename T>
202- struct is_member_pointer
203- : public eastl::integral_constant<bool , eastl::is_member_function_pointer<T>::value>{};
161+ namespace internal {
162+ template <typename T>
163+ struct is_member_pointer_helper
164+ : public eastl::false_type {};
204165
205- template <typename T, typename U>
206- struct is_member_pointer <U T::*>
207- : public eastl::true_type{};
166+ template <typename T, typename U>
167+ struct is_member_pointer_helper <U T::*>
168+ : public eastl::true_type {};
169+ }
170+
171+ template <typename T>
172+ struct is_member_pointer
173+ : public internal::is_member_pointer_helper<typename remove_cv<T>::type>::type {};
208174
209175 #if EASTL_VARIABLE_TEMPLATES_ENABLED
210176 template <typename T>
@@ -690,7 +656,7 @@ namespace eastl
690656 // /////////////////////////////////////////////////////////////////////
691657 // is_final
692658 // /////////////////////////////////////////////////////////////////////
693- #if EA_COMPILER_HAS_FEATURE(is_final)
659+ #if EASTL_IS_FINAL_AVAILABLE == 1
694660 template <typename T>
695661 struct is_final : public integral_constant <bool , __is_final(T)> {};
696662 #else
@@ -722,7 +688,7 @@ namespace eastl
722688 // * no default member initializers
723689 //
724690 // /////////////////////////////////////////////////////////////////////
725- #if EA_COMPILER_HAS_FEATURE(is_aggregate) || defined(_MSC_VER) && (_MSC_VER >= 1916) // VS2017 15.9+
691+ #if EASTL_IS_AGGREGATE_AVAILABLE == 1
726692 #define EASTL_TYPE_TRAIT_is_aggregate_CONFORMANCE 1
727693
728694 template <typename T>
0 commit comments