aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Matsui <kmatsui@gcc.gnu.org>2023-07-12 13:43:44 -0700
committerKen Matsui <kmatsui@gcc.gnu.org>2024-06-13 07:00:00 -0700
commit014879ea4c86b3b8ab6b61a1226ee5b31e816c8b (patch)
treee82b4814cdb5e1566ea355761baab5066f390563
parent3b4d5b340a861b29eff40811c6c6638f54c28bf6 (diff)
downloadgcc-014879ea4c86b3b8ab6b61a1226ee5b31e816c8b.zip
gcc-014879ea4c86b3b8ab6b61a1226ee5b31e816c8b.tar.gz
gcc-014879ea4c86b3b8ab6b61a1226ee5b31e816c8b.tar.bz2
libstdc++: Optimize std::is_pointer compilation performance
This patch optimizes the compilation performance of std::is_pointer by dispatching to the new __is_pointer built-in trait. libstdc++-v3/ChangeLog: * include/bits/cpp_type_traits.h (__is_pointer): Use __is_pointer built-in trait. * include/std/type_traits (is_pointer): Likewise. Optimize its implementation. (is_pointer_v): Likewise. Co-authored-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> Reviewed-by: Patrick Palka <ppalka@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
-rw-r--r--libstdc++-v3/include/bits/cpp_type_traits.h8
-rw-r--r--libstdc++-v3/include/std/type_traits44
2 files changed, 44 insertions, 8 deletions
diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
index 59f1a18..679eee9 100644
--- a/libstdc++-v3/include/bits/cpp_type_traits.h
+++ b/libstdc++-v3/include/bits/cpp_type_traits.h
@@ -363,6 +363,13 @@ __INT_N(__GLIBCXX_TYPE_INT_N_3)
//
// Pointer types
//
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_pointer)
+ template<typename _Tp, bool _IsPtr = __is_pointer(_Tp)>
+ struct __is_pointer : __truth_type<_IsPtr>
+ {
+ enum { __value = _IsPtr };
+ };
+#else
template<typename _Tp>
struct __is_pointer
{
@@ -376,6 +383,7 @@ __INT_N(__GLIBCXX_TYPE_INT_N_3)
enum { __value = 1 };
typedef __true_type __type;
};
+#endif
//
// An arithmetic type is an integer type or a floating point type
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 8c8219b..0ef1129 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -542,19 +542,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: public true_type { };
#endif
- template<typename>
- struct __is_pointer_helper
+ /// is_pointer
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_pointer)
+ template<typename _Tp>
+ struct is_pointer
+ : public __bool_constant<__is_pointer(_Tp)>
+ { };
+#else
+ template<typename _Tp>
+ struct is_pointer
: public false_type { };
template<typename _Tp>
- struct __is_pointer_helper<_Tp*>
+ struct is_pointer<_Tp*>
: public true_type { };
- /// is_pointer
template<typename _Tp>
- struct is_pointer
- : public __is_pointer_helper<__remove_cv_t<_Tp>>::type
- { };
+ struct is_pointer<_Tp* const>
+ : public true_type { };
+
+ template<typename _Tp>
+ struct is_pointer<_Tp* volatile>
+ : public true_type { };
+
+ template<typename _Tp>
+ struct is_pointer<_Tp* const volatile>
+ : public true_type { };
+#endif
/// is_lvalue_reference
template<typename>
@@ -3306,8 +3320,22 @@ template <typename _Tp, size_t _Num>
inline constexpr bool is_array_v<_Tp[_Num]> = true;
#endif
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_pointer)
+template <typename _Tp>
+ inline constexpr bool is_pointer_v = __is_pointer(_Tp);
+#else
template <typename _Tp>
- inline constexpr bool is_pointer_v = is_pointer<_Tp>::value;
+ inline constexpr bool is_pointer_v = false;
+template <typename _Tp>
+ inline constexpr bool is_pointer_v<_Tp*> = true;
+template <typename _Tp>
+ inline constexpr bool is_pointer_v<_Tp* const> = true;
+template <typename _Tp>
+ inline constexpr bool is_pointer_v<_Tp* volatile> = true;
+template <typename _Tp>
+ inline constexpr bool is_pointer_v<_Tp* const volatile> = true;
+#endif
+
template <typename _Tp>
inline constexpr bool is_lvalue_reference_v = false;
template <typename _Tp>