annotate unittests/ADT/DenseSetTest.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- llvm/unittest/ADT/DenseSetTest.cpp - DenseSet unit tests --*- C++ -*-===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
9 #include "llvm/ADT/DenseSet.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "gtest/gtest.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
11 #include <type_traits>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 namespace {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
17 static_assert(std::is_const<std::remove_pointer<
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
18 DenseSet<int>::const_iterator::pointer>::type>::value,
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
19 "Iterator pointer type should be const");
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
20 static_assert(std::is_const<std::remove_reference<
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
21 DenseSet<int>::const_iterator::reference>::type>::value,
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
22 "Iterator reference type should be const");
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
23
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 // Test hashing with a set of only two entries.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
25 TEST(DenseSetTest, DoubleEntrySetTest) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 llvm::DenseSet<unsigned> set(2);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 set.insert(0);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 set.insert(1);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 // Original failure was an infinite loop in this call:
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
30 EXPECT_EQ(0u, set.count(2));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
33 struct TestDenseSetInfo {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
34 static inline unsigned getEmptyKey() { return ~0; }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
35 static inline unsigned getTombstoneKey() { return ~0U - 1; }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
36 static unsigned getHashValue(const unsigned& Val) { return Val * 37U; }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
37 static unsigned getHashValue(const char* Val) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
38 return (unsigned)(Val[0] - 'a') * 37U;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
39 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
40 static bool isEqual(const unsigned& LHS, const unsigned& RHS) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
41 return LHS == RHS;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
42 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
43 static bool isEqual(const char* LHS, const unsigned& RHS) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
44 return (unsigned)(LHS[0] - 'a') == RHS;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
45 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
46 };
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
47
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
48 // Test fixture
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
49 template <typename T> class DenseSetTest : public testing::Test {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
50 protected:
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
51 T Set = GetTestSet();
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
52
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
53 private:
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
54 static T GetTestSet() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
55 typename std::remove_const<T>::type Set;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
56 Set.insert(0);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
57 Set.insert(1);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
58 Set.insert(2);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
59 return Set;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
60 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
61 };
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
62
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
63 // Register these types for testing.
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
64 typedef ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
65 const DenseSet<unsigned, TestDenseSetInfo>,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
66 SmallDenseSet<unsigned, 1, TestDenseSetInfo>,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
67 SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
68 const SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
69 SmallDenseSet<unsigned, 64, TestDenseSetInfo>>
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
70 DenseSetTestTypes;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
71 TYPED_TEST_CASE(DenseSetTest, DenseSetTestTypes);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
72
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
73 TYPED_TEST(DenseSetTest, InitializerList) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
74 TypeParam set({1, 2, 1, 4});
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
75 EXPECT_EQ(3u, set.size());
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
76 EXPECT_EQ(1u, set.count(1));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
77 EXPECT_EQ(1u, set.count(2));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
78 EXPECT_EQ(1u, set.count(4));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
79 EXPECT_EQ(0u, set.count(3));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
80 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
81
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
82 TYPED_TEST(DenseSetTest, InitializerListWithNonPowerOfTwoLength) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
83 TypeParam set({1, 2, 3});
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
84 EXPECT_EQ(3u, set.size());
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
85 EXPECT_EQ(1u, set.count(1));
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
86 EXPECT_EQ(1u, set.count(2));
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
87 EXPECT_EQ(1u, set.count(3));
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
88 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
89
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
90 TYPED_TEST(DenseSetTest, ConstIteratorComparison) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 TypeParam set({1});
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
92 const TypeParam &cset = set;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
93 EXPECT_EQ(set.begin(), cset.begin());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
94 EXPECT_EQ(set.end(), cset.end());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
95 EXPECT_NE(set.end(), cset.begin());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
96 EXPECT_NE(set.begin(), cset.end());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
97 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
98
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 TYPED_TEST(DenseSetTest, DefaultConstruction) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
100 typename TypeParam::iterator I, J;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
101 typename TypeParam::const_iterator CI, CJ;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
102 EXPECT_EQ(I, J);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
103 EXPECT_EQ(CI, CJ);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
106 TYPED_TEST(DenseSetTest, EmptyInitializerList) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
107 TypeParam set({});
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
108 EXPECT_EQ(0u, set.size());
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
109 EXPECT_EQ(0u, set.count(0));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
110 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
111
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
112 TYPED_TEST(DenseSetTest, FindAsTest) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
113 auto &set = this->Set;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
114 // Size tests
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
115 EXPECT_EQ(3u, set.size());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
116
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
117 // Normal lookup tests
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
118 EXPECT_EQ(1u, set.count(1));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
119 EXPECT_EQ(0u, *set.find(0));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
120 EXPECT_EQ(1u, *set.find(1));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
121 EXPECT_EQ(2u, *set.find(2));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
122 EXPECT_TRUE(set.find(3) == set.end());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
123
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
124 // find_as() tests
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
125 EXPECT_EQ(0u, *set.find_as("a"));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
126 EXPECT_EQ(1u, *set.find_as("b"));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
127 EXPECT_EQ(2u, *set.find_as("c"));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
128 EXPECT_TRUE(set.find_as("d") == set.end());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
130
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
131 TYPED_TEST(DenseSetTest, EqualityComparisonTest) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
132 TypeParam set1({1, 2, 3, 4});
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
133 TypeParam set2({4, 3, 2, 1});
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
134 TypeParam set3({2, 3, 4, 5});
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
135
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
136 EXPECT_EQ(set1, set2);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
137 EXPECT_NE(set1, set3);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
138 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
139
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
140 // Simple class that counts how many moves and copy happens when growing a map
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
141 struct CountCopyAndMove {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
142 static int Move;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
143 static int Copy;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
144 int Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
145 CountCopyAndMove(int Value) : Value(Value) {}
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
146
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
147 CountCopyAndMove(const CountCopyAndMove &RHS) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
148 Value = RHS.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
149 Copy++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
150 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
151 CountCopyAndMove &operator=(const CountCopyAndMove &RHS) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
152 Value = RHS.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
153 Copy++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
154 return *this;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
155 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
156 CountCopyAndMove(CountCopyAndMove &&RHS) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
157 Value = RHS.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
158 Move++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
159 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
160 CountCopyAndMove &operator=(const CountCopyAndMove &&RHS) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
161 Value = RHS.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
162 Move++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
163 return *this;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
164 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
165 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
166 int CountCopyAndMove::Copy = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
167 int CountCopyAndMove::Move = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
168 } // anonymous namespace
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
169
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
170 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
171 // Specialization required to insert a CountCopyAndMove into a DenseSet.
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
172 template <> struct DenseMapInfo<CountCopyAndMove> {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
173 static inline CountCopyAndMove getEmptyKey() { return CountCopyAndMove(-1); };
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
174 static inline CountCopyAndMove getTombstoneKey() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
175 return CountCopyAndMove(-2);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
176 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
177 static unsigned getHashValue(const CountCopyAndMove &Val) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
178 return Val.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
179 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
180 static bool isEqual(const CountCopyAndMove &LHS,
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
181 const CountCopyAndMove &RHS) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
182 return LHS.Value == RHS.Value;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
183 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
184 };
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
185 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
186
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
187 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
188 // Make sure reserve actually gives us enough buckets to insert N items
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
189 // without increasing allocation size.
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
190 TEST(DenseSetCustomTest, ReserveTest) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
191 // Test a few different size, 48 is *not* a random choice: we need a value
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
192 // that is 2/3 of a power of two to stress the grow() condition, and the power
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
193 // of two has to be at least 64 because of minimum size allocation in the
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
194 // DenseMa. 66 is a value just above the 64 default init.
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
195 for (auto Size : {1, 2, 48, 66}) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
196 DenseSet<CountCopyAndMove> Set;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
197 Set.reserve(Size);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
198 unsigned MemorySize = Set.getMemorySize();
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
199 CountCopyAndMove::Copy = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
200 CountCopyAndMove::Move = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
201 for (int i = 0; i < Size; ++i)
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
202 Set.insert(CountCopyAndMove(i));
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
203 // Check that we didn't grow
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
204 EXPECT_EQ(MemorySize, Set.getMemorySize());
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
205 // Check that move was called the expected number of times
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
206 EXPECT_EQ(Size, CountCopyAndMove::Move);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
207 // Check that no copy occurred
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
208 EXPECT_EQ(0, CountCopyAndMove::Copy);
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
209 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
210 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
211 TEST(DenseSetCustomTest, ConstTest) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
212 // Test that const pointers work okay for count and find, even when the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
213 // underlying map is a non-const pointer.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
214 DenseSet<int *> Map;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
215 int A;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
216 int *B = &A;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
217 const int *C = &A;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
218 Map.insert(B);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 EXPECT_EQ(Map.count(B), 1u);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 EXPECT_EQ(Map.count(C), 1u);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 EXPECT_NE(Map.find(B), Map.end());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
222 EXPECT_NE(Map.find(C), Map.end());
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 83
diff changeset
223 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
224 }