Home | History | Annotate | Download | only in Support
      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 
     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 
     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