| //===- unittests/ADT/SimpleIListTest.cpp - simple_ilist unit tests --------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/ADT/simple_ilist.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| struct Node : ilist_node<Node> {}; |
| bool operator<(const Node &L, const Node &R) { return &L < &R; } |
| bool makeFalse(const Node &, const Node &) { return false; } |
| |
| struct deleteNode : std::default_delete<Node> {}; |
| void doNothing(Node *) {} |
| |
| TEST(SimpleIListTest, DefaultConstructor) { |
| simple_ilist<Node> L; |
| EXPECT_EQ(L.begin(), L.end()); |
| EXPECT_TRUE(L.empty()); |
| EXPECT_EQ(0u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, pushPopFront) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.push_front(B); |
| L.push_front(A); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &L.back()); |
| EXPECT_FALSE(L.empty()); |
| EXPECT_EQ(2u, L.size()); |
| |
| // Pop front and check the new front. |
| L.pop_front(); |
| EXPECT_EQ(&B, &L.front()); |
| |
| // Pop to empty. |
| L.pop_front(); |
| EXPECT_TRUE(L.empty()); |
| } |
| |
| TEST(SimpleIListTest, pushPopBack) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.push_back(A); |
| L.push_back(B); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &L.back()); |
| EXPECT_FALSE(L.empty()); |
| EXPECT_EQ(2u, L.size()); |
| |
| // Pop back and check the new front. |
| L.pop_back(); |
| EXPECT_EQ(&A, &L.back()); |
| |
| // Pop to empty. |
| L.pop_back(); |
| EXPECT_TRUE(L.empty()); |
| } |
| |
| TEST(SimpleIListTest, swap) { |
| simple_ilist<Node> L1, L2; |
| Node A, B; |
| L1.push_back(A); |
| L1.push_back(B); |
| L1.swap(L2); |
| EXPECT_TRUE(L1.empty()); |
| EXPECT_EQ(0u, L1.size()); |
| EXPECT_EQ(&A, &L2.front()); |
| EXPECT_EQ(&B, &L2.back()); |
| EXPECT_FALSE(L2.empty()); |
| EXPECT_EQ(2u, L2.size()); |
| } |
| |
| TEST(SimpleIListTest, insertEraseAtEnd) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.insert(L.end(), A); |
| L.insert(L.end(), B); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &L.back()); |
| EXPECT_FALSE(L.empty()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, insertAtBegin) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.insert(L.begin(), B); |
| L.insert(L.begin(), A); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &L.back()); |
| EXPECT_FALSE(L.empty()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, remove) { |
| simple_ilist<Node> L; |
| Node A, B, C; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| L.remove(B); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| |
| L.remove(A); |
| EXPECT_EQ(&C, &L.front()); |
| EXPECT_EQ(1u, L.size()); |
| |
| L.remove(C); |
| EXPECT_TRUE(L.empty()); |
| } |
| |
| TEST(SimpleIListTest, removeAndDispose) { |
| simple_ilist<Node> L; |
| Node A, C; |
| Node *B = new Node; |
| L.push_back(A); |
| L.push_back(*B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| L.removeAndDispose(*B, deleteNode()); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, removeAndDisposeNullDeleter) { |
| simple_ilist<Node> L; |
| Node A, B, C; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| L.removeAndDispose(B, doNothing); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, erase) { |
| simple_ilist<Node> L; |
| Node A, B, C; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| EXPECT_EQ(C.getIterator(), L.erase(B.getIterator())); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, reverse_iterator) { |
| simple_ilist<Node> L; |
| Node A, B, C; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| |
| auto ReverseIter = L.rbegin(); |
| EXPECT_EQ(C.getReverseIterator(), ReverseIter); |
| ++ReverseIter; |
| EXPECT_EQ(B.getReverseIterator(), ReverseIter); |
| ++ReverseIter; |
| EXPECT_EQ(A.getReverseIterator(), ReverseIter); |
| ++ReverseIter; |
| EXPECT_EQ(L.rend(), ReverseIter); |
| } |
| |
| TEST(SimpleIListTest, eraseAndDispose) { |
| simple_ilist<Node> L; |
| Node A, C; |
| Node *B = new Node; |
| L.push_back(A); |
| L.push_back(*B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| L.eraseAndDispose(B->getIterator(), deleteNode()); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, eraseAndDisposeNullDeleter) { |
| simple_ilist<Node> L; |
| Node A, B, C; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&B, &*++L.begin()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(3u, L.size()); |
| |
| L.eraseAndDispose(B.getIterator(), doNothing); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&C, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, eraseRange) { |
| simple_ilist<Node> L; |
| Node A, B, C, D, E; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| L.push_back(D); |
| L.push_back(E); |
| auto I = L.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(&B, &*I++); |
| EXPECT_EQ(&C, &*I++); |
| EXPECT_EQ(&D, &*I++); |
| EXPECT_EQ(&E, &*I++); |
| EXPECT_EQ(L.end(), I); |
| EXPECT_EQ(5u, L.size()); |
| |
| // Erase a range. |
| EXPECT_EQ(E.getIterator(), L.erase(B.getIterator(), E.getIterator())); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&E, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, eraseAndDisposeRange) { |
| simple_ilist<Node> L; |
| Node A, *B = new Node, *C = new Node, *D = new Node, E; |
| L.push_back(A); |
| L.push_back(*B); |
| L.push_back(*C); |
| L.push_back(*D); |
| L.push_back(E); |
| auto I = L.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(B, &*I++); |
| EXPECT_EQ(C, &*I++); |
| EXPECT_EQ(D, &*I++); |
| EXPECT_EQ(&E, &*I++); |
| EXPECT_EQ(L.end(), I); |
| EXPECT_EQ(5u, L.size()); |
| |
| // Erase a range. |
| EXPECT_EQ(E.getIterator(), |
| L.eraseAndDispose(B->getIterator(), E.getIterator(), deleteNode())); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&E, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, eraseAndDisposeRangeNullDeleter) { |
| simple_ilist<Node> L; |
| Node A, B, C, D, E; |
| L.push_back(A); |
| L.push_back(B); |
| L.push_back(C); |
| L.push_back(D); |
| L.push_back(E); |
| auto I = L.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(&B, &*I++); |
| EXPECT_EQ(&C, &*I++); |
| EXPECT_EQ(&D, &*I++); |
| EXPECT_EQ(&E, &*I++); |
| EXPECT_EQ(L.end(), I); |
| EXPECT_EQ(5u, L.size()); |
| |
| // Erase a range. |
| EXPECT_EQ(E.getIterator(), |
| L.eraseAndDispose(B.getIterator(), E.getIterator(), doNothing)); |
| EXPECT_EQ(&A, &L.front()); |
| EXPECT_EQ(&E, &L.back()); |
| EXPECT_EQ(2u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, clear) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.push_back(A); |
| L.push_back(B); |
| L.clear(); |
| EXPECT_TRUE(L.empty()); |
| EXPECT_EQ(0u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, clearAndDispose) { |
| simple_ilist<Node> L; |
| Node *A = new Node; |
| Node *B = new Node; |
| L.push_back(*A); |
| L.push_back(*B); |
| L.clearAndDispose(deleteNode()); |
| EXPECT_TRUE(L.empty()); |
| EXPECT_EQ(0u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, clearAndDisposeNullDeleter) { |
| simple_ilist<Node> L; |
| Node A, B; |
| L.push_back(A); |
| L.push_back(B); |
| L.clearAndDispose(doNothing); |
| EXPECT_TRUE(L.empty()); |
| EXPECT_EQ(0u, L.size()); |
| } |
| |
| TEST(SimpleIListTest, spliceList) { |
| simple_ilist<Node> L1, L2; |
| Node A, B, C, D; |
| |
| // [A, D]. |
| L1.push_back(A); |
| L1.push_back(D); |
| |
| // [B, C]. |
| L2.push_back(B); |
| L2.push_back(C); |
| |
| // Splice in L2, giving [A, B, C, D]. |
| L1.splice(--L1.end(), L2); |
| EXPECT_TRUE(L2.empty()); |
| EXPECT_EQ(4u, L1.size()); |
| auto I = L1.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(&B, &*I++); |
| EXPECT_EQ(&C, &*I++); |
| EXPECT_EQ(&D, &*I++); |
| EXPECT_EQ(L1.end(), I); |
| } |
| |
| TEST(SimpleIListTest, spliceSingle) { |
| simple_ilist<Node> L1, L2; |
| Node A, B, C, D, E; |
| |
| // [A, C]. |
| L1.push_back(A); |
| L1.push_back(C); |
| |
| // [D, B, E]. |
| L2.push_back(D); |
| L2.push_back(B); |
| L2.push_back(E); |
| |
| // Splice B from L2 to L1, giving [A, B, C] and [D, E]. |
| L1.splice(--L1.end(), L2, ++L2.begin()); |
| auto I = L1.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(&B, &*I++); |
| EXPECT_EQ(&C, &*I++); |
| EXPECT_EQ(L1.end(), I); |
| |
| I = L2.begin(); |
| EXPECT_EQ(&D, &*I++); |
| EXPECT_EQ(&E, &*I++); |
| EXPECT_EQ(L2.end(), I); |
| } |
| |
| TEST(SimpleIListTest, spliceRange) { |
| simple_ilist<Node> L1, L2; |
| Node A, B, C, D, E, F; |
| |
| // [A, D]. |
| L1.push_back(A); |
| L1.push_back(D); |
| |
| // [E, B, C, F]. |
| L2.push_back(E); |
| L2.push_back(B); |
| L2.push_back(C); |
| L2.push_back(F); |
| |
| // Splice B from L2 to L1, giving [A, B, C, D] and [E, F]. |
| L1.splice(--L1.end(), L2, ++L2.begin(), --L2.end()); |
| auto I = L1.begin(); |
| EXPECT_EQ(&A, &*I++); |
| EXPECT_EQ(&B, &*I++); |
| EXPECT_EQ(&C, &*I++); |
| EXPECT_EQ(&D, &*I++); |
| EXPECT_EQ(L1.end(), I); |
| |
| I = L2.begin(); |
| EXPECT_EQ(&E, &*I++); |
| EXPECT_EQ(&F, &*I++); |
| EXPECT_EQ(L2.end(), I); |
| } |
| |
| TEST(SimpleIListTest, merge) { |
| for (bool IsL1LHS : {false, true}) { |
| simple_ilist<Node> L1, L2; |
| Node Ns[10]; |
| |
| // Fill L1. |
| L1.push_back(Ns[0]); |
| L1.push_back(Ns[3]); |
| L1.push_back(Ns[4]); |
| L1.push_back(Ns[8]); |
| |
| // Fill L2. |
| L2.push_back(Ns[1]); |
| L2.push_back(Ns[2]); |
| L2.push_back(Ns[5]); |
| L2.push_back(Ns[6]); |
| L2.push_back(Ns[7]); |
| L2.push_back(Ns[9]); |
| |
| // Check setup. |
| EXPECT_EQ(4u, L1.size()); |
| EXPECT_EQ(6u, L2.size()); |
| EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end())); |
| EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end())); |
| |
| // Merge. |
| auto &LHS = IsL1LHS ? L1 : L2; |
| auto &RHS = IsL1LHS ? L2 : L1; |
| LHS.merge(RHS); |
| EXPECT_TRUE(RHS.empty()); |
| EXPECT_FALSE(LHS.empty()); |
| EXPECT_TRUE(std::is_sorted(LHS.begin(), LHS.end())); |
| auto I = LHS.begin(); |
| for (Node &N : Ns) |
| EXPECT_EQ(&N, &*I++); |
| EXPECT_EQ(LHS.end(), I); |
| } |
| } |
| |
| TEST(SimpleIListTest, mergeIsStable) { |
| simple_ilist<Node> L1, L2; |
| Node Ns[5]; |
| |
| auto setup = [&]() { |
| EXPECT_TRUE(L1.empty()); |
| EXPECT_TRUE(L2.empty()); |
| |
| // Fill L1. |
| L1.push_back(Ns[0]); |
| L1.push_back(Ns[3]); |
| L1.push_back(Ns[4]); |
| |
| // Fill L2. |
| L2.push_back(Ns[1]); |
| L2.push_back(Ns[2]); |
| |
| // Check setup. |
| EXPECT_EQ(3u, L1.size()); |
| EXPECT_EQ(2u, L2.size()); |
| EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end(), makeFalse)); |
| EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end(), makeFalse)); |
| }; |
| |
| // Merge. Should be stable. |
| setup(); |
| L1.merge(L2, makeFalse); |
| EXPECT_TRUE(L2.empty()); |
| EXPECT_FALSE(L1.empty()); |
| EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end(), makeFalse)); |
| auto I = L1.begin(); |
| EXPECT_EQ(&Ns[0], &*I++); |
| EXPECT_EQ(&Ns[3], &*I++); |
| EXPECT_EQ(&Ns[4], &*I++); |
| EXPECT_EQ(&Ns[1], &*I++); |
| EXPECT_EQ(&Ns[2], &*I++); |
| EXPECT_EQ(L1.end(), I); |
| |
| // Merge the other way. Should be stable. |
| L1.clear(); |
| setup(); |
| L2.merge(L1, makeFalse); |
| EXPECT_TRUE(L1.empty()); |
| EXPECT_FALSE(L2.empty()); |
| EXPECT_TRUE(std::is_sorted(L2.begin(), L2.end(), makeFalse)); |
| I = L2.begin(); |
| EXPECT_EQ(&Ns[1], &*I++); |
| EXPECT_EQ(&Ns[2], &*I++); |
| EXPECT_EQ(&Ns[0], &*I++); |
| EXPECT_EQ(&Ns[3], &*I++); |
| EXPECT_EQ(&Ns[4], &*I++); |
| EXPECT_EQ(L2.end(), I); |
| } |
| |
| TEST(SimpleIListTest, mergeEmpty) { |
| for (bool IsL1LHS : {false, true}) { |
| simple_ilist<Node> L1, L2; |
| Node Ns[4]; |
| |
| // Fill L1. |
| L1.push_back(Ns[0]); |
| L1.push_back(Ns[1]); |
| L1.push_back(Ns[2]); |
| L1.push_back(Ns[3]); |
| |
| // Check setup. |
| EXPECT_EQ(4u, L1.size()); |
| EXPECT_TRUE(L2.empty()); |
| EXPECT_TRUE(std::is_sorted(L1.begin(), L1.end())); |
| |
| // Merge. |
| auto &LHS = IsL1LHS ? L1 : L2; |
| auto &RHS = IsL1LHS ? L2 : L1; |
| LHS.merge(RHS); |
| EXPECT_TRUE(RHS.empty()); |
| EXPECT_FALSE(LHS.empty()); |
| EXPECT_TRUE(std::is_sorted(LHS.begin(), LHS.end())); |
| auto I = LHS.begin(); |
| for (Node &N : Ns) |
| EXPECT_EQ(&N, &*I++); |
| EXPECT_EQ(LHS.end(), I); |
| } |
| } |
| |
| TEST(SimpleIListTest, mergeBothEmpty) { |
| simple_ilist<Node> L1, L2; |
| L1.merge(L2); |
| EXPECT_TRUE(L1.empty()); |
| EXPECT_TRUE(L2.empty()); |
| } |
| |
| TEST(SimpleIListTest, sort) { |
| simple_ilist<Node> L; |
| Node Ns[10]; |
| |
| // Fill L. |
| for (int I : {3, 4, 0, 8, 1, 2, 6, 7, 9, 5}) |
| L.push_back(Ns[I]); |
| |
| // Check setup. |
| EXPECT_EQ(10u, L.size()); |
| EXPECT_FALSE(std::is_sorted(L.begin(), L.end())); |
| |
| // Sort. |
| L.sort(); |
| EXPECT_TRUE(std::is_sorted(L.begin(), L.end())); |
| auto I = L.begin(); |
| for (Node &N : Ns) |
| EXPECT_EQ(&N, &*I++); |
| EXPECT_EQ(L.end(), I); |
| } |
| |
| TEST(SimpleIListTest, sortIsStable) { |
| simple_ilist<Node> L; |
| Node Ns[10]; |
| |
| // Compare such that nodes are partitioned but not fully sorted. |
| auto partition = [&](const Node &N) { return &N >= &Ns[5]; }; |
| auto compare = [&](const Node &L, const Node &R) { |
| return partition(L) < partition(R); |
| }; |
| |
| // Fill L. |
| for (int I : {3, 4, 7, 8, 1, 2, 6, 0, 9, 5}) |
| L.push_back(Ns[I]); |
| |
| // Check setup. |
| EXPECT_EQ(10u, L.size()); |
| EXPECT_FALSE(std::is_sorted(L.begin(), L.end(), compare)); |
| |
| // Sort. |
| L.sort(compare); |
| EXPECT_TRUE(std::is_sorted(L.begin(), L.end(), compare)); |
| auto I = L.begin(); |
| for (int O : {3, 4, 1, 2, 0}) |
| EXPECT_EQ(&Ns[O], &*I++); |
| for (int O : {7, 8, 6, 9, 5}) |
| EXPECT_EQ(&Ns[O], &*I++); |
| EXPECT_EQ(L.end(), I); |
| } |
| |
| TEST(SimpleIListTest, sortEmpty) { |
| simple_ilist<Node> L; |
| L.sort(); |
| } |
| |
| struct Tag1 {}; |
| struct Tag2 {}; |
| |
| struct DoubleNode : ilist_node<DoubleNode, ilist_tag<Tag1>>, |
| ilist_node<DoubleNode, ilist_tag<Tag2>> { |
| typedef ilist_node<DoubleNode, ilist_tag<Tag1>> Node1Type; |
| typedef ilist_node<DoubleNode, ilist_tag<Tag2>> Node2Type; |
| |
| Node1Type::self_iterator getIterator1() { return Node1Type::getIterator(); } |
| Node2Type::self_iterator getIterator2() { return Node2Type::getIterator(); } |
| Node1Type::const_self_iterator getIterator1() const { |
| return Node1Type::getIterator(); |
| } |
| Node2Type::const_self_iterator getIterator2() const { |
| return Node2Type::getIterator(); |
| } |
| }; |
| typedef simple_ilist<DoubleNode, ilist_tag<Tag1>> TaggedList1Type; |
| typedef simple_ilist<DoubleNode, ilist_tag<Tag2>> TaggedList2Type; |
| |
| TEST(SimpleIListTest, TaggedLists) { |
| TaggedList1Type L1; |
| TaggedList2Type L2; |
| |
| // Build the two lists, sharing a couple of nodes. |
| DoubleNode Ns[10]; |
| int Order1[] = {0, 1, 2, 3, 4, 7, 9}; |
| int Order2[] = {2, 5, 6, 7, 8, 4, 9, 1}; |
| for (int I : Order1) |
| L1.push_back(Ns[I]); |
| for (int I : Order2) |
| L2.push_back(Ns[I]); |
| |
| // Check that each list is correct. |
| EXPECT_EQ(sizeof(Order1) / sizeof(int), L1.size()); |
| auto I1 = L1.begin(); |
| for (int I : Order1) { |
| EXPECT_EQ(Ns[I].getIterator1(), I1); |
| EXPECT_EQ(&Ns[I], &*I1++); |
| } |
| EXPECT_EQ(L1.end(), I1); |
| |
| EXPECT_EQ(sizeof(Order2) / sizeof(int), L2.size()); |
| auto I2 = L2.begin(); |
| for (int I : Order2) { |
| EXPECT_EQ(Ns[I].getIterator2(), I2); |
| EXPECT_EQ(&Ns[I], &*I2++); |
| } |
| EXPECT_EQ(L2.end(), I2); |
| } |
| |
| } // end namespace |