Skip to content

Commit

Permalink
[test] Move NoexceptnessOfSwap into individual aa_inplace_vector tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Quuxplusone committed Aug 25, 2024
1 parent 338e1ec commit 8c79ca7
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 10 deletions.
38 changes: 36 additions & 2 deletions test/aa_inplace_vector_pmr_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -44,11 +45,39 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_trivially_copy_assignable_v<T>);
static_assert(!std::is_trivially_move_assignable_v<T>);
static_assert(!std::is_trivially_destructible_v<T>);
static_assert(!std::is_nothrow_copy_constructible_v<T>);
static_assert(!std::is_nothrow_move_constructible_v<T>); // because pmr::vector isn't nothrow move-assignable
static_assert(!std::is_nothrow_copy_constructible_v<T>); // because T(const T&, Alloc) is throwing
static_assert(!std::is_nothrow_move_constructible_v<T>); // because T(T&&, Alloc) is throwing
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(!std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(!std::is_nothrow_swappable_v<T>); // because T::operator= is throwing
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
}
{
// Test with a type that is trivial, but still cares about the value
// of the allocator with which it's constructed.
//
struct Dummy {
using allocator_type = std::pmr::polymorphic_allocator<Dummy>;
explicit Dummy(allocator_type) noexcept;
explicit Dummy(Dummy&&, allocator_type) noexcept;
explicit Dummy(const Dummy&, allocator_type) noexcept;
};
using T = sg14::pmr::inplace_vector<std::pmr::vector<int>, 10>;
static_assert(!std::is_trivially_copyable_v<T>);
static_assert(!std::is_trivially_copy_constructible_v<T>);
static_assert(!std::is_trivially_move_constructible_v<T>);
static_assert(!std::is_trivially_copy_assignable_v<T>);
static_assert(!std::is_trivially_move_assignable_v<T>);
static_assert(!std::is_trivially_destructible_v<T>);
static_assert(!std::is_nothrow_copy_constructible_v<T>); // because A::construct is throwing
static_assert(!std::is_nothrow_move_constructible_v<T>); // because A::construct is throwing
static_assert(!std::is_nothrow_copy_assignable_v<T>); // because A::construct is throwing
static_assert(!std::is_nothrow_move_assignable_v<T>); // because A::construct is throwing
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(!std::is_nothrow_swappable_v<T>); // because A::construct is throwing
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -66,6 +95,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -83,6 +113,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -100,6 +131,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -117,6 +149,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -134,6 +167,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand Down
9 changes: 9 additions & 0 deletions test/aa_inplace_vector_smallsize_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -56,6 +57,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -74,6 +76,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T> == !msvc);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T> == msvc);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -91,6 +94,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -108,6 +112,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -125,6 +130,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -142,6 +148,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -159,6 +166,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -176,6 +184,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand Down
9 changes: 9 additions & 0 deletions test/aa_inplace_vector_stdallocator_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -36,6 +37,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -54,6 +56,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T> == !msvc);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T> == msvc);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -71,6 +74,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -88,6 +92,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -105,6 +110,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -122,6 +128,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -139,6 +146,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -156,6 +164,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand Down
9 changes: 1 addition & 8 deletions test/inplace_vector_common_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,16 +450,9 @@ TEST(IPV_TEST_NAME, Noexceptness)
static_assert(!noexcept(v.erase(v.begin(), v.end())));
}

TEST(IPV_TEST_NAME, NoexceptnessOfSwap)
TEST(IPV_TEST_NAME, SwapWhenElementSwappingThrows)
{
using std::swap;
{
std::string lvalue;
sg14::inplace_vector<std::string, 10> v;
static_assert(noexcept(swap(lvalue, lvalue)));
static_assert(noexcept(v.swap(v)));
static_assert(noexcept(swap(v, v)));
}
{
struct ThrowingSwappable {
explicit ThrowingSwappable() { }
Expand Down
9 changes: 9 additions & 0 deletions test/inplace_vector_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -36,6 +37,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -54,6 +56,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T> == !msvc);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T> == msvc);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -71,6 +74,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -88,6 +92,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(!std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -105,6 +110,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -122,6 +128,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -139,6 +146,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(std::is_nothrow_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand All @@ -156,6 +164,7 @@ TEST(IPV_TEST_NAME, TrivialTraits)
static_assert(!std::is_copy_assignable_v<T>);
static_assert(std::is_nothrow_move_assignable_v<T>);
static_assert(std::is_nothrow_destructible_v<T>);
static_assert(std::is_nothrow_swappable_v<T>);
#if defined(__cpp_lib_trivially_relocatable)
static_assert(std::is_trivially_relocatable_v<T>);
#endif // __cpp_lib_trivially_relocatable
Expand Down

0 comments on commit 8c79ca7

Please sign in to comment.