Fix a TODO to use std::is_nothrow_swappable when it became available.
Also, change the noexcept specification of swap to match https://en.cppreference.com/w/cpp/container/unordered_set/swap.html and use AllocTraits alias in the noexcept specification of move assignment.
PiperOrigin-RevId: 783772831
Change-Id: Id6c7df564adb9bad38dbd7a08aff1e936daee55f
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h
index 1c8e654..956ab8c 100644
--- a/absl/container/internal/raw_hash_set.h
+++ b/absl/container/internal/raw_hash_set.h
@@ -368,17 +368,6 @@
std::declval<Ts>()...))>,
Policy, Hash, Eq, Ts...> : std::true_type {};
-// TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it.
-template <class T>
-constexpr bool IsNoThrowSwappable(std::true_type = {} /* is_swappable */) {
- using std::swap;
- return noexcept(swap(std::declval<T&>(), std::declval<T&>()));
-}
-template <class T>
-constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) {
- return false;
-}
-
ABSL_DLL extern ctrl_t kDefaultIterControl;
// We use these sentinel capacity values in debug mode to indicate different
@@ -2333,7 +2322,7 @@
}
raw_hash_set& operator=(raw_hash_set&& that) noexcept(
- absl::allocator_traits<allocator_type>::is_always_equal::value &&
+ AllocTraits::is_always_equal::value &&
std::is_nothrow_move_assignable<hasher>::value &&
std::is_nothrow_move_assignable<key_equal>::value) {
// TODO(sbenza): We should only use the operations from the noexcept clause
@@ -2770,9 +2759,9 @@
}
void swap(raw_hash_set& that) noexcept(
- IsNoThrowSwappable<hasher>() && IsNoThrowSwappable<key_equal>() &&
- IsNoThrowSwappable<allocator_type>(
- typename AllocTraits::propagate_on_container_swap{})) {
+ AllocTraits::is_always_equal::value &&
+ std::is_nothrow_swappable<hasher>::value &&
+ std::is_nothrow_swappable<key_equal>::value) {
AssertNotDebugCapacity();
that.AssertNotDebugCapacity();
using std::swap;
diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc
index e1dafff..044e5b5 100644
--- a/absl/container/internal/raw_hash_set_test.cc
+++ b/absl/container/internal/raw_hash_set_test.cc
@@ -2247,12 +2247,10 @@
}
TEST(Table, NoThrowSwappable) {
- ASSERT_TRUE(
- container_internal::IsNoThrowSwappable<absl::Hash<absl::string_view>>());
- ASSERT_TRUE(container_internal::IsNoThrowSwappable<
- std::equal_to<absl::string_view>>());
- ASSERT_TRUE(container_internal::IsNoThrowSwappable<std::allocator<int>>());
- EXPECT_TRUE(container_internal::IsNoThrowSwappable<StringTable>());
+ ASSERT_TRUE(std::is_nothrow_swappable<absl::Hash<absl::string_view>>());
+ ASSERT_TRUE(std::is_nothrow_swappable<std::equal_to<absl::string_view>>());
+ ASSERT_TRUE(std::is_nothrow_swappable<std::allocator<int>>());
+ EXPECT_TRUE(std::is_nothrow_swappable<StringTable>());
}
TEST(Table, HeterogeneousLookup) {