1*9880d681SAndroid Build Coastguard Worker //===- RangeAdapterTest.cpp - Unit tests for range adapters --------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/iterator_range.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include <iterator>
15*9880d681SAndroid Build Coastguard Worker #include <list>
16*9880d681SAndroid Build Coastguard Worker #include <vector>
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker // A wrapper around vector which exposes rbegin(), rend().
23*9880d681SAndroid Build Coastguard Worker class ReverseOnlyVector {
24*9880d681SAndroid Build Coastguard Worker std::vector<int> Vec;
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker public:
ReverseOnlyVector(std::initializer_list<int> list)27*9880d681SAndroid Build Coastguard Worker ReverseOnlyVector(std::initializer_list<int> list) : Vec(list) {}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker typedef std::vector<int>::reverse_iterator reverse_iterator;
rbegin()30*9880d681SAndroid Build Coastguard Worker reverse_iterator rbegin() { return Vec.rbegin(); }
rend()31*9880d681SAndroid Build Coastguard Worker reverse_iterator rend() { return Vec.rend(); }
32*9880d681SAndroid Build Coastguard Worker };
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker // A wrapper around vector which exposes begin(), end(), rbegin() and rend().
35*9880d681SAndroid Build Coastguard Worker // begin() and end() don't have implementations as this ensures that we will
36*9880d681SAndroid Build Coastguard Worker // get a linker error if reverse() chooses begin()/end() over rbegin(), rend().
37*9880d681SAndroid Build Coastguard Worker class BidirectionalVector {
38*9880d681SAndroid Build Coastguard Worker std::vector<int> Vec;
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker public:
BidirectionalVector(std::initializer_list<int> list)41*9880d681SAndroid Build Coastguard Worker BidirectionalVector(std::initializer_list<int> list) : Vec(list) {}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker typedef std::vector<int>::iterator iterator;
44*9880d681SAndroid Build Coastguard Worker iterator begin();
45*9880d681SAndroid Build Coastguard Worker iterator end();
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker typedef std::vector<int>::reverse_iterator reverse_iterator;
rbegin()48*9880d681SAndroid Build Coastguard Worker reverse_iterator rbegin() { return Vec.rbegin(); }
rend()49*9880d681SAndroid Build Coastguard Worker reverse_iterator rend() { return Vec.rend(); }
50*9880d681SAndroid Build Coastguard Worker };
51*9880d681SAndroid Build Coastguard Worker
TestRev(const R & r)52*9880d681SAndroid Build Coastguard Worker template <typename R> void TestRev(const R &r) {
53*9880d681SAndroid Build Coastguard Worker int counter = 3;
54*9880d681SAndroid Build Coastguard Worker for (int i : r)
55*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(i, counter--);
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker // Test fixture
59*9880d681SAndroid Build Coastguard Worker template <typename T> class RangeAdapterLValueTest : public ::testing::Test {};
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker typedef ::testing::Types<std::vector<int>, std::list<int>, int[4]>
62*9880d681SAndroid Build Coastguard Worker RangeAdapterLValueTestTypes;
63*9880d681SAndroid Build Coastguard Worker TYPED_TEST_CASE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes);
64*9880d681SAndroid Build Coastguard Worker
TYPED_TEST(RangeAdapterLValueTest,TrivialOperation)65*9880d681SAndroid Build Coastguard Worker TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {
66*9880d681SAndroid Build Coastguard Worker TypeParam v = {0, 1, 2, 3};
67*9880d681SAndroid Build Coastguard Worker TestRev(reverse(v));
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker const TypeParam c = {0, 1, 2, 3};
70*9880d681SAndroid Build Coastguard Worker TestRev(reverse(c));
71*9880d681SAndroid Build Coastguard Worker }
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker template <typename T> struct RangeAdapterRValueTest : testing::Test {};
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker typedef ::testing::Types<std::vector<int>, std::list<int>, ReverseOnlyVector,
76*9880d681SAndroid Build Coastguard Worker BidirectionalVector> RangeAdapterRValueTestTypes;
77*9880d681SAndroid Build Coastguard Worker TYPED_TEST_CASE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);
78*9880d681SAndroid Build Coastguard Worker
TYPED_TEST(RangeAdapterRValueTest,TrivialOperation)79*9880d681SAndroid Build Coastguard Worker TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) {
80*9880d681SAndroid Build Coastguard Worker TestRev(reverse(TypeParam({0, 1, 2, 3})));
81*9880d681SAndroid Build Coastguard Worker }
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker } // anonymous namespace
84