blob: f252080c7821a69ed5b8e10f43a5291b83acabac [file] [log] [blame]
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +00001//===- unittests/ADT/SimpleIListTest.cpp - simple_ilist unit tests --------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ADT/simple_ilist.h"
11#include "gtest/gtest.h"
12
13using namespace llvm;
14
15namespace {
16
17struct Node : ilist_node<Node> {};
18bool operator<(const Node &L, const Node &R) { return &L < &R; }
19bool makeFalse(const Node &, const Node &) { return false; }
20
21struct deleteNode : std::default_delete<Node> {};
22void doNothing(Node *) {}
23
24TEST(SimpleIListTest, DefaultConstructor) {
25 simple_ilist<Node> L;
26 EXPECT_EQ(L.begin(), L.end());
27 EXPECT_TRUE(L.empty());
28 EXPECT_EQ(0u, L.size());
29}
30
31TEST(SimpleIListTest, pushPopFront) {
32 simple_ilist<Node> L;
33 Node A, B;
34 L.push_front(B);
35 L.push_front(A);
36 EXPECT_EQ(&A, &L.front());
37 EXPECT_EQ(&B, &L.back());
38 EXPECT_FALSE(L.empty());
39 EXPECT_EQ(2u, L.size());
40
41 // Pop front and check the new front.
42 L.pop_front();
43 EXPECT_EQ(&B, &L.front());
44
45 // Pop to empty.
46 L.pop_front();
47 EXPECT_TRUE(L.empty());
48}
49
50TEST(SimpleIListTest, pushPopBack) {
51 simple_ilist<Node> L;
52 Node A, B;
53 L.push_back(A);
54 L.push_back(B);
55 EXPECT_EQ(&A, &L.front());
56 EXPECT_EQ(&B, &L.back());
57 EXPECT_FALSE(L.empty());
58 EXPECT_EQ(2u, L.size());
59
60 // Pop back and check the new front.
61 L.pop_back();
62 EXPECT_EQ(&A, &L.back());
63
64 // Pop to empty.
65 L.pop_back();
66 EXPECT_TRUE(L.empty());
67}
68
69TEST(SimpleIListTest, swap) {
70 simple_ilist<Node> L1, L2;
71 Node A, B;
72 L1.push_back(A);
73 L1.push_back(B);
74 L1.swap(L2);
75 EXPECT_TRUE(L1.empty());
76 EXPECT_EQ(0u, L1.size());
77 EXPECT_EQ(&A, &L2.front());
78 EXPECT_EQ(&B, &L2.back());
79 EXPECT_FALSE(L2.empty());
80 EXPECT_EQ(2u, L2.size());
81}
82
83TEST(SimpleIListTest, insertEraseAtEnd) {
84 simple_ilist<Node> L;
85 Node A, B;
86 L.insert(L.end(), A);
87 L.insert(L.end(), B);
88 EXPECT_EQ(&A, &L.front());
89 EXPECT_EQ(&B, &L.back());
90 EXPECT_FALSE(L.empty());
91 EXPECT_EQ(2u, L.size());
92}
93
94TEST(SimpleIListTest, insertAtBegin) {
95 simple_ilist<Node> L;
96 Node A, B;
97 L.insert(L.begin(), B);
98 L.insert(L.begin(), A);
99 EXPECT_EQ(&A, &L.front());
100 EXPECT_EQ(&B, &L.back());
101 EXPECT_FALSE(L.empty());
102 EXPECT_EQ(2u, L.size());
103}
104
105TEST(SimpleIListTest, remove) {
106 simple_ilist<Node> L;
107 Node A, B, C;
108 L.push_back(A);
109 L.push_back(B);
110 L.push_back(C);
111 EXPECT_EQ(&A, &L.front());
112 EXPECT_EQ(&B, &*++L.begin());
113 EXPECT_EQ(&C, &L.back());
114 EXPECT_EQ(3u, L.size());
115
116 L.remove(B);
117 EXPECT_EQ(&A, &L.front());
118 EXPECT_EQ(&C, &L.back());
119 EXPECT_EQ(2u, L.size());
120
121 L.remove(A);
122 EXPECT_EQ(&C, &L.front());
123 EXPECT_EQ(1u, L.size());
124
125 L.remove(C);
126 EXPECT_TRUE(L.empty());
127}
128
129TEST(SimpleIListTest, removeAndDispose) {
130 simple_ilist<Node> L;
131 Node A, C;
132 Node *B = new Node;
133 L.push_back(A);
134 L.push_back(*B);
135 L.push_back(C);
136 EXPECT_EQ(&A, &L.front());
137 EXPECT_EQ(B, &*++L.begin());
138 EXPECT_EQ(&C, &L.back());
139 EXPECT_EQ(3u, L.size());
140
141 L.removeAndDispose(*B, deleteNode());
142 EXPECT_EQ(&A, &L.front());
143 EXPECT_EQ(&C, &L.back());
144 EXPECT_EQ(2u, L.size());
145}
146
147TEST(SimpleIListTest, removeAndDisposeNullDeleter) {
148 simple_ilist<Node> L;
149 Node A, B, C;
150 L.push_back(A);
151 L.push_back(B);
152 L.push_back(C);
153 EXPECT_EQ(&A, &L.front());
154 EXPECT_EQ(&B, &*++L.begin());
155 EXPECT_EQ(&C, &L.back());
156 EXPECT_EQ(3u, L.size());
157
158 L.removeAndDispose(B, doNothing);
159 EXPECT_EQ(&A, &L.front());
160 EXPECT_EQ(&C, &L.back());
161 EXPECT_EQ(2u, L.size());
162}
163
164TEST(SimpleIListTest, erase) {
165 simple_ilist<Node> L;
166 Node A, B, C;
167 L.push_back(A);
168 L.push_back(B);
169 L.push_back(C);
170 EXPECT_EQ(&A, &L.front());
171 EXPECT_EQ(&B, &*++L.begin());
172 EXPECT_EQ(&C, &L.back());
173 EXPECT_EQ(3u, L.size());
174
175 EXPECT_EQ(C.getIterator(), L.erase(B.getIterator()));
176 EXPECT_EQ(&A, &L.front());
177 EXPECT_EQ(&C, &L.back());
178 EXPECT_EQ(2u, L.size());
179}
180
181TEST(SimpleIListTest, eraseAndDispose) {
182 simple_ilist<Node> L;
183 Node A, C;
184 Node *B = new Node;
185 L.push_back(A);
186 L.push_back(*B);
187 L.push_back(C);
188 EXPECT_EQ(&A, &L.front());
189 EXPECT_EQ(B, &*++L.begin());
190 EXPECT_EQ(&C, &L.back());
191 EXPECT_EQ(3u, L.size());
192
193 L.eraseAndDispose(B->getIterator(), deleteNode());
194 EXPECT_EQ(&A, &L.front());
195 EXPECT_EQ(&C, &L.back());
196 EXPECT_EQ(2u, L.size());
197}
198
199TEST(SimpleIListTest, eraseAndDisposeNullDeleter) {
200 simple_ilist<Node> L;
201 Node A, B, C;
202 L.push_back(A);
203 L.push_back(B);
204 L.push_back(C);
205 EXPECT_EQ(&A, &L.front());
206 EXPECT_EQ(&B, &*++L.begin());
207 EXPECT_EQ(&C, &L.back());
208 EXPECT_EQ(3u, L.size());
209
210 L.eraseAndDispose(B.getIterator(), doNothing);
211 EXPECT_EQ(&A, &L.front());
212 EXPECT_EQ(&C, &L.back());
213 EXPECT_EQ(2u, L.size());
214}
215
216TEST(SimpleIListTest, eraseRange) {
217 simple_ilist<Node> L;
218 Node A, B, C, D, E;
219 L.push_back(A);
220 L.push_back(B);
221 L.push_back(C);
222 L.push_back(D);
223 L.push_back(E);
224 auto I = L.begin();
225 EXPECT_EQ(&A, &*I++);
226 EXPECT_EQ(&B, &*I++);
227 EXPECT_EQ(&C, &*I++);
228 EXPECT_EQ(&D, &*I++);
229 EXPECT_EQ(&E, &*I++);
230 EXPECT_EQ(L.end(), I);
231 EXPECT_EQ(5u, L.size());
232
233 // Erase a range.
234 EXPECT_EQ(E.getIterator(), L.erase(B.getIterator(), E.getIterator()));
235 EXPECT_EQ(&A, &L.front());
236 EXPECT_EQ(&E, &L.back());
237 EXPECT_EQ(2u, L.size());
238}
239
240TEST(SimpleIListTest, eraseAndDisposeRange) {
241 simple_ilist<Node> L;
242 Node A, *B = new Node, *C = new Node, *D = new Node, E;
243 L.push_back(A);
244 L.push_back(*B);
245 L.push_back(*C);
246 L.push_back(*D);
247 L.push_back(E);
248 auto I = L.begin();
249 EXPECT_EQ(&A, &*I++);
250 EXPECT_EQ(B, &*I++);
251 EXPECT_EQ(C, &*I++);
252 EXPECT_EQ(D, &*I++);
253 EXPECT_EQ(&E, &*I++);
254 EXPECT_EQ(L.end(), I);
255 EXPECT_EQ(5u, L.size());
256
257 // Erase a range.
258 EXPECT_EQ(E.getIterator(),
259 L.eraseAndDispose(B->getIterator(), E.getIterator(), deleteNode()));
260 EXPECT_EQ(&A, &L.front());
261 EXPECT_EQ(&E, &L.back());
262 EXPECT_EQ(2u, L.size());
263}
264
265TEST(SimpleIListTest, eraseAndDisposeRangeNullDeleter) {
266 simple_ilist<Node> L;
267 Node A, B, C, D, E;
268 L.push_back(A);
269 L.push_back(B);
270 L.push_back(C);
271 L.push_back(D);
272 L.push_back(E);
273 auto I = L.begin();
274 EXPECT_EQ(&A, &*I++);
275 EXPECT_EQ(&B, &*I++);
276 EXPECT_EQ(&C, &*I++);
277 EXPECT_EQ(&D, &*I++);
278 EXPECT_EQ(&E, &*I++);
279 EXPECT_EQ(L.end(), I);
280 EXPECT_EQ(5u, L.size());
281
282 // Erase a range.
283 EXPECT_EQ(E.getIterator(),
284 L.eraseAndDispose(B.getIterator(), E.getIterator(), doNothing));
285 EXPECT_EQ(&A, &L.front());
286 EXPECT_EQ(&E, &L.back());
287 EXPECT_EQ(2u, L.size());
288}
289
290TEST(SimpleIListTest, clear) {
291 simple_ilist<Node> L;
292 Node A, B;
293 L.push_back(A);
294 L.push_back(B);
295 L.clear();
296 EXPECT_TRUE(L.empty());
297 EXPECT_EQ(0u, L.size());
298}
299
300TEST(SimpleIListTest, clearAndDispose) {
301 simple_ilist<Node> L;
302 Node *A = new Node;
303 Node *B = new Node;
304 L.push_back(*A);
305 L.push_back(*B);
306 L.clearAndDispose(deleteNode());
307 EXPECT_TRUE(L.empty());
308 EXPECT_EQ(0u, L.size());
309}
310
311TEST(SimpleIListTest, clearAndDisposeNullDeleter) {
312 simple_ilist<Node> L;
313 Node A, B;
314 L.push_back(A);
315 L.push_back(B);
316 L.clearAndDispose(doNothing);
317 EXPECT_TRUE(L.empty());
318 EXPECT_EQ(0u, L.size());
319}
320
321TEST(SimpleIListTest, spliceList) {
322 simple_ilist<Node> L1, L2;
323 Node A, B, C, D;
324
325 // [A, D].
326 L1.push_back(A);
327 L1.push_back(D);
328
329 // [B, C].
330 L2.push_back(B);
331 L2.push_back(C);
332
333 // Splice in L2, giving [A, B, C, D].
334 L1.splice(--L1.end(), L2);
335 EXPECT_TRUE(L2.empty());
336 EXPECT_EQ(4u, L1.size());
337 auto I = L1.begin();
338 EXPECT_EQ(&A, &*I++);
339 EXPECT_EQ(&B, &*I++);
340 EXPECT_EQ(&C, &*I++);
341 EXPECT_EQ(&D, &*I++);
342 EXPECT_EQ(L1.end(), I);
343}
344
345TEST(SimpleIListTest, spliceSingle) {
346 simple_ilist<Node> L1, L2;
347 Node A, B, C, D, E;
348
349 // [A, C].
350 L1.push_back(A);
351 L1.push_back(C);
352
353 // [D, B, E].
354 L2.push_back(D);
355 L2.push_back(B);
356 L2.push_back(E);
357
358 // Splice B from L2 to L1, giving [A, B, C] and [D, E].
359 L1.splice(--L1.end(), L2, ++L2.begin());
360 auto I = L1.begin();
361 EXPECT_EQ(&A, &*I++);
362 EXPECT_EQ(&B, &*I++);
363 EXPECT_EQ(&C, &*I++);
364 EXPECT_EQ(L1.end(), I);
365
366 I = L2.begin();
367 EXPECT_EQ(&D, &*I++);
368 EXPECT_EQ(&E, &*I++);
369 EXPECT_EQ(L2.end(), I);
370}
371
372TEST(SimpleIListTest, spliceRange) {
373 simple_ilist<Node> L1, L2;
374 Node A, B, C, D, E, F;
375
376 // [A, D].
377 L1.push_back(A);
378 L1.push_back(D);
379
380 // [E, B, C, F].
381 L2.push_back(E);
382 L2.push_back(B);
383 L2.push_back(C);
384 L2.push_back(F);
385
386 // Splice B from L2 to L1, giving [A, B, C, D] and [E, F].
387 L1.splice(--L1.end(), L2, ++L2.begin(), --L2.end());
388 auto I = L1.begin();
389 EXPECT_EQ(&A, &*I++);
390 EXPECT_EQ(&B, &*I++);
391 EXPECT_EQ(&C, &*I++);
392 EXPECT_EQ(&D, &*I++);
393 EXPECT_EQ(L1.end(), I);
394
395 I = L2.begin();
396 EXPECT_EQ(&E, &*I++);
397 EXPECT_EQ(&F, &*I++);
398 EXPECT_EQ(L2.end(), I);
399}
400
401TEST(SimpleIListTest, merge) {
402 for (bool IsL1LHS : {false, true}) {
403 simple_ilist<Node> L1, L2;
404 Node Ns[10];
405
406 // Fill L1.
407 L1.push_back(Ns[0]);
408 L1.push_back(Ns[3]);
409 L1.push_back(Ns[4]);
410 L1.push_back(Ns[8]);
411
412 // Fill L2.
413 L2.push_back(Ns[1]);
414 L2.push_back(Ns[2]);
415 L2.push_back(Ns[5]);
416 L2.push_back(Ns[6]);
417 L2.push_back(Ns[7]);
418 L2.push_back(Ns[9]);
419
420 // Check setup.
421 EXPECT_EQ(4u, L1.size());
422 EXPECT_EQ(6u, L2.size());
423 EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end()));
424 EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end()));
425
426 // Merge.
427 auto &LHS = IsL1LHS ? L1 : L2;
428 auto &RHS = IsL1LHS ? L2 : L1;
429 LHS.merge(RHS);
430 EXPECT_TRUE(RHS.empty());
431 EXPECT_FALSE(LHS.empty());
432 EXPECT_TRUE(std::is_sorted(LHS.begin(), LHS.end()));
433 auto I = LHS.begin();
434 for (Node &N : Ns)
435 EXPECT_EQ(&N, &*I++);
436 EXPECT_EQ(LHS.end(), I);
437 }
438}
439
440TEST(SimpleIListTest, mergeIsStable) {
441 simple_ilist<Node> L1, L2;
442 Node Ns[5];
443
444 auto setup = [&]() {
445 EXPECT_TRUE(L1.empty());
446 EXPECT_TRUE(L2.empty());
447
448 // Fill L1.
449 L1.push_back(Ns[0]);
450 L1.push_back(Ns[3]);
451 L1.push_back(Ns[4]);
452
453 // Fill L2.
454 L2.push_back(Ns[1]);
455 L2.push_back(Ns[2]);
456
457 // Check setup.
458 EXPECT_EQ(3u, L1.size());
459 EXPECT_EQ(2u, L2.size());
460 EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end(), makeFalse));
461 EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end(), makeFalse));
462 };
463
464 // Merge. Should be stable.
465 setup();
466 L1.merge(L2, makeFalse);
467 EXPECT_TRUE(L2.empty());
468 EXPECT_FALSE(L1.empty());
469 EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end(), makeFalse));
470 auto I = L1.begin();
471 EXPECT_EQ(&Ns[0], &*I++);
472 EXPECT_EQ(&Ns[3], &*I++);
473 EXPECT_EQ(&Ns[4], &*I++);
474 EXPECT_EQ(&Ns[1], &*I++);
475 EXPECT_EQ(&Ns[2], &*I++);
476 EXPECT_EQ(L1.end(), I);
477
478 // Merge the other way. Should be stable.
479 L1.clear();
480 setup();
481 L2.merge(L1, makeFalse);
482 EXPECT_TRUE(L1.empty());
483 EXPECT_FALSE(L2.empty());
484 EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end(), makeFalse));
485 I = L2.begin();
486 EXPECT_EQ(&Ns[1], &*I++);
487 EXPECT_EQ(&Ns[2], &*I++);
488 EXPECT_EQ(&Ns[0], &*I++);
489 EXPECT_EQ(&Ns[3], &*I++);
490 EXPECT_EQ(&Ns[4], &*I++);
491 EXPECT_EQ(L2.end(), I);
492}
493
494TEST(SimpleIListTest, mergeEmpty) {
495 for (bool IsL1LHS : {false, true}) {
496 simple_ilist<Node> L1, L2;
497 Node Ns[4];
498
499 // Fill L1.
500 L1.push_back(Ns[0]);
501 L1.push_back(Ns[1]);
502 L1.push_back(Ns[2]);
503 L1.push_back(Ns[3]);
504
505 // Check setup.
506 EXPECT_EQ(4u, L1.size());
507 EXPECT_TRUE(L2.empty());
508 EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end()));
509
510 // Merge.
511 auto &LHS = IsL1LHS ? L1 : L2;
512 auto &RHS = IsL1LHS ? L2 : L1;
513 LHS.merge(RHS);
514 EXPECT_TRUE(RHS.empty());
515 EXPECT_FALSE(LHS.empty());
516 EXPECT_TRUE(std::is_sorted(LHS.begin(), LHS.end()));
517 auto I = LHS.begin();
518 for (Node &N : Ns)
519 EXPECT_EQ(&N, &*I++);
520 EXPECT_EQ(LHS.end(), I);
521 }
522}
523
524TEST(SimpleIListTest, mergeBothEmpty) {
525 simple_ilist<Node> L1, L2;
526 L1.merge(L2);
527 EXPECT_TRUE(L1.empty());
528 EXPECT_TRUE(L2.empty());
529}
530
531TEST(SimpleIListTest, sort) {
532 simple_ilist<Node> L;
533 Node Ns[10];
534
535 // Fill L.
536 for (int I : {3, 4, 0, 8, 1, 2, 6, 7, 9, 5})
537 L.push_back(Ns[I]);
538
539 // Check setup.
540 EXPECT_EQ(10u, L.size());
541 EXPECT_FALSE(std::is_sorted(L.begin(), L.end()));
542
543 // Sort.
544 L.sort();
545 EXPECT_TRUE(std::is_sorted(L.begin(), L.end()));
546 auto I = L.begin();
547 for (Node &N : Ns)
548 EXPECT_EQ(&N, &*I++);
549 EXPECT_EQ(L.end(), I);
550}
551
552TEST(SimpleIListTest, sortIsStable) {
553 simple_ilist<Node> L;
554 Node Ns[10];
555
556 // Compare such that nodes are partitioned but not fully sorted.
557 auto partition = [&](const Node &N) { return &N >= &Ns[5]; };
558 auto compare = [&](const Node &L, const Node &R) {
559 return partition(L) < partition(R);
560 };
561
562 // Fill L.
563 for (int I : {3, 4, 7, 8, 1, 2, 6, 0, 9, 5})
564 L.push_back(Ns[I]);
565
566 // Check setup.
567 EXPECT_EQ(10u, L.size());
568 EXPECT_FALSE(std::is_sorted(L.begin(), L.end(), compare));
569
570 // Sort.
571 L.sort(compare);
572 EXPECT_TRUE(std::is_sorted(L.begin(), L.end(), compare));
573 auto I = L.begin();
574 for (int O : {3, 4, 1, 2, 0})
575 EXPECT_EQ(&Ns[O], &*I++);
576 for (int O : {7, 8, 6, 9, 5})
577 EXPECT_EQ(&Ns[O], &*I++);
578 EXPECT_EQ(L.end(), I);
579}
580
581TEST(SimpleIListTest, sortEmpty) {
582 simple_ilist<Node> L;
583 L.sort();
584}
585
586} // end namespace