blob: 9b71cf07f23b6a558c4dc522d120fd450879104c [file] [log] [blame]
Benjamin Kramere1c34e92012-03-06 20:40:02 +00001//===- llvm/unittest/ADT/SmallPtrSetTest.cpp ------------------------------===//
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// SmallPtrSet unit tests.
11//
12//===----------------------------------------------------------------------===//
13
14#include "gtest/gtest.h"
15#include "llvm/ADT/SmallPtrSet.h"
16
17using namespace llvm;
18
Chandler Carruth6d888bc2013-11-20 18:21:25 +000019TEST(SmallPtrSetTest, Assignment) {
20 int buf[8];
21 for (int i = 0; i < 8; ++i)
22 buf[i] = 0;
23
24 SmallPtrSet<int *, 4> s1;
25 s1.insert(&buf[0]);
26 s1.insert(&buf[1]);
27
28 SmallPtrSet<int *, 4> s2;
29 (s2 = s1).insert(&buf[2]);
30
31 // Self assign as well.
32 (s2 = s2).insert(&buf[3]);
33
34 s1 = s2;
35 EXPECT_EQ(4U, s1.size());
36 for (int i = 0; i < 8; ++i)
37 if (i < 4)
38 EXPECT_TRUE(s1.count(&buf[i]));
39 else
40 EXPECT_FALSE(s1.count(&buf[i]));
41}
42
Jean-Luc Duprat89fe2472013-03-29 22:07:12 +000043TEST(SmallPtrSetTest, GrowthTest) {
44 int i;
45 int buf[8];
46 for(i=0; i<8; ++i) buf[i]=0;
47
48
49 SmallPtrSet<int *, 4> s;
50 typedef SmallPtrSet<int *, 4>::iterator iter;
51
52 s.insert(&buf[0]);
53 s.insert(&buf[1]);
54 s.insert(&buf[2]);
55 s.insert(&buf[3]);
56 EXPECT_EQ(4U, s.size());
57
58 i = 0;
59 for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
60 (**I)++;
61 EXPECT_EQ(4, i);
62 for(i=0; i<8; ++i)
63 EXPECT_EQ(i<4?1:0,buf[i]);
64
65 s.insert(&buf[4]);
66 s.insert(&buf[5]);
67 s.insert(&buf[6]);
68 s.insert(&buf[7]);
69
70 i = 0;
71 for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
72 (**I)++;
73 EXPECT_EQ(8, i);
74 s.erase(&buf[4]);
75 s.erase(&buf[5]);
76 s.erase(&buf[6]);
77 s.erase(&buf[7]);
78 EXPECT_EQ(4U, s.size());
79
80 i = 0;
81 for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
82 (**I)++;
83 EXPECT_EQ(4, i);
84 for(i=0; i<8; ++i)
85 EXPECT_EQ(i<4?3:1,buf[i]);
86
87 s.clear();
88 for(i=0; i<8; ++i) buf[i]=0;
89 for(i=0; i<128; ++i) s.insert(&buf[i%8]); // test repeated entires
90 EXPECT_EQ(8U, s.size());
91 for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
92 (**I)++;
93 for(i=0; i<8; ++i)
94 EXPECT_EQ(1,buf[i]);
95}
96
Chandler Carruth55758e92013-11-20 11:14:33 +000097TEST(SmallPtrSetTest, CopyAndMoveTest) {
98 int buf[8];
99 for (int i = 0; i < 8; ++i)
100 buf[i] = 0;
101
102 SmallPtrSet<int *, 4> s1;
103 s1.insert(&buf[0]);
104 s1.insert(&buf[1]);
105 s1.insert(&buf[2]);
106 s1.insert(&buf[3]);
107 EXPECT_EQ(4U, s1.size());
108 for (int i = 0; i < 8; ++i)
109 if (i < 4)
110 EXPECT_TRUE(s1.count(&buf[i]));
111 else
112 EXPECT_FALSE(s1.count(&buf[i]));
113
114 SmallPtrSet<int *, 4> s2(s1);
115 EXPECT_EQ(4U, s2.size());
116 for (int i = 0; i < 8; ++i)
117 if (i < 4)
118 EXPECT_TRUE(s2.count(&buf[i]));
119 else
120 EXPECT_FALSE(s2.count(&buf[i]));
121
122 s1 = s2;
123 EXPECT_EQ(4U, s1.size());
Chandler Carruthc74010d2013-11-20 18:29:56 +0000124 EXPECT_EQ(4U, s2.size());
Chandler Carruth55758e92013-11-20 11:14:33 +0000125 for (int i = 0; i < 8; ++i)
126 if (i < 4)
127 EXPECT_TRUE(s1.count(&buf[i]));
128 else
129 EXPECT_FALSE(s1.count(&buf[i]));
130
Chandler Carruthc74010d2013-11-20 18:29:56 +0000131#if LLVM_HAS_RVALUE_REFERENCES
132 SmallPtrSet<int *, 4> s3(std::move(s1));
Chandler Carruth55758e92013-11-20 11:14:33 +0000133 EXPECT_EQ(4U, s3.size());
Chandler Carruthc74010d2013-11-20 18:29:56 +0000134 EXPECT_TRUE(s1.empty());
Chandler Carruth55758e92013-11-20 11:14:33 +0000135 for (int i = 0; i < 8; ++i)
136 if (i < 4)
137 EXPECT_TRUE(s3.count(&buf[i]));
138 else
139 EXPECT_FALSE(s3.count(&buf[i]));
140
Chandler Carruthc74010d2013-11-20 18:29:56 +0000141 // Move assign into the moved-from object. Also test move of a non-small
142 // container.
143 s3.insert(&buf[4]);
144 s3.insert(&buf[5]);
145 s3.insert(&buf[6]);
146 s3.insert(&buf[7]);
Chandler Carruth55758e92013-11-20 11:14:33 +0000147 s1 = llvm_move(s3);
Chandler Carruthc74010d2013-11-20 18:29:56 +0000148 EXPECT_EQ(8U, s1.size());
149 EXPECT_TRUE(s3.empty());
Chandler Carruth55758e92013-11-20 11:14:33 +0000150 for (int i = 0; i < 8; ++i)
Chandler Carruthc74010d2013-11-20 18:29:56 +0000151 EXPECT_TRUE(s1.count(&buf[i]));
152
153 // Copy assign into a moved-from object.
154 s3 = s1;
155 EXPECT_EQ(8U, s3.size());
156 EXPECT_EQ(8U, s1.size());
157 for (int i = 0; i < 8; ++i)
158 EXPECT_TRUE(s3.count(&buf[i]));
159#endif
Chandler Carruth55758e92013-11-20 11:14:33 +0000160}
Jean-Luc Duprat89fe2472013-03-29 22:07:12 +0000161
Benjamin Kramere1c34e92012-03-06 20:40:02 +0000162TEST(SmallPtrSetTest, SwapTest) {
163 int buf[10];
164
165 SmallPtrSet<int *, 2> a;
166 SmallPtrSet<int *, 2> b;
167
168 a.insert(&buf[0]);
169 a.insert(&buf[1]);
170 b.insert(&buf[2]);
171
172 std::swap(a, b);
173
174 EXPECT_EQ(1U, a.size());
175 EXPECT_EQ(2U, b.size());
176 EXPECT_TRUE(a.count(&buf[2]));
177 EXPECT_TRUE(b.count(&buf[0]));
178 EXPECT_TRUE(b.count(&buf[1]));
179
180 b.insert(&buf[3]);
181 std::swap(a, b);
182
183 EXPECT_EQ(3U, a.size());
184 EXPECT_EQ(1U, b.size());
185 EXPECT_TRUE(a.count(&buf[0]));
186 EXPECT_TRUE(a.count(&buf[1]));
187 EXPECT_TRUE(a.count(&buf[3]));
188 EXPECT_TRUE(b.count(&buf[2]));
189
190 std::swap(a, b);
191
192 EXPECT_EQ(1U, a.size());
193 EXPECT_EQ(3U, b.size());
194 EXPECT_TRUE(a.count(&buf[2]));
195 EXPECT_TRUE(b.count(&buf[0]));
196 EXPECT_TRUE(b.count(&buf[1]));
197 EXPECT_TRUE(b.count(&buf[3]));
198
199 a.insert(&buf[4]);
200 a.insert(&buf[5]);
201 a.insert(&buf[6]);
202
203 std::swap(b, a);
204
205 EXPECT_EQ(3U, a.size());
206 EXPECT_EQ(4U, b.size());
207 EXPECT_TRUE(b.count(&buf[2]));
208 EXPECT_TRUE(b.count(&buf[4]));
209 EXPECT_TRUE(b.count(&buf[5]));
210 EXPECT_TRUE(b.count(&buf[6]));
211 EXPECT_TRUE(a.count(&buf[0]));
212 EXPECT_TRUE(a.count(&buf[1]));
213 EXPECT_TRUE(a.count(&buf[3]));
214}