1*9880d681SAndroid Build Coastguard Worker //===------ ADT/SparseSetTest.cpp - SparseSet unit tests - -----*- C++ -*-===//
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/SparseSet.h"
11*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker using namespace llvm;
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker namespace {
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker typedef SparseSet<unsigned> USet;
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker // Empty set tests.
TEST(SparseSetTest,EmptySet)20*9880d681SAndroid Build Coastguard Worker TEST(SparseSetTest, EmptySet) {
21*9880d681SAndroid Build Coastguard Worker USet Set;
22*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.empty());
23*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.begin() == Set.end());
24*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, Set.size());
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker // Lookups on empty set.
29*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(0) == Set.end());
30*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(9) == Set.end());
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker // Same thing on a const reference.
33*9880d681SAndroid Build Coastguard Worker const USet &CSet = Set;
34*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CSet.empty());
35*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CSet.begin() == CSet.end());
36*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, CSet.size());
37*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CSet.find(0) == CSet.end());
38*9880d681SAndroid Build Coastguard Worker USet::const_iterator I = CSet.find(5);
39*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == CSet.end());
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker // Single entry set tests.
TEST(SparseSetTest,SingleEntrySet)43*9880d681SAndroid Build Coastguard Worker TEST(SparseSetTest, SingleEntrySet) {
44*9880d681SAndroid Build Coastguard Worker USet Set;
45*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
46*9880d681SAndroid Build Coastguard Worker std::pair<USet::iterator, bool> IP = Set.insert(5);
47*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(IP.second);
48*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(IP.first == Set.begin());
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.empty());
51*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.begin() == Set.end());
52*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.begin() + 1 == Set.end());
53*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Set.size());
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(0) == Set.end());
56*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(9) == Set.end());
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(0));
59*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.count(5));
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker // Redundant insert.
62*9880d681SAndroid Build Coastguard Worker IP = Set.insert(5);
63*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(IP.second);
64*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(IP.first == Set.begin());
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker // Erase non-existent element.
67*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.erase(1));
68*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Set.size());
69*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, *Set.begin());
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker // Erase iterator.
72*9880d681SAndroid Build Coastguard Worker USet::iterator I = Set.find(5);
73*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.begin());
74*9880d681SAndroid Build Coastguard Worker I = Set.erase(I);
75*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
76*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.empty());
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker // Multiple entry set tests.
TEST(SparseSetTest,MultipleEntrySet)80*9880d681SAndroid Build Coastguard Worker TEST(SparseSetTest, MultipleEntrySet) {
81*9880d681SAndroid Build Coastguard Worker USet Set;
82*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker Set.insert(5);
85*9880d681SAndroid Build Coastguard Worker Set.insert(3);
86*9880d681SAndroid Build Coastguard Worker Set.insert(2);
87*9880d681SAndroid Build Coastguard Worker Set.insert(1);
88*9880d681SAndroid Build Coastguard Worker Set.insert(4);
89*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, Set.size());
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker // Without deletions, iteration order == insertion order.
92*9880d681SAndroid Build Coastguard Worker USet::const_iterator I = Set.begin();
93*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, *I);
94*9880d681SAndroid Build Coastguard Worker ++I;
95*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3u, *I);
96*9880d681SAndroid Build Coastguard Worker ++I;
97*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, *I);
98*9880d681SAndroid Build Coastguard Worker ++I;
99*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, *I);
100*9880d681SAndroid Build Coastguard Worker ++I;
101*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4u, *I);
102*9880d681SAndroid Build Coastguard Worker ++I;
103*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker // Redundant insert.
106*9880d681SAndroid Build Coastguard Worker std::pair<USet::iterator, bool> IP = Set.insert(3);
107*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(IP.second);
108*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(IP.first == Set.begin() + 1);
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker // Erase last element by key.
111*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.erase(4));
112*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4u, Set.size());
113*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(4));
114*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.erase(4));
115*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4u, Set.size());
116*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(4));
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker // Erase first element by key.
119*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.count(5));
120*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(5) == Set.begin());
121*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.erase(5));
122*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3u, Set.size());
123*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(5));
124*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.erase(5));
125*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3u, Set.size());
126*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(5));
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker Set.insert(6);
129*9880d681SAndroid Build Coastguard Worker Set.insert(7);
130*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, Set.size());
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker // Erase last element by iterator.
133*9880d681SAndroid Build Coastguard Worker I = Set.erase(Set.end() - 1);
134*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4u, Set.size());
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker // Erase second element by iterator.
138*9880d681SAndroid Build Coastguard Worker I = Set.erase(Set.begin() + 1);
139*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.begin() + 1);
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker // Clear and resize the universe.
142*9880d681SAndroid Build Coastguard Worker Set.clear();
143*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(5));
144*9880d681SAndroid Build Coastguard Worker Set.setUniverse(1000);
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker // Add more than 256 elements.
147*9880d681SAndroid Build Coastguard Worker for (unsigned i = 100; i != 800; ++i)
148*9880d681SAndroid Build Coastguard Worker Set.insert(i);
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != 10; ++i)
151*9880d681SAndroid Build Coastguard Worker Set.erase(i);
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker for (unsigned i = 100; i != 800; ++i)
154*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.count(i));
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(99));
157*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.count(800));
158*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(700u, Set.size());
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker struct Alt {
162*9880d681SAndroid Build Coastguard Worker unsigned Value;
Alt__anon8f9745660111::Alt163*9880d681SAndroid Build Coastguard Worker explicit Alt(unsigned x) : Value(x) {}
getSparseSetIndex__anon8f9745660111::Alt164*9880d681SAndroid Build Coastguard Worker unsigned getSparseSetIndex() const { return Value - 1000; }
165*9880d681SAndroid Build Coastguard Worker };
166*9880d681SAndroid Build Coastguard Worker
TEST(SparseSetTest,AltStructSet)167*9880d681SAndroid Build Coastguard Worker TEST(SparseSetTest, AltStructSet) {
168*9880d681SAndroid Build Coastguard Worker typedef SparseSet<Alt> ASet;
169*9880d681SAndroid Build Coastguard Worker ASet Set;
170*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
171*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1005));
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker ASet::iterator I = Set.find(5);
174*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I == Set.begin());
175*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1005u, I->Value);
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1006));
178*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1006));
179*9880d681SAndroid Build Coastguard Worker I = Set.erase(Set.begin());
180*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I == Set.begin());
181*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1006u, I->Value);
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.erase(5));
184*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.erase(6));
185*9880d681SAndroid Build Coastguard Worker }
186*9880d681SAndroid Build Coastguard Worker
TEST(SparseSetTest,PopBack)187*9880d681SAndroid Build Coastguard Worker TEST(SparseSetTest, PopBack) {
188*9880d681SAndroid Build Coastguard Worker USet Set;
189*9880d681SAndroid Build Coastguard Worker const unsigned UpperBound = 300;
190*9880d681SAndroid Build Coastguard Worker Set.setUniverse(UpperBound);
191*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < UpperBound; ++i)
192*9880d681SAndroid Build Coastguard Worker Set.insert(i);
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker // Make sure pop back returns the values in the reverse order we
195*9880d681SAndroid Build Coastguard Worker // inserted them.
196*9880d681SAndroid Build Coastguard Worker unsigned Expected = UpperBound;
197*9880d681SAndroid Build Coastguard Worker while (!Set.empty())
198*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(--Expected == Set.pop_back_val());
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker // Insert again the same elements in the sparse set and make sure
201*9880d681SAndroid Build Coastguard Worker // each insertion actually inserts the elements. I.e., check
202*9880d681SAndroid Build Coastguard Worker // that the underlying data structure are properly cleared.
203*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < UpperBound; ++i)
204*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(Set.insert(i).second);
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker } // namespace
207