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
15using namespace llvm;
16
17namespace {
18
19TEST(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
60TEST(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