From cfe27e79cfcbefb2b4479e04f80cbb299bc46965 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 5 Aug 2022 06:56:05 -0700 Subject: Map the absl::is_trivially_* functions to their std impl There's no point redefining these functions if they are supported by the compiler and the version of libstdc++. Also, some of the builtins used by the absl implementation of these functions (e.g. __has_trivial_destructor) have been deprecated in Clang 15. PiperOrigin-RevId: 465554125 Change-Id: I8674c3a5270ce3c654cdf58ae7dbd9d2bda8faa5 --- absl/meta/type_traits.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'absl/meta/type_traits.h') diff --git a/absl/meta/type_traits.h b/absl/meta/type_traits.h index d886cb30..46b76906 100644 --- a/absl/meta/type_traits.h +++ b/absl/meta/type_traits.h @@ -298,8 +298,12 @@ struct is_function // https://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html#Type-Traits. template struct is_trivially_destructible +#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE + : std::is_trivially_destructible { +#else : std::integral_constant::value> { +#endif #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE private: static constexpr bool compliant = std::is_trivially_destructible::value == @@ -347,9 +351,13 @@ struct is_trivially_destructible // Nontrivially destructible types will cause the expression to be nontrivial. template struct is_trivially_default_constructible +#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) + : std::is_trivially_default_constructible { +#else : std::integral_constant::value && is_trivially_destructible::value> { +#endif #if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) && \ !defined( \ ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION) @@ -381,10 +389,14 @@ struct is_trivially_default_constructible // expression to be nontrivial. template struct is_trivially_move_constructible +#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) + : std::is_trivially_move_constructible { +#else : std::conditional< std::is_object::value && !std::is_array::value, type_traits_internal::IsTriviallyMoveConstructibleObject, std::is_reference>::type::type { +#endif #if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) && \ !defined( \ ABSL_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION) @@ -490,9 +502,13 @@ struct is_trivially_move_assignable // `is_trivially_assignable`. template struct is_trivially_copy_assignable +#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE + : std::is_trivially_copy_assignable { +#else : std::integral_constant< bool, __has_trivial_assign(typename std::remove_reference::type) && absl::is_copy_assignable::value> { +#endif #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE private: static constexpr bool compliant = @@ -544,6 +560,11 @@ namespace type_traits_internal { // destructible. Arrays of trivially copyable types are trivially copyable. // // We expose this metafunction only for internal use within absl. + +#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_COPYABLE) +template +struct is_trivially_copyable : std::is_trivially_copyable {}; +#else template class is_trivially_copyable_impl { using ExtentsRemoved = typename std::remove_all_extents::type; @@ -569,6 +590,7 @@ template struct is_trivially_copyable : std::integral_constant< bool, type_traits_internal::is_trivially_copyable_impl::kValue> {}; +#endif } // namespace type_traits_internal // ----------------------------------------------------------------------------- -- cgit v1.2.3