1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/SmallPtrSetTest.cpp ------------------------------===//
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 // SmallPtrSet unit tests.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallPtrSet.h"
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker using namespace llvm;
18*9880d681SAndroid Build Coastguard Worker
TEST(SmallPtrSetTest,Assignment)19*9880d681SAndroid Build Coastguard Worker TEST(SmallPtrSetTest, Assignment) {
20*9880d681SAndroid Build Coastguard Worker int buf[8];
21*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
22*9880d681SAndroid Build Coastguard Worker buf[i] = 0;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s1;
25*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[0]);
26*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[1]);
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s2;
29*9880d681SAndroid Build Coastguard Worker (s2 = s1).insert(&buf[2]);
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker // Self assign as well.
32*9880d681SAndroid Build Coastguard Worker (s2 = s2).insert(&buf[3]);
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker s1 = s2;
35*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s1.size());
36*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
37*9880d681SAndroid Build Coastguard Worker if (i < 4)
38*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s1.count(&buf[i]));
39*9880d681SAndroid Build Coastguard Worker else
40*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(s1.count(&buf[i]));
41*9880d681SAndroid Build Coastguard Worker }
42*9880d681SAndroid Build Coastguard Worker
TEST(SmallPtrSetTest,GrowthTest)43*9880d681SAndroid Build Coastguard Worker TEST(SmallPtrSetTest, GrowthTest) {
44*9880d681SAndroid Build Coastguard Worker int i;
45*9880d681SAndroid Build Coastguard Worker int buf[8];
46*9880d681SAndroid Build Coastguard Worker for(i=0; i<8; ++i) buf[i]=0;
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s;
50*9880d681SAndroid Build Coastguard Worker typedef SmallPtrSet<int *, 4>::iterator iter;
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker s.insert(&buf[0]);
53*9880d681SAndroid Build Coastguard Worker s.insert(&buf[1]);
54*9880d681SAndroid Build Coastguard Worker s.insert(&buf[2]);
55*9880d681SAndroid Build Coastguard Worker s.insert(&buf[3]);
56*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s.size());
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker i = 0;
59*9880d681SAndroid Build Coastguard Worker for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
60*9880d681SAndroid Build Coastguard Worker (**I)++;
61*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, i);
62*9880d681SAndroid Build Coastguard Worker for(i=0; i<8; ++i)
63*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(i<4?1:0,buf[i]);
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker s.insert(&buf[4]);
66*9880d681SAndroid Build Coastguard Worker s.insert(&buf[5]);
67*9880d681SAndroid Build Coastguard Worker s.insert(&buf[6]);
68*9880d681SAndroid Build Coastguard Worker s.insert(&buf[7]);
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker i = 0;
71*9880d681SAndroid Build Coastguard Worker for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
72*9880d681SAndroid Build Coastguard Worker (**I)++;
73*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(8, i);
74*9880d681SAndroid Build Coastguard Worker s.erase(&buf[4]);
75*9880d681SAndroid Build Coastguard Worker s.erase(&buf[5]);
76*9880d681SAndroid Build Coastguard Worker s.erase(&buf[6]);
77*9880d681SAndroid Build Coastguard Worker s.erase(&buf[7]);
78*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s.size());
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker i = 0;
81*9880d681SAndroid Build Coastguard Worker for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
82*9880d681SAndroid Build Coastguard Worker (**I)++;
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, i);
84*9880d681SAndroid Build Coastguard Worker for(i=0; i<8; ++i)
85*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(i<4?3:1,buf[i]);
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker s.clear();
88*9880d681SAndroid Build Coastguard Worker for(i=0; i<8; ++i) buf[i]=0;
89*9880d681SAndroid Build Coastguard Worker for(i=0; i<128; ++i) s.insert(&buf[i%8]); // test repeated entires
90*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(8U, s.size());
91*9880d681SAndroid Build Coastguard Worker for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
92*9880d681SAndroid Build Coastguard Worker (**I)++;
93*9880d681SAndroid Build Coastguard Worker for(i=0; i<8; ++i)
94*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1,buf[i]);
95*9880d681SAndroid Build Coastguard Worker }
96*9880d681SAndroid Build Coastguard Worker
TEST(SmallPtrSetTest,CopyAndMoveTest)97*9880d681SAndroid Build Coastguard Worker TEST(SmallPtrSetTest, CopyAndMoveTest) {
98*9880d681SAndroid Build Coastguard Worker int buf[8];
99*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
100*9880d681SAndroid Build Coastguard Worker buf[i] = 0;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s1;
103*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[0]);
104*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[1]);
105*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[2]);
106*9880d681SAndroid Build Coastguard Worker s1.insert(&buf[3]);
107*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s1.size());
108*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
109*9880d681SAndroid Build Coastguard Worker if (i < 4)
110*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s1.count(&buf[i]));
111*9880d681SAndroid Build Coastguard Worker else
112*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(s1.count(&buf[i]));
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s2(s1);
115*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s2.size());
116*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
117*9880d681SAndroid Build Coastguard Worker if (i < 4)
118*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s2.count(&buf[i]));
119*9880d681SAndroid Build Coastguard Worker else
120*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(s2.count(&buf[i]));
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker s1 = s2;
123*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s1.size());
124*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s2.size());
125*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
126*9880d681SAndroid Build Coastguard Worker if (i < 4)
127*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s1.count(&buf[i]));
128*9880d681SAndroid Build Coastguard Worker else
129*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(s1.count(&buf[i]));
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 4> s3(std::move(s1));
132*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, s3.size());
133*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s1.empty());
134*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
135*9880d681SAndroid Build Coastguard Worker if (i < 4)
136*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s3.count(&buf[i]));
137*9880d681SAndroid Build Coastguard Worker else
138*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(s3.count(&buf[i]));
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker // Move assign into the moved-from object. Also test move of a non-small
141*9880d681SAndroid Build Coastguard Worker // container.
142*9880d681SAndroid Build Coastguard Worker s3.insert(&buf[4]);
143*9880d681SAndroid Build Coastguard Worker s3.insert(&buf[5]);
144*9880d681SAndroid Build Coastguard Worker s3.insert(&buf[6]);
145*9880d681SAndroid Build Coastguard Worker s3.insert(&buf[7]);
146*9880d681SAndroid Build Coastguard Worker s1 = std::move(s3);
147*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(8U, s1.size());
148*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s3.empty());
149*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
150*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s1.count(&buf[i]));
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker // Copy assign into a moved-from object.
153*9880d681SAndroid Build Coastguard Worker s3 = s1;
154*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(8U, s3.size());
155*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(8U, s1.size());
156*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i)
157*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(s3.count(&buf[i]));
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker
TEST(SmallPtrSetTest,SwapTest)160*9880d681SAndroid Build Coastguard Worker TEST(SmallPtrSetTest, SwapTest) {
161*9880d681SAndroid Build Coastguard Worker int buf[10];
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 2> a;
164*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 2> b;
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker a.insert(&buf[0]);
167*9880d681SAndroid Build Coastguard Worker a.insert(&buf[1]);
168*9880d681SAndroid Build Coastguard Worker b.insert(&buf[2]);
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2U, a.size());
171*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, b.size());
172*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[0]));
173*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[1]));
174*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[2]));
175*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[3]));
176*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[0]));
177*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[1]));
178*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[2]));
179*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[3]));
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker std::swap(a, b);
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, a.size());
184*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2U, b.size());
185*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[0]));
186*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[1]));
187*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[2]));
188*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[3]));
189*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[0]));
190*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[1]));
191*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[2]));
192*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[3]));
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker b.insert(&buf[3]);
195*9880d681SAndroid Build Coastguard Worker std::swap(a, b);
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3U, a.size());
198*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, b.size());
199*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[0]));
200*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[1]));
201*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[2]));
202*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[3]));
203*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[0]));
204*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[1]));
205*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[2]));
206*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[3]));
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker std::swap(a, b);
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, a.size());
211*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3U, b.size());
212*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[0]));
213*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[1]));
214*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[2]));
215*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(a.count(&buf[3]));
216*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[0]));
217*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[1]));
218*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b.count(&buf[2]));
219*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[3]));
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker a.insert(&buf[4]);
222*9880d681SAndroid Build Coastguard Worker a.insert(&buf[5]);
223*9880d681SAndroid Build Coastguard Worker a.insert(&buf[6]);
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker std::swap(b, a);
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3U, a.size());
228*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4U, b.size());
229*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[2]));
230*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[4]));
231*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[5]));
232*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b.count(&buf[6]));
233*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[0]));
234*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[1]));
235*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(a.count(&buf[3]));
236*9880d681SAndroid Build Coastguard Worker }
237*9880d681SAndroid Build Coastguard Worker
checkEraseAndIterators(SmallPtrSetImpl<int * > & S)238*9880d681SAndroid Build Coastguard Worker void checkEraseAndIterators(SmallPtrSetImpl<int*> &S) {
239*9880d681SAndroid Build Coastguard Worker int buf[3];
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker S.insert(&buf[0]);
242*9880d681SAndroid Build Coastguard Worker S.insert(&buf[1]);
243*9880d681SAndroid Build Coastguard Worker S.insert(&buf[2]);
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker // Iterators must still be valid after erase() calls;
246*9880d681SAndroid Build Coastguard Worker auto B = S.begin();
247*9880d681SAndroid Build Coastguard Worker auto M = std::next(B);
248*9880d681SAndroid Build Coastguard Worker auto E = S.end();
249*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(*B == &buf[0] || *B == &buf[1] || *B == &buf[2]);
250*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(*M == &buf[0] || *M == &buf[1] || *M == &buf[2]);
251*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(*B != *M);
252*9880d681SAndroid Build Coastguard Worker int *Removable = *std::next(M);
253*9880d681SAndroid Build Coastguard Worker // No iterator points to Removable now.
254*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Removable == &buf[0] || Removable == &buf[1] ||
255*9880d681SAndroid Build Coastguard Worker Removable == &buf[2]);
256*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Removable != *B && Removable != *M);
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker S.erase(Removable);
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker // B,M,E iterators should still be valid
261*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B, S.begin());
262*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(M, std::next(B));
263*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(E, S.end());
264*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(std::next(M), E);
265*9880d681SAndroid Build Coastguard Worker }
266*9880d681SAndroid Build Coastguard Worker
TEST(SmallPtrSetTest,EraseTest)267*9880d681SAndroid Build Coastguard Worker TEST(SmallPtrSetTest, EraseTest) {
268*9880d681SAndroid Build Coastguard Worker // Test when set stays small.
269*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 8> B;
270*9880d681SAndroid Build Coastguard Worker checkEraseAndIterators(B);
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker // Test when set grows big.
273*9880d681SAndroid Build Coastguard Worker SmallPtrSet<int *, 2> A;
274*9880d681SAndroid Build Coastguard Worker checkEraseAndIterators(A);
275*9880d681SAndroid Build Coastguard Worker }
276