blob: c7def84340a69399821609a8d00424e68fb2e1c1 [file] [log] [blame]
Jakob Stoklund Olesen8dc92672010-11-19 04:47:19 +00001//===---- ADT/IntervalMapTest.cpp - IntervalMap unit tests ------*- C++ -*-===//
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#include "llvm/ADT/IntervalMap.h"
11#include "gtest/gtest.h"
12
13using namespace llvm;
14
15namespace {
16
17typedef IntervalMap<unsigned, unsigned> UUMap;
18
19// Empty map tests
20TEST(IntervalMapTest, EmptyMap) {
21 UUMap::Allocator allocator;
22 UUMap map(allocator);
23 EXPECT_TRUE(map.empty());
24
25 // Lookup on empty map.
26 EXPECT_EQ(0u, map.lookup(0));
27 EXPECT_EQ(7u, map.lookup(0, 7));
28 EXPECT_EQ(0u, map.lookup(~0u-1));
29 EXPECT_EQ(7u, map.lookup(~0u-1, 7));
30
31 // Iterators.
32 EXPECT_TRUE(map.begin() == map.begin());
33 EXPECT_TRUE(map.begin() == map.end());
34 EXPECT_TRUE(map.end() == map.end());
35 EXPECT_FALSE(map.begin() != map.begin());
36 EXPECT_FALSE(map.begin() != map.end());
37 EXPECT_FALSE(map.end() != map.end());
38 EXPECT_FALSE(map.begin().valid());
39 EXPECT_FALSE(map.end().valid());
40 UUMap::iterator I = map.begin();
41 EXPECT_FALSE(I.valid());
42 EXPECT_TRUE(I == map.end());
43}
44
45// Single entry map tests
46TEST(IntervalMapTest, SingleEntryMap) {
47 UUMap::Allocator allocator;
48 UUMap map(allocator);
49 map.insert(100, 150, 1);
50 EXPECT_FALSE(map.empty());
51
52 // Lookup around interval.
53 EXPECT_EQ(0u, map.lookup(0));
54 EXPECT_EQ(0u, map.lookup(99));
55 EXPECT_EQ(1u, map.lookup(100));
56 EXPECT_EQ(1u, map.lookup(101));
57 EXPECT_EQ(1u, map.lookup(125));
58 EXPECT_EQ(1u, map.lookup(149));
59 EXPECT_EQ(1u, map.lookup(150));
60 EXPECT_EQ(0u, map.lookup(151));
61 EXPECT_EQ(0u, map.lookup(200));
62 EXPECT_EQ(0u, map.lookup(~0u-1));
63
64 // Iterators.
65 EXPECT_TRUE(map.begin() == map.begin());
66 EXPECT_FALSE(map.begin() == map.end());
67 EXPECT_TRUE(map.end() == map.end());
68 EXPECT_TRUE(map.begin().valid());
69 EXPECT_FALSE(map.end().valid());
70
71 // Iter deref.
72 UUMap::iterator I = map.begin();
73 ASSERT_TRUE(I.valid());
74 EXPECT_EQ(100u, I.start());
75 EXPECT_EQ(150u, I.stop());
76 EXPECT_EQ(1u, I.value());
77
78 // Preincrement.
79 ++I;
80 EXPECT_FALSE(I.valid());
81 EXPECT_FALSE(I == map.begin());
82 EXPECT_TRUE(I == map.end());
83
84 // PreDecrement.
85 --I;
86 ASSERT_TRUE(I.valid());
87 EXPECT_EQ(100u, I.start());
88 EXPECT_EQ(150u, I.stop());
89 EXPECT_EQ(1u, I.value());
90 EXPECT_TRUE(I == map.begin());
91 EXPECT_FALSE(I == map.end());
92}
93
94// Flat coalescing tests.
95TEST(IntervalMapTest, RootCoalescing) {
96 UUMap::Allocator allocator;
97 UUMap map(allocator);
98 map.insert(100, 150, 1);
99
100 // Coalesce from the left.
101 map.insert(90, 99, 1);
102 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
103 EXPECT_EQ(90u, map.start());
104 EXPECT_EQ(150u, map.stop());
105
106 // Overlap left.
107 map.insert(80, 100, 1);
108 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
109 EXPECT_EQ(80u, map.start());
110 EXPECT_EQ(150u, map.stop());
111
112 // Inside.
113 map.insert(100, 130, 1);
114 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
115 EXPECT_EQ(80u, map.start());
116 EXPECT_EQ(150u, map.stop());
117
118 // Overlap both.
119 map.insert(70, 160, 1);
120 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
121 EXPECT_EQ(70u, map.start());
122 EXPECT_EQ(160u, map.stop());
123
124 // Overlap right.
125 map.insert(80, 170, 1);
126 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
127 EXPECT_EQ(70u, map.start());
128 EXPECT_EQ(170u, map.stop());
129
130 // Coalesce from the right.
131 map.insert(170, 200, 1);
132 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
133 EXPECT_EQ(70u, map.start());
134 EXPECT_EQ(200u, map.stop());
135
136 // Non-coalesce from the left.
137 map.insert(60, 69, 2);
138 EXPECT_EQ(2, std::distance(map.begin(), map.end()));
139 EXPECT_EQ(60u, map.start());
140 EXPECT_EQ(200u, map.stop());
141 EXPECT_EQ(2u, map.lookup(69));
142 EXPECT_EQ(1u, map.lookup(70));
143
144 UUMap::iterator I = map.begin();
145 EXPECT_EQ(60u, I.start());
146 EXPECT_EQ(69u, I.stop());
147 EXPECT_EQ(2u, I.value());
148 ++I;
149 EXPECT_EQ(70u, I.start());
150 EXPECT_EQ(200u, I.stop());
151 EXPECT_EQ(1u, I.value());
152 ++I;
153 EXPECT_FALSE(I.valid());
154
155 // Non-coalesce from the right.
156 map.insert(201, 210, 2);
157 EXPECT_EQ(3, std::distance(map.begin(), map.end()));
158 EXPECT_EQ(60u, map.start());
159 EXPECT_EQ(210u, map.stop());
160 EXPECT_EQ(2u, map.lookup(201));
161 EXPECT_EQ(1u, map.lookup(200));
162}
163
164// Flat multi-coalescing tests.
165TEST(IntervalMapTest, RootMultiCoalescing) {
166 UUMap::Allocator allocator;
167 UUMap map(allocator);
168 map.insert(140, 150, 1);
169 map.insert(160, 170, 1);
170 map.insert(100, 110, 1);
171 map.insert(120, 130, 1);
172 EXPECT_EQ(4, std::distance(map.begin(), map.end()));
173 EXPECT_EQ(100u, map.start());
174 EXPECT_EQ(170u, map.stop());
175
176 // Verify inserts.
177 UUMap::iterator I = map.begin();
178 EXPECT_EQ(100u, I.start());
179 EXPECT_EQ(110u, I.stop());
180 ++I;
181 EXPECT_EQ(120u, I.start());
182 EXPECT_EQ(130u, I.stop());
183 ++I;
184 EXPECT_EQ(140u, I.start());
185 EXPECT_EQ(150u, I.stop());
186 ++I;
187 EXPECT_EQ(160u, I.start());
188 EXPECT_EQ(170u, I.stop());
189 ++I;
190 EXPECT_FALSE(I.valid());
191
192
193 // Coalesce left with followers.
194 // [100;110] [120;130] [140;150] [160;170]
195 map.insert(111, 115, 1);
196 I = map.begin();
197 ASSERT_TRUE(I.valid());
198 EXPECT_EQ(100u, I.start());
199 EXPECT_EQ(115u, I.stop());
200 ++I;
201 ASSERT_TRUE(I.valid());
202 EXPECT_EQ(120u, I.start());
203 EXPECT_EQ(130u, I.stop());
204 ++I;
205 ASSERT_TRUE(I.valid());
206 EXPECT_EQ(140u, I.start());
207 EXPECT_EQ(150u, I.stop());
208 ++I;
209 ASSERT_TRUE(I.valid());
210 EXPECT_EQ(160u, I.start());
211 EXPECT_EQ(170u, I.stop());
212 ++I;
213 EXPECT_FALSE(I.valid());
214
215 // Coalesce right with followers.
216 // [100;115] [120;130] [140;150] [160;170]
217 map.insert(135, 139, 1);
218 I = map.begin();
219 ASSERT_TRUE(I.valid());
220 EXPECT_EQ(100u, I.start());
221 EXPECT_EQ(115u, I.stop());
222 ++I;
223 ASSERT_TRUE(I.valid());
224 EXPECT_EQ(120u, I.start());
225 EXPECT_EQ(130u, I.stop());
226 ++I;
227 ASSERT_TRUE(I.valid());
228 EXPECT_EQ(135u, I.start());
229 EXPECT_EQ(150u, I.stop());
230 ++I;
231 ASSERT_TRUE(I.valid());
232 EXPECT_EQ(160u, I.start());
233 EXPECT_EQ(170u, I.stop());
234 ++I;
235 EXPECT_FALSE(I.valid());
236
237 // Coalesce left and right with followers.
238 // [100;115] [120;130] [135;150] [160;170]
239 map.insert(131, 134, 1);
240 I = map.begin();
241 ASSERT_TRUE(I.valid());
242 EXPECT_EQ(100u, I.start());
243 EXPECT_EQ(115u, I.stop());
244 ++I;
245 ASSERT_TRUE(I.valid());
246 EXPECT_EQ(120u, I.start());
247 EXPECT_EQ(150u, I.stop());
248 ++I;
249 ASSERT_TRUE(I.valid());
250 EXPECT_EQ(160u, I.start());
251 EXPECT_EQ(170u, I.stop());
252 ++I;
253 EXPECT_FALSE(I.valid());
254
255 // Coalesce multiple with overlap right.
256 // [100;115] [120;150] [160;170]
257 map.insert(116, 165, 1);
258 I = map.begin();
259 ASSERT_TRUE(I.valid());
260 EXPECT_EQ(100u, I.start());
261 EXPECT_EQ(170u, I.stop());
262 ++I;
263 EXPECT_FALSE(I.valid());
264
265 // Coalesce multiple with overlap left
266 // [100;170]
267 map.insert(180, 190, 1);
268 map.insert(200, 210, 1);
269 map.insert(220, 230, 1);
270 // [100;170] [180;190] [200;210] [220;230]
271 map.insert(160, 199, 1);
272 I = map.begin();
273 ASSERT_TRUE(I.valid());
274 EXPECT_EQ(100u, I.start());
275 EXPECT_EQ(210u, I.stop());
276 ++I;
277 ASSERT_TRUE(I.valid());
278 EXPECT_EQ(220u, I.start());
279 EXPECT_EQ(230u, I.stop());
280 ++I;
281 EXPECT_FALSE(I.valid());
282
283 // Overwrite 2 from gap to gap.
284 // [100;210] [220;230]
285 map.insert(50, 250, 1);
286 I = map.begin();
287 ASSERT_TRUE(I.valid());
288 EXPECT_EQ(50u, I.start());
289 EXPECT_EQ(250u, I.stop());
290 ++I;
291 EXPECT_FALSE(I.valid());
292
293 // Coalesce at end of full root.
294 // [50;250]
295 map.insert(260, 270, 1);
296 map.insert(280, 290, 1);
297 map.insert(300, 310, 1);
298 // [50;250] [260;270] [280;290] [300;310]
299 map.insert(311, 320, 1);
300 I = map.begin();
301 ASSERT_TRUE(I.valid());
302 EXPECT_EQ(50u, I.start());
303 EXPECT_EQ(250u, I.stop());
304 ++I;
305 ASSERT_TRUE(I.valid());
306 EXPECT_EQ(260u, I.start());
307 EXPECT_EQ(270u, I.stop());
308 ++I;
309 ASSERT_TRUE(I.valid());
310 EXPECT_EQ(280u, I.start());
311 EXPECT_EQ(290u, I.stop());
312 ++I;
313 ASSERT_TRUE(I.valid());
314 EXPECT_EQ(300u, I.start());
315 EXPECT_EQ(320u, I.stop());
316 ++I;
317 EXPECT_FALSE(I.valid());
318}
319
320// Branched, non-coalescing tests.
321TEST(IntervalMapTest, Branched) {
322 UUMap::Allocator allocator;
323 UUMap map(allocator);
324
325 // Insert enough intervals to force a branched tree.
326 // This creates 9 leaf nodes with 11 elements each, tree height = 1.
327 for (unsigned i = 1; i < 100; ++i)
328 map.insert(10*i, 10*i+5, i);
329
330 // Tree limits.
331 EXPECT_FALSE(map.empty());
332 EXPECT_EQ(10u, map.start());
333 EXPECT_EQ(995u, map.stop());
334
335 // Tree lookup.
336 for (unsigned i = 1; i < 100; ++i) {
337 EXPECT_EQ(0u, map.lookup(10*i-1));
338 EXPECT_EQ(i, map.lookup(10*i));
339 EXPECT_EQ(i, map.lookup(10*i+5));
340 EXPECT_EQ(0u, map.lookup(10*i+6));
341 }
342
343 // Forward iteration.
344 UUMap::iterator I = map.begin();
345 for (unsigned i = 1; i < 100; ++i) {
346 ASSERT_TRUE(I.valid());
347 EXPECT_EQ(10*i, I.start());
348 EXPECT_EQ(10*i+5, I.stop());
349 EXPECT_EQ(i, *I);
350 ++I;
351 }
352 EXPECT_FALSE(I.valid());
353 EXPECT_TRUE(I == map.end());
354
Jakob Stoklund Olesendb525662010-11-19 23:28:53 +0000355 // Backwards iteration.
356 for (unsigned i = 99; i; --i) {
357 --I;
358 ASSERT_TRUE(I.valid());
359 EXPECT_EQ(10*i, I.start());
360 EXPECT_EQ(10*i+5, I.stop());
361 EXPECT_EQ(i, *I);
362 }
363 EXPECT_TRUE(I == map.begin());
364
Jakob Stoklund Olesen8dc92672010-11-19 04:47:19 +0000365}
366
367} // namespace