1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <list>
11 
12 // void splice(const_iterator position, list& x, iterator first, iterator last);
13 
14 #if _LIBCPP_DEBUG >= 1
15 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
16 #endif
17 
18 #include <list>
19 #include <cassert>
20 
21 #include "min_allocator.h"
22 
main()23 int main()
24 {
25     int a1[] = {1, 2, 3};
26     int a2[] = {4, 5, 6};
27     {
28         std::list<int> l1(a1, a1+3);
29         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin()));
30         assert(l1.size() == 3);
31         assert(distance(l1.begin(), l1.end()) == 3);
32         std::list<int>::const_iterator i = l1.begin();
33         assert(*i == 1);
34         ++i;
35         assert(*i == 2);
36         ++i;
37         assert(*i == 3);
38     }
39     {
40         std::list<int> l1(a1, a1+3);
41         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin(), 2));
42         assert(l1.size() == 3);
43         assert(distance(l1.begin(), l1.end()) == 3);
44         std::list<int>::const_iterator i = l1.begin();
45         assert(*i == 2);
46         ++i;
47         assert(*i == 1);
48         ++i;
49         assert(*i == 3);
50     }
51     {
52         std::list<int> l1(a1, a1+3);
53         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin(), 3));
54         assert(l1.size() == 3);
55         assert(distance(l1.begin(), l1.end()) == 3);
56         std::list<int>::const_iterator i = l1.begin();
57         assert(*i == 2);
58         ++i;
59         assert(*i == 3);
60         ++i;
61         assert(*i == 1);
62     }
63     {
64         std::list<int> l1(a1, a1+3);
65         std::list<int> l2(a2, a2+3);
66         l1.splice(l1.begin(), l2, next(l2.begin()), l2.end());
67         assert(l1.size() == 5);
68         assert(distance(l1.begin(), l1.end()) == 5);
69         std::list<int>::const_iterator i = l1.begin();
70         assert(*i == 5);
71         ++i;
72         assert(*i == 6);
73         ++i;
74         assert(*i == 1);
75         ++i;
76         assert(*i == 2);
77         ++i;
78         assert(*i == 3);
79         assert(l2.size() == 1);
80         i = l2.begin();
81         assert(*i == 4);
82     }
83     {
84         std::list<int> l1(a1, a1+3);
85         std::list<int> l2(a2, a2+3);
86         l1.splice(next(l1.begin()), l2, next(l2.begin()), l2.end());
87         assert(l1.size() == 5);
88         assert(distance(l1.begin(), l1.end()) == 5);
89         std::list<int>::const_iterator i = l1.begin();
90         assert(*i == 1);
91         ++i;
92         assert(*i == 5);
93         ++i;
94         assert(*i == 6);
95         ++i;
96         assert(*i == 2);
97         ++i;
98         assert(*i == 3);
99         assert(l2.size() == 1);
100         i = l2.begin();
101         assert(*i == 4);
102     }
103     {
104         std::list<int> l1(a1, a1+3);
105         std::list<int> l2(a2, a2+3);
106         l1.splice(l1.end(), l2, next(l2.begin()), l2.end());
107         assert(l1.size() == 5);
108         assert(distance(l1.begin(), l1.end()) == 5);
109         std::list<int>::const_iterator i = l1.begin();
110         assert(*i == 1);
111         ++i;
112         assert(*i == 2);
113         ++i;
114         assert(*i == 3);
115         ++i;
116         assert(*i == 5);
117         ++i;
118         assert(*i == 6);
119         assert(l2.size() == 1);
120         i = l2.begin();
121         assert(*i == 4);
122     }
123 #if _LIBCPP_DEBUG >= 1
124     {
125         std::list<int> v1(3);
126         std::list<int> v2(3);
127         v1.splice(v1.begin(), v2, v2.begin(), v1.end());
128         assert(false);
129     }
130 #endif
131 #if __cplusplus >= 201103L
132     {
133         std::list<int, min_allocator<int>> l1(a1, a1+3);
134         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin()));
135         assert(l1.size() == 3);
136         assert(distance(l1.begin(), l1.end()) == 3);
137         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
138         assert(*i == 1);
139         ++i;
140         assert(*i == 2);
141         ++i;
142         assert(*i == 3);
143     }
144     {
145         std::list<int, min_allocator<int>> l1(a1, a1+3);
146         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin(), 2));
147         assert(l1.size() == 3);
148         assert(distance(l1.begin(), l1.end()) == 3);
149         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
150         assert(*i == 2);
151         ++i;
152         assert(*i == 1);
153         ++i;
154         assert(*i == 3);
155     }
156     {
157         std::list<int, min_allocator<int>> l1(a1, a1+3);
158         l1.splice(l1.begin(), l1, next(l1.begin()), next(l1.begin(), 3));
159         assert(l1.size() == 3);
160         assert(distance(l1.begin(), l1.end()) == 3);
161         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
162         assert(*i == 2);
163         ++i;
164         assert(*i == 3);
165         ++i;
166         assert(*i == 1);
167     }
168     {
169         std::list<int, min_allocator<int>> l1(a1, a1+3);
170         std::list<int, min_allocator<int>> l2(a2, a2+3);
171         l1.splice(l1.begin(), l2, next(l2.begin()), l2.end());
172         assert(l1.size() == 5);
173         assert(distance(l1.begin(), l1.end()) == 5);
174         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
175         assert(*i == 5);
176         ++i;
177         assert(*i == 6);
178         ++i;
179         assert(*i == 1);
180         ++i;
181         assert(*i == 2);
182         ++i;
183         assert(*i == 3);
184         assert(l2.size() == 1);
185         i = l2.begin();
186         assert(*i == 4);
187     }
188     {
189         std::list<int, min_allocator<int>> l1(a1, a1+3);
190         std::list<int, min_allocator<int>> l2(a2, a2+3);
191         l1.splice(next(l1.begin()), l2, next(l2.begin()), l2.end());
192         assert(l1.size() == 5);
193         assert(distance(l1.begin(), l1.end()) == 5);
194         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
195         assert(*i == 1);
196         ++i;
197         assert(*i == 5);
198         ++i;
199         assert(*i == 6);
200         ++i;
201         assert(*i == 2);
202         ++i;
203         assert(*i == 3);
204         assert(l2.size() == 1);
205         i = l2.begin();
206         assert(*i == 4);
207     }
208     {
209         std::list<int, min_allocator<int>> l1(a1, a1+3);
210         std::list<int, min_allocator<int>> l2(a2, a2+3);
211         l1.splice(l1.end(), l2, next(l2.begin()), l2.end());
212         assert(l1.size() == 5);
213         assert(distance(l1.begin(), l1.end()) == 5);
214         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
215         assert(*i == 1);
216         ++i;
217         assert(*i == 2);
218         ++i;
219         assert(*i == 3);
220         ++i;
221         assert(*i == 5);
222         ++i;
223         assert(*i == 6);
224         assert(l2.size() == 1);
225         i = l2.begin();
226         assert(*i == 4);
227     }
228 #if _LIBCPP_DEBUG >= 1
229     {
230         std::list<int, min_allocator<int>> v1(3);
231         std::list<int, min_allocator<int>> v2(3);
232         v1.splice(v1.begin(), v2, v2.begin(), v1.end());
233         assert(false);
234     }
235 #endif
236 #endif
237 }
238