//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 // // vector // vector& operator=(vector&& c); #include #include #include "min_allocator.h" #include "test_allocator.h" #include "test_macros.h" TEST_CONSTEXPR_CXX20 void test_move_assignment(unsigned N) { // // Testing for container move where either POCMA = true_type or the allocators compare equal // { // Test with POCMA = true_type std::vector > l(N, true, other_allocator(5)); std::vector > lo(N, true, other_allocator(5)); std::vector > l2(N + 10, false, other_allocator(42)); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(l.empty()); // After move, source vector is in a vliad but unspecified state. libc++ leaves it empty. assert(l2.get_allocator() == lo.get_allocator()); } { // Test with POCMA = false_type and allocators compare equal std::vector > l(N, true, test_allocator(5)); std::vector > lo(N, true, test_allocator(5)); std::vector > l2(N + 10, false, test_allocator(5)); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(l.empty()); assert(l2.get_allocator() == lo.get_allocator()); } { // Test with POCMA = false_type and allocators compare equal std::vector > l(N, true, min_allocator{}); std::vector > lo(N, true, min_allocator{}); std::vector > l2(N + 10, false, min_allocator{}); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(l.empty()); assert(l2.get_allocator() == lo.get_allocator()); } // // Testing for element-wise move where POCMA = false_type and allocators compare unequal // { // Test with reallocation during the element-wise move due to empty destination vector. std::vector > l(N, true, test_allocator(5)); std::vector > lo(N, true, test_allocator(5)); std::vector > l2(test_allocator(42)); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(!l.empty()); assert(l2.get_allocator() == test_allocator(42)); } { // Test with reallocation occurs during the element-wise move due to insufficient destination space. std::vector > l(N + 64, true, test_allocator(5)); std::vector > lo(N + 64, true, test_allocator(5)); std::vector > l2(10, false, test_allocator(42)); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(!l.empty()); assert(l2.get_allocator() == test_allocator(42)); } { // Test without reallocation where source vector elements fit within destination size. std::vector > l(N, true, test_allocator(5)); std::vector > lo(N, true, test_allocator(5)); std::vector > l2(N * 2, false, test_allocator(42)); l2 = std::move(l); assert(l2 == lo); LIBCPP_ASSERT(!l.empty()); assert(l2.get_allocator() == test_allocator(42)); } } TEST_CONSTEXPR_CXX20 bool tests() { test_move_assignment(3); test_move_assignment(18); test_move_assignment(33); test_move_assignment(65); test_move_assignment(299); return true; } int main(int, char**) { tests(); #if TEST_STD_VER > 17 static_assert(tests()); #endif return 0; }