147 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <list>10 11// template <class T, class Alloc>12// void swap(list<T,Alloc>& x, list<T,Alloc>& y); // constexpr since C++2613 14#include <list>15#include <cassert>16#include "test_macros.h"17#include "test_allocator.h"18#include "min_allocator.h"19 20TEST_CONSTEXPR_CXX26 bool test() {21 {22 int a1[] = {1, 3, 7, 9, 10};23 int a2[] = {0, 2, 4, 5, 6, 8, 11};24 std::list<int> c1(a1, a1 + 5);25 std::list<int> c2(a2, a2 + 7);26 std::list<int>::iterator it1 = c1.begin();27 std::list<int>::const_iterator it2 = c2.begin();28 swap(c1, c2);29 assert(c1 == std::list<int>(a2, a2 + 7));30 assert(c2 == std::list<int>(a1, a1 + 5));31 assert(it1 == c2.begin()); // Iterators remain valid32 assert(it2 == c1.begin()); // Iterators remain valid33 }34 {35 int a2[] = {0, 2, 4, 5, 6, 8, 11};36 std::list<int> c1;37 std::list<int> c2(a2, a2 + 7);38 swap(c1, c2);39 assert(c1 == std::list<int>(a2, a2 + 7));40 assert(c2.empty());41 assert(std::distance(c2.begin(), c2.end()) == 0);42 }43 {44 int a1[] = {1, 3, 7, 9, 10};45 std::list<int> c1(a1, a1 + 5);46 std::list<int> c2;47 swap(c1, c2);48 assert(c1.empty());49 assert(std::distance(c1.begin(), c1.end()) == 0);50 assert(c2 == std::list<int>(a1, a1 + 5));51 }52 {53 std::list<int> c1;54 std::list<int> c2;55 swap(c1, c2);56 assert(c1.empty());57 assert(std::distance(c1.begin(), c1.end()) == 0);58 assert(c2.empty());59 assert(std::distance(c2.begin(), c2.end()) == 0);60 }61 {62 int a1[] = {1, 3, 7, 9, 10};63 int a2[] = {0, 2, 4, 5, 6, 8, 11};64 typedef test_allocator<int> A;65 std::list<int, A> c1(a1, a1 + 5, A(1));66 std::list<int, A> c2(a2, a2 + 7, A(1));67 swap(c1, c2);68 assert((c1 == std::list<int, A>(a2, a2 + 7)));69 assert(c1.get_allocator() == A(1));70 assert((c2 == std::list<int, A>(a1, a1 + 5)));71 assert(c2.get_allocator() == A(1));72 }73 {74 int a1[] = {1, 3, 7, 9, 10};75 int a2[] = {0, 2, 4, 5, 6, 8, 11};76 typedef other_allocator<int> A;77 std::list<int, A> c1(a1, a1 + 5, A(1));78 std::list<int, A> c2(a2, a2 + 7, A(2));79 swap(c1, c2);80 assert((c1 == std::list<int, A>(a2, a2 + 7)));81 assert(c1.get_allocator() == A(2));82 assert((c2 == std::list<int, A>(a1, a1 + 5)));83 assert(c2.get_allocator() == A(1));84 }85#if TEST_STD_VER >= 1186 {87 int a1[] = {1, 3, 7, 9, 10};88 int a2[] = {0, 2, 4, 5, 6, 8, 11};89 std::list<int, min_allocator<int>> c1(a1, a1 + 5);90 std::list<int, min_allocator<int>> c2(a2, a2 + 7);91 swap(c1, c2);92 assert((c1 == std::list<int, min_allocator<int>>(a2, a2 + 7)));93 assert((c2 == std::list<int, min_allocator<int>>(a1, a1 + 5)));94 }95 {96 int a2[] = {0, 2, 4, 5, 6, 8, 11};97 std::list<int, min_allocator<int>> c1;98 std::list<int, min_allocator<int>> c2(a2, a2 + 7);99 swap(c1, c2);100 assert((c1 == std::list<int, min_allocator<int>>(a2, a2 + 7)));101 assert(c2.empty());102 assert(std::distance(c2.begin(), c2.end()) == 0);103 }104 {105 int a1[] = {1, 3, 7, 9, 10};106 std::list<int, min_allocator<int>> c1(a1, a1 + 5);107 std::list<int, min_allocator<int>> c2;108 swap(c1, c2);109 assert(c1.empty());110 assert(std::distance(c1.begin(), c1.end()) == 0);111 assert((c2 == std::list<int, min_allocator<int>>(a1, a1 + 5)));112 }113 {114 std::list<int, min_allocator<int>> c1;115 std::list<int, min_allocator<int>> c2;116 swap(c1, c2);117 assert(c1.empty());118 assert(std::distance(c1.begin(), c1.end()) == 0);119 assert(c2.empty());120 assert(std::distance(c2.begin(), c2.end()) == 0);121 }122 {123 int a1[] = {1, 3, 7, 9, 10};124 int a2[] = {0, 2, 4, 5, 6, 8, 11};125 typedef min_allocator<int> A;126 std::list<int, A> c1(a1, a1 + 5, A());127 std::list<int, A> c2(a2, a2 + 7, A());128 swap(c1, c2);129 assert((c1 == std::list<int, A>(a2, a2 + 7)));130 assert(c1.get_allocator() == A());131 assert((c2 == std::list<int, A>(a1, a1 + 5)));132 assert(c2.get_allocator() == A());133 }134#endif135 136 return true;137}138 139int main(int, char**) {140 assert(test());141#if TEST_STD_VER >= 26142 static_assert(test());143#endif144 145 return 0;146}147