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/SparseMultiSet.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 SparseMultiSet<unsigned> USet;
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker // Empty set tests.
TEST(SparseMultiSetTest,EmptySet)20*9880d681SAndroid Build Coastguard Worker TEST(SparseMultiSetTest, EmptySet) {
21*9880d681SAndroid Build Coastguard Worker USet Set;
22*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.empty());
23*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, Set.size());
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker // Lookups on empty set.
28*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(0) == Set.end());
29*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(9) == Set.end());
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker // Same thing on a const reference.
32*9880d681SAndroid Build Coastguard Worker const USet &CSet = Set;
33*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CSet.empty());
34*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, CSet.size());
35*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CSet.find(0) == CSet.end());
36*9880d681SAndroid Build Coastguard Worker USet::const_iterator I = CSet.find(5);
37*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == CSet.end());
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker // Single entry set tests.
TEST(SparseMultiSetTest,SingleEntrySet)41*9880d681SAndroid Build Coastguard Worker TEST(SparseMultiSetTest, SingleEntrySet) {
42*9880d681SAndroid Build Coastguard Worker USet Set;
43*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
44*9880d681SAndroid Build Coastguard Worker USet::iterator I = Set.insert(5);
45*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I != Set.end());
46*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(*I == 5);
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.empty());
49*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Set.size());
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(0) == Set.end());
52*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(9) == Set.end());
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(0));
55*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.contains(5));
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker // Extra insert.
58*9880d681SAndroid Build Coastguard Worker I = Set.insert(5);
59*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I != Set.end());
60*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == ++Set.find(5));
61*9880d681SAndroid Build Coastguard Worker I--;
62*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.find(5));
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker // Erase non-existent element.
65*9880d681SAndroid Build Coastguard Worker I = Set.find(1);
66*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
67*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, Set.size());
68*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, *Set.find(5));
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker // Erase iterator.
71*9880d681SAndroid Build Coastguard Worker I = Set.find(5);
72*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I != Set.end());
73*9880d681SAndroid Build Coastguard Worker I = Set.erase(I);
74*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I != Set.end());
75*9880d681SAndroid Build Coastguard Worker I = Set.erase(I);
76*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
77*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.empty());
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker // Multiple entry set tests.
TEST(SparseMultiSetTest,MultipleEntrySet)81*9880d681SAndroid Build Coastguard Worker TEST(SparseMultiSetTest, MultipleEntrySet) {
82*9880d681SAndroid Build Coastguard Worker USet Set;
83*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker Set.insert(5);
86*9880d681SAndroid Build Coastguard Worker Set.insert(5);
87*9880d681SAndroid Build Coastguard Worker Set.insert(5);
88*9880d681SAndroid Build Coastguard Worker Set.insert(3);
89*9880d681SAndroid Build Coastguard Worker Set.insert(2);
90*9880d681SAndroid Build Coastguard Worker Set.insert(1);
91*9880d681SAndroid Build Coastguard Worker Set.insert(4);
92*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(7u, Set.size());
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker // Erase last element by key.
95*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.erase(Set.find(4)) == Set.end());
96*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6u, Set.size());
97*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(4));
98*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(4) == Set.end());
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker // Erase first element by key.
101*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3u, Set.count(5));
102*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.find(5) != Set.end());
103*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.erase(Set.find(5)) != Set.end());
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, Set.size());
105*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, Set.count(5));
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker Set.insert(6);
108*9880d681SAndroid Build Coastguard Worker Set.insert(7);
109*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(7u, Set.size());
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker // Erase tail by iterator.
112*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.getTail(6) == Set.getHead(6));
113*9880d681SAndroid Build Coastguard Worker USet::iterator I = Set.erase(Set.find(6));
114*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
115*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6u, Set.size());
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker // Erase tails by iterator.
118*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, Set.count(5));
119*9880d681SAndroid Build Coastguard Worker I = Set.getTail(5);
120*9880d681SAndroid Build Coastguard Worker I = Set.erase(I);
121*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
122*9880d681SAndroid Build Coastguard Worker --I;
123*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Set.count(5));
124*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5u, *I);
125*9880d681SAndroid Build Coastguard Worker I = Set.erase(I);
126*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(I == Set.end());
127*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, Set.count(5));
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker Set.insert(8);
130*9880d681SAndroid Build Coastguard Worker Set.insert(8);
131*9880d681SAndroid Build Coastguard Worker Set.insert(8);
132*9880d681SAndroid Build Coastguard Worker Set.insert(8);
133*9880d681SAndroid Build Coastguard Worker Set.insert(8);
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker // Erase all the 8s
136*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5, std::distance(Set.getHead(8), Set.end()));
137*9880d681SAndroid Build Coastguard Worker Set.eraseAll(8);
138*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, std::distance(Set.getHead(8), Set.end()));
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker // Clear and resize the universe.
141*9880d681SAndroid Build Coastguard Worker Set.clear();
142*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, Set.size());
143*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(3));
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.eraseAll(i);
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker for (unsigned i = 100; i != 800; ++i)
154*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Set.count(i));
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(99));
157*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(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 // Test out iterators
TEST(SparseMultiSetTest,Iterators)162*9880d681SAndroid Build Coastguard Worker TEST(SparseMultiSetTest, Iterators) {
163*9880d681SAndroid Build Coastguard Worker USet Set;
164*9880d681SAndroid Build Coastguard Worker Set.setUniverse(100);
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker Set.insert(0);
167*9880d681SAndroid Build Coastguard Worker Set.insert(1);
168*9880d681SAndroid Build Coastguard Worker Set.insert(2);
169*9880d681SAndroid Build Coastguard Worker Set.insert(0);
170*9880d681SAndroid Build Coastguard Worker Set.insert(1);
171*9880d681SAndroid Build Coastguard Worker Set.insert(0);
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker USet::RangePair RangePair = Set.equal_range(0);
174*9880d681SAndroid Build Coastguard Worker USet::iterator B = RangePair.first;
175*9880d681SAndroid Build Coastguard Worker USet::iterator E = RangePair.second;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker // Move the iterators around, going to end and coming back.
178*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, std::distance(B, E));
179*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, --(--(--E)));
180*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(++(++(++E)), Set.end());
181*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, --(--(--E)));
182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(++(++(++E)), Set.end());
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker // Insert into the tail, and move around again
185*9880d681SAndroid Build Coastguard Worker Set.insert(0);
186*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, --(--(--(--E))));
187*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(++(++(++(++E))), Set.end());
188*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, --(--(--(--E))));
189*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(++(++(++(++E))), Set.end());
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker // Erase a tail, and move around again
192*9880d681SAndroid Build Coastguard Worker USet::iterator Erased = Set.erase(Set.getTail(0));
193*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Erased, E);
194*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, --(--(--E)));
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker USet Set2;
197*9880d681SAndroid Build Coastguard Worker Set2.setUniverse(11);
198*9880d681SAndroid Build Coastguard Worker Set2.insert(3);
199*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!Set2.contains(0));
200*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!Set.contains(3));
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Set2.getHead(3), Set2.getTail(3));
203*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Set2.getHead(0), Set2.getTail(0));
204*9880d681SAndroid Build Coastguard Worker B = Set2.find(3);
205*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Set2.find(3), --(++B));
206*9880d681SAndroid Build Coastguard Worker }
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker struct Alt {
209*9880d681SAndroid Build Coastguard Worker unsigned Value;
Alt__anon634090110111::Alt210*9880d681SAndroid Build Coastguard Worker explicit Alt(unsigned x) : Value(x) {}
getSparseSetIndex__anon634090110111::Alt211*9880d681SAndroid Build Coastguard Worker unsigned getSparseSetIndex() const { return Value - 1000; }
212*9880d681SAndroid Build Coastguard Worker };
213*9880d681SAndroid Build Coastguard Worker
TEST(SparseMultiSetTest,AltStructSet)214*9880d681SAndroid Build Coastguard Worker TEST(SparseMultiSetTest, AltStructSet) {
215*9880d681SAndroid Build Coastguard Worker typedef SparseMultiSet<Alt> ASet;
216*9880d681SAndroid Build Coastguard Worker ASet Set;
217*9880d681SAndroid Build Coastguard Worker Set.setUniverse(10);
218*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1005));
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker ASet::iterator I = Set.find(5);
221*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I != Set.end());
222*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1005u, I->Value);
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1006));
225*9880d681SAndroid Build Coastguard Worker Set.insert(Alt(1006));
226*9880d681SAndroid Build Coastguard Worker I = Set.erase(Set.find(6));
227*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I != Set.end());
228*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1006u, I->Value);
229*9880d681SAndroid Build Coastguard Worker I = Set.erase(Set.find(6));
230*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I == Set.end());
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Set.contains(5));
233*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Set.contains(6));
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker } // namespace
236