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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <list>
10
11// template <class T, class Alloc>
12// void swap(list<T,Alloc>& x, list<T,Alloc>& y);
13
14#include <list>
15#include <cassert>
16#include "test_macros.h"
17#include "test_allocator.h"
18#include "min_allocator.h"
19
20int main(int, char**) {
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(x&: c1, y&: 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 valid
32 assert(it2 == c1.begin()); // Iterators remain valid
33 }
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(x&: c1, y&: 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(x&: c1, y&: 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(x&: c1, y&: 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(x&: c1, y&: 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 >= 11
86 {
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#endif
135
136 return 0;
137}
138

source code of libcxx/test/std/containers/sequences/list/list.special/swap.pass.cpp