1 //===- IteratorTest.cpp - Unit tests for iterator utilities ---------------===//
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/iterator.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/SmallVector.h"
13 #include "gtest/gtest.h"
14 
15 using namespace llvm;
16 
17 namespace {
18 
TEST(PointeeIteratorTest,Basic)19 TEST(PointeeIteratorTest, Basic) {
20   int arr[4] = { 1, 2, 3, 4 };
21   SmallVector<int *, 4> V;
22   V.push_back(&arr[0]);
23   V.push_back(&arr[1]);
24   V.push_back(&arr[2]);
25   V.push_back(&arr[3]);
26 
27   typedef pointee_iterator<SmallVectorImpl<int *>::const_iterator> test_iterator;
28 
29   test_iterator Begin, End;
30   Begin = V.begin();
31   End = test_iterator(V.end());
32 
33   test_iterator I = Begin;
34   for (int i = 0; i < 4; ++i) {
35     EXPECT_EQ(*V[i], *I);
36 
37     EXPECT_EQ(I, Begin + i);
38     EXPECT_EQ(I, std::next(Begin, i));
39     test_iterator J = Begin;
40     J += i;
41     EXPECT_EQ(I, J);
42     EXPECT_EQ(*V[i], Begin[i]);
43 
44     EXPECT_NE(I, End);
45     EXPECT_GT(End, I);
46     EXPECT_LT(I, End);
47     EXPECT_GE(I, Begin);
48     EXPECT_LE(Begin, I);
49 
50     EXPECT_EQ(i, I - Begin);
51     EXPECT_EQ(i, std::distance(Begin, I));
52     EXPECT_EQ(Begin, I - i);
53 
54     test_iterator K = I++;
55     EXPECT_EQ(K, std::prev(I));
56   }
57   EXPECT_EQ(End, I);
58 }
59 
TEST(PointeeIteratorTest,SmartPointer)60 TEST(PointeeIteratorTest, SmartPointer) {
61   SmallVector<std::unique_ptr<int>, 4> V;
62   V.push_back(make_unique<int>(1));
63   V.push_back(make_unique<int>(2));
64   V.push_back(make_unique<int>(3));
65   V.push_back(make_unique<int>(4));
66 
67   typedef pointee_iterator<
68       SmallVectorImpl<std::unique_ptr<int>>::const_iterator> test_iterator;
69 
70   test_iterator Begin, End;
71   Begin = V.begin();
72   End = test_iterator(V.end());
73 
74   test_iterator I = Begin;
75   for (int i = 0; i < 4; ++i) {
76     EXPECT_EQ(*V[i], *I);
77 
78     EXPECT_EQ(I, Begin + i);
79     EXPECT_EQ(I, std::next(Begin, i));
80     test_iterator J = Begin;
81     J += i;
82     EXPECT_EQ(I, J);
83     EXPECT_EQ(*V[i], Begin[i]);
84 
85     EXPECT_NE(I, End);
86     EXPECT_GT(End, I);
87     EXPECT_LT(I, End);
88     EXPECT_GE(I, Begin);
89     EXPECT_LE(Begin, I);
90 
91     EXPECT_EQ(i, I - Begin);
92     EXPECT_EQ(i, std::distance(Begin, I));
93     EXPECT_EQ(Begin, I - i);
94 
95     test_iterator K = I++;
96     EXPECT_EQ(K, std::prev(I));
97   }
98   EXPECT_EQ(End, I);
99 }
100 
101 } // anonymous namespace
102