libstdc++: Optimize std::is_member_object_pointer compilation performance

This patch optimizes the compilation performance of
std::is_member_object_pointer by dispatching to the new
__is_member_object_pointer built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_member_object_pointer): Use
	__is_member_object_pointer built-in trait.
	(is_member_object_pointer_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
This commit is contained in:
Ken Matsui 2023-09-12 00:14:06 -07:00
parent 53f9d0cc07
commit fa454b8dd0
No known key found for this signature in database

View file

@ -574,6 +574,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct is_rvalue_reference<_Tp&&>
: public true_type { };
/// is_member_object_pointer
#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_member_object_pointer)
template<typename _Tp>
struct is_member_object_pointer
: public __bool_constant<__is_member_object_pointer(_Tp)>
{ };
#else
template<typename>
struct __is_member_object_pointer_helper
: public false_type { };
@ -582,11 +589,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __is_member_object_pointer_helper<_Tp _Cp::*>
: public __not_<is_function<_Tp>>::type { };
/// is_member_object_pointer
template<typename _Tp>
struct is_member_object_pointer
: public __is_member_object_pointer_helper<__remove_cv_t<_Tp>>::type
{ };
#endif
#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_member_function_pointer)
/// is_member_function_pointer
@ -3213,9 +3221,16 @@ template <typename _Tp>
inline constexpr bool is_rvalue_reference_v = false;
template <typename _Tp>
inline constexpr bool is_rvalue_reference_v<_Tp&&> = true;
#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_member_object_pointer)
template <typename _Tp>
inline constexpr bool is_member_object_pointer_v =
__is_member_object_pointer(_Tp);
#else
template <typename _Tp>
inline constexpr bool is_member_object_pointer_v =
is_member_object_pointer<_Tp>::value;
#endif
#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_member_function_pointer)
template <typename _Tp>