blob: ebb119600c731c79f67271c1cdddbe27ad62318d [file] [log] [blame]
Chandler Carruthe8529c22016-08-19 02:07:51 +00001//===- STLExtrasTest.cpp - Unit tests for STL extras ----------------------===//
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/STLExtras.h"
11#include "gtest/gtest.h"
12
Zachary Turner4f20a0a2016-09-30 15:43:59 +000013#include <vector>
14
Chandler Carruthe8529c22016-08-19 02:07:51 +000015using namespace llvm;
16
17namespace {
18
19int f(rank<0>) { return 0; }
20int f(rank<1>) { return 1; }
21int f(rank<2>) { return 2; }
22int f(rank<4>) { return 4; }
23
24TEST(STLExtrasTest, Rank) {
25 // We shouldn't get ambiguities and should select the overload of the same
26 // rank as the argument.
27 EXPECT_EQ(0, f(rank<0>()));
28 EXPECT_EQ(1, f(rank<1>()));
29 EXPECT_EQ(2, f(rank<2>()));
30
31 // This overload is missing so we end up back at 2.
32 EXPECT_EQ(2, f(rank<3>()));
33
34 // But going past 3 should work fine.
35 EXPECT_EQ(4, f(rank<4>()));
36
37 // And we can even go higher and just fall back to the last overload.
38 EXPECT_EQ(4, f(rank<5>()));
39 EXPECT_EQ(4, f(rank<6>()));
40}
41
Zachary Turner4f20a0a2016-09-30 15:43:59 +000042TEST(STLExtrasTest, Enumerate) {
43 std::vector<char> foo = {'a', 'b', 'c'};
44
45 std::vector<std::pair<std::size_t, char>> results;
46
47 for (auto X : llvm::enumerate(foo)) {
48 results.push_back(std::make_pair(X.Index, X.Value));
49 }
50 ASSERT_EQ(3u, results.size());
51 EXPECT_EQ(0u, results[0].first);
52 EXPECT_EQ('a', results[0].second);
53 EXPECT_EQ(1u, results[1].first);
54 EXPECT_EQ('b', results[1].second);
55 EXPECT_EQ(2u, results[2].first);
56 EXPECT_EQ('c', results[2].second);
57
58 results.clear();
59 const std::vector<int> bar = {'1', '2', '3'};
60 for (auto X : llvm::enumerate(bar)) {
61 results.push_back(std::make_pair(X.Index, X.Value));
62 }
63 EXPECT_EQ(0u, results[0].first);
64 EXPECT_EQ('1', results[0].second);
65 EXPECT_EQ(1u, results[1].first);
66 EXPECT_EQ('2', results[1].second);
67 EXPECT_EQ(2u, results[2].first);
68 EXPECT_EQ('3', results[2].second);
69
70 results.clear();
71 const std::vector<int> baz;
72 for (auto X : llvm::enumerate(baz)) {
73 results.push_back(std::make_pair(X.Index, X.Value));
74 }
75 EXPECT_TRUE(baz.empty());
76}
77
78TEST(STLExtrasTest, EnumerateModify) {
79 std::vector<char> foo = {'a', 'b', 'c'};
80
81 for (auto X : llvm::enumerate(foo)) {
82 ++X.Value;
83 }
84
85 EXPECT_EQ('b', foo[0]);
86 EXPECT_EQ('c', foo[1]);
87 EXPECT_EQ('d', foo[2]);
88}
Chandler Carruthe8529c22016-08-19 02:07:51 +000089}