blob: 11f13752f310f18806e9ad8470c0d8264aa9e0f8 [file] [log] [blame]
Jakob Stoklund Olesen345945e2010-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
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +000017typedef IntervalMap<unsigned, unsigned, 4> UUMap;
Michael LeMay609d8512016-11-03 19:14:46 +000018typedef IntervalMap<unsigned, unsigned, 4,
19 IntervalMapHalfOpenInfo<unsigned>> UUHalfOpenMap;
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +000020
21// Empty map tests
22TEST(IntervalMapTest, EmptyMap) {
23 UUMap::Allocator allocator;
24 UUMap map(allocator);
25 EXPECT_TRUE(map.empty());
26
27 // Lookup on empty map.
28 EXPECT_EQ(0u, map.lookup(0));
29 EXPECT_EQ(7u, map.lookup(0, 7));
30 EXPECT_EQ(0u, map.lookup(~0u-1));
31 EXPECT_EQ(7u, map.lookup(~0u-1, 7));
32
33 // Iterators.
34 EXPECT_TRUE(map.begin() == map.begin());
35 EXPECT_TRUE(map.begin() == map.end());
36 EXPECT_TRUE(map.end() == map.end());
37 EXPECT_FALSE(map.begin() != map.begin());
38 EXPECT_FALSE(map.begin() != map.end());
39 EXPECT_FALSE(map.end() != map.end());
40 EXPECT_FALSE(map.begin().valid());
41 EXPECT_FALSE(map.end().valid());
42 UUMap::iterator I = map.begin();
43 EXPECT_FALSE(I.valid());
44 EXPECT_TRUE(I == map.end());
Jakob Stoklund Olesen8710e4f2010-11-28 07:21:48 +000045
46 // Default constructor and cross-constness compares.
47 UUMap::const_iterator CI;
48 CI = map.begin();
49 EXPECT_TRUE(CI == I);
50 UUMap::iterator I2;
51 I2 = map.end();
52 EXPECT_TRUE(I2 == CI);
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +000053}
54
55// Single entry map tests
56TEST(IntervalMapTest, SingleEntryMap) {
57 UUMap::Allocator allocator;
58 UUMap map(allocator);
59 map.insert(100, 150, 1);
60 EXPECT_FALSE(map.empty());
61
62 // Lookup around interval.
63 EXPECT_EQ(0u, map.lookup(0));
64 EXPECT_EQ(0u, map.lookup(99));
65 EXPECT_EQ(1u, map.lookup(100));
66 EXPECT_EQ(1u, map.lookup(101));
67 EXPECT_EQ(1u, map.lookup(125));
68 EXPECT_EQ(1u, map.lookup(149));
69 EXPECT_EQ(1u, map.lookup(150));
70 EXPECT_EQ(0u, map.lookup(151));
71 EXPECT_EQ(0u, map.lookup(200));
72 EXPECT_EQ(0u, map.lookup(~0u-1));
73
74 // Iterators.
75 EXPECT_TRUE(map.begin() == map.begin());
76 EXPECT_FALSE(map.begin() == map.end());
77 EXPECT_TRUE(map.end() == map.end());
78 EXPECT_TRUE(map.begin().valid());
79 EXPECT_FALSE(map.end().valid());
80
81 // Iter deref.
82 UUMap::iterator I = map.begin();
83 ASSERT_TRUE(I.valid());
84 EXPECT_EQ(100u, I.start());
85 EXPECT_EQ(150u, I.stop());
86 EXPECT_EQ(1u, I.value());
87
88 // Preincrement.
89 ++I;
90 EXPECT_FALSE(I.valid());
91 EXPECT_FALSE(I == map.begin());
92 EXPECT_TRUE(I == map.end());
93
94 // PreDecrement.
95 --I;
96 ASSERT_TRUE(I.valid());
97 EXPECT_EQ(100u, I.start());
98 EXPECT_EQ(150u, I.stop());
99 EXPECT_EQ(1u, I.value());
100 EXPECT_TRUE(I == map.begin());
101 EXPECT_FALSE(I == map.end());
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000102
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000103 // Change the value.
104 I.setValue(2);
105 ASSERT_TRUE(I.valid());
106 EXPECT_EQ(100u, I.start());
107 EXPECT_EQ(150u, I.stop());
108 EXPECT_EQ(2u, I.value());
109
110 // Grow the bounds.
111 I.setStart(0);
112 ASSERT_TRUE(I.valid());
113 EXPECT_EQ(0u, I.start());
114 EXPECT_EQ(150u, I.stop());
115 EXPECT_EQ(2u, I.value());
116
117 I.setStop(200);
118 ASSERT_TRUE(I.valid());
119 EXPECT_EQ(0u, I.start());
120 EXPECT_EQ(200u, I.stop());
121 EXPECT_EQ(2u, I.value());
122
123 // Shrink the bounds.
124 I.setStart(150);
125 ASSERT_TRUE(I.valid());
126 EXPECT_EQ(150u, I.start());
127 EXPECT_EQ(200u, I.stop());
128 EXPECT_EQ(2u, I.value());
129
Michael LeMay609d8512016-11-03 19:14:46 +0000130 // Shrink the interval to have a length of 1
131 I.setStop(150);
132 ASSERT_TRUE(I.valid());
133 EXPECT_EQ(150u, I.start());
134 EXPECT_EQ(150u, I.stop());
135 EXPECT_EQ(2u, I.value());
136
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000137 I.setStop(160);
138 ASSERT_TRUE(I.valid());
139 EXPECT_EQ(150u, I.start());
140 EXPECT_EQ(160u, I.stop());
141 EXPECT_EQ(2u, I.value());
142
Michael LeMay609d8512016-11-03 19:14:46 +0000143 // Shrink the interval to have a length of 1
144 I.setStart(160);
145 ASSERT_TRUE(I.valid());
146 EXPECT_EQ(160u, I.start());
147 EXPECT_EQ(160u, I.stop());
148 EXPECT_EQ(2u, I.value());
149
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000150 // Erase last elem.
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000151 I.erase();
152 EXPECT_TRUE(map.empty());
153 EXPECT_EQ(0, std::distance(map.begin(), map.end()));
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000154}
155
Michael LeMay609d8512016-11-03 19:14:46 +0000156// Single entry half-open map tests
157TEST(IntervalMapTest, SingleEntryHalfOpenMap) {
158 UUHalfOpenMap::Allocator allocator;
159 UUHalfOpenMap map(allocator);
160 map.insert(100, 150, 1);
161 EXPECT_FALSE(map.empty());
162
163 UUHalfOpenMap::iterator I = map.begin();
164 ASSERT_TRUE(I.valid());
165
166 // Shrink the interval to have a length of 1
167 I.setStart(149);
168 ASSERT_TRUE(I.valid());
169 EXPECT_EQ(149u, I.start());
170 EXPECT_EQ(150u, I.stop());
171 EXPECT_EQ(1u, I.value());
172
173 I.setStop(160);
174 ASSERT_TRUE(I.valid());
175 EXPECT_EQ(149u, I.start());
176 EXPECT_EQ(160u, I.stop());
177 EXPECT_EQ(1u, I.value());
178
179 // Shrink the interval to have a length of 1
180 I.setStop(150);
181 ASSERT_TRUE(I.valid());
182 EXPECT_EQ(149u, I.start());
183 EXPECT_EQ(150u, I.stop());
184 EXPECT_EQ(1u, I.value());
185}
186
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000187// Flat coalescing tests.
188TEST(IntervalMapTest, RootCoalescing) {
189 UUMap::Allocator allocator;
190 UUMap map(allocator);
191 map.insert(100, 150, 1);
192
193 // Coalesce from the left.
194 map.insert(90, 99, 1);
195 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
196 EXPECT_EQ(90u, map.start());
197 EXPECT_EQ(150u, map.stop());
198
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000199 // Coalesce from the right.
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000200 map.insert(151, 200, 1);
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000201 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000202 EXPECT_EQ(90u, map.start());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000203 EXPECT_EQ(200u, map.stop());
204
205 // Non-coalesce from the left.
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000206 map.insert(60, 89, 2);
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000207 EXPECT_EQ(2, std::distance(map.begin(), map.end()));
208 EXPECT_EQ(60u, map.start());
209 EXPECT_EQ(200u, map.stop());
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000210 EXPECT_EQ(2u, map.lookup(89));
211 EXPECT_EQ(1u, map.lookup(90));
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000212
213 UUMap::iterator I = map.begin();
214 EXPECT_EQ(60u, I.start());
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000215 EXPECT_EQ(89u, I.stop());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000216 EXPECT_EQ(2u, I.value());
217 ++I;
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000218 EXPECT_EQ(90u, I.start());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000219 EXPECT_EQ(200u, I.stop());
220 EXPECT_EQ(1u, I.value());
221 ++I;
222 EXPECT_FALSE(I.valid());
223
224 // Non-coalesce from the right.
225 map.insert(201, 210, 2);
226 EXPECT_EQ(3, std::distance(map.begin(), map.end()));
227 EXPECT_EQ(60u, map.start());
228 EXPECT_EQ(210u, map.stop());
229 EXPECT_EQ(2u, map.lookup(201));
230 EXPECT_EQ(1u, map.lookup(200));
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000231
232 // Erase from the left.
233 map.begin().erase();
234 EXPECT_EQ(2, std::distance(map.begin(), map.end()));
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000235 EXPECT_EQ(90u, map.start());
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000236 EXPECT_EQ(210u, map.stop());
237
238 // Erase from the right.
239 (--map.end()).erase();
240 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
Jakob Stoklund Olesen7aad3982010-11-28 22:17:11 +0000241 EXPECT_EQ(90u, map.start());
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000242 EXPECT_EQ(200u, map.stop());
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000243
244 // Add non-coalescing, then trigger coalescing with setValue.
245 map.insert(80, 89, 2);
246 map.insert(201, 210, 2);
247 EXPECT_EQ(3, std::distance(map.begin(), map.end()));
248 (++map.begin()).setValue(2);
249 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
250 I = map.begin();
251 ASSERT_TRUE(I.valid());
252 EXPECT_EQ(80u, I.start());
253 EXPECT_EQ(210u, I.stop());
254 EXPECT_EQ(2u, I.value());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000255}
256
257// Flat multi-coalescing tests.
258TEST(IntervalMapTest, RootMultiCoalescing) {
259 UUMap::Allocator allocator;
260 UUMap map(allocator);
261 map.insert(140, 150, 1);
262 map.insert(160, 170, 1);
263 map.insert(100, 110, 1);
264 map.insert(120, 130, 1);
265 EXPECT_EQ(4, std::distance(map.begin(), map.end()));
266 EXPECT_EQ(100u, map.start());
267 EXPECT_EQ(170u, map.stop());
268
269 // Verify inserts.
270 UUMap::iterator I = map.begin();
271 EXPECT_EQ(100u, I.start());
272 EXPECT_EQ(110u, I.stop());
273 ++I;
274 EXPECT_EQ(120u, I.start());
275 EXPECT_EQ(130u, I.stop());
276 ++I;
277 EXPECT_EQ(140u, I.start());
278 EXPECT_EQ(150u, I.stop());
279 ++I;
280 EXPECT_EQ(160u, I.start());
281 EXPECT_EQ(170u, I.stop());
282 ++I;
283 EXPECT_FALSE(I.valid());
284
Jakob Stoklund Olesenbd1a50e2010-11-28 07:00:46 +0000285 // Test advanceTo on flat tree.
286 I = map.begin();
287 I.advanceTo(135);
288 ASSERT_TRUE(I.valid());
289 EXPECT_EQ(140u, I.start());
290 EXPECT_EQ(150u, I.stop());
291
292 I.advanceTo(145);
293 ASSERT_TRUE(I.valid());
294 EXPECT_EQ(140u, I.start());
295 EXPECT_EQ(150u, I.stop());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000296
Jakob Stoklund Olesen54912ed2010-12-17 22:07:51 +0000297 I.advanceTo(200);
298 EXPECT_FALSE(I.valid());
299
300 I.advanceTo(300);
301 EXPECT_FALSE(I.valid());
302
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000303 // Coalesce left with followers.
304 // [100;110] [120;130] [140;150] [160;170]
305 map.insert(111, 115, 1);
306 I = map.begin();
307 ASSERT_TRUE(I.valid());
308 EXPECT_EQ(100u, I.start());
309 EXPECT_EQ(115u, I.stop());
310 ++I;
311 ASSERT_TRUE(I.valid());
312 EXPECT_EQ(120u, I.start());
313 EXPECT_EQ(130u, I.stop());
314 ++I;
315 ASSERT_TRUE(I.valid());
316 EXPECT_EQ(140u, I.start());
317 EXPECT_EQ(150u, I.stop());
318 ++I;
319 ASSERT_TRUE(I.valid());
320 EXPECT_EQ(160u, I.start());
321 EXPECT_EQ(170u, I.stop());
322 ++I;
323 EXPECT_FALSE(I.valid());
324
325 // Coalesce right with followers.
326 // [100;115] [120;130] [140;150] [160;170]
327 map.insert(135, 139, 1);
328 I = map.begin();
329 ASSERT_TRUE(I.valid());
330 EXPECT_EQ(100u, I.start());
331 EXPECT_EQ(115u, I.stop());
332 ++I;
333 ASSERT_TRUE(I.valid());
334 EXPECT_EQ(120u, I.start());
335 EXPECT_EQ(130u, I.stop());
336 ++I;
337 ASSERT_TRUE(I.valid());
338 EXPECT_EQ(135u, I.start());
339 EXPECT_EQ(150u, I.stop());
340 ++I;
341 ASSERT_TRUE(I.valid());
342 EXPECT_EQ(160u, I.start());
343 EXPECT_EQ(170u, I.stop());
344 ++I;
345 EXPECT_FALSE(I.valid());
346
347 // Coalesce left and right with followers.
348 // [100;115] [120;130] [135;150] [160;170]
349 map.insert(131, 134, 1);
350 I = map.begin();
351 ASSERT_TRUE(I.valid());
352 EXPECT_EQ(100u, I.start());
353 EXPECT_EQ(115u, I.stop());
354 ++I;
355 ASSERT_TRUE(I.valid());
356 EXPECT_EQ(120u, I.start());
357 EXPECT_EQ(150u, I.stop());
358 ++I;
359 ASSERT_TRUE(I.valid());
360 EXPECT_EQ(160u, I.start());
361 EXPECT_EQ(170u, I.stop());
362 ++I;
363 EXPECT_FALSE(I.valid());
364
Jakob Stoklund Olesenc0412682010-11-19 23:28:57 +0000365 // Test clear() on non-branched map.
366 map.clear();
367 EXPECT_TRUE(map.empty());
368 EXPECT_TRUE(map.begin() == map.end());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000369}
370
371// Branched, non-coalescing tests.
372TEST(IntervalMapTest, Branched) {
373 UUMap::Allocator allocator;
374 UUMap map(allocator);
375
376 // Insert enough intervals to force a branched tree.
377 // This creates 9 leaf nodes with 11 elements each, tree height = 1.
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000378 for (unsigned i = 1; i < 100; ++i) {
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000379 map.insert(10*i, 10*i+5, i);
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000380 EXPECT_EQ(10u, map.start());
381 EXPECT_EQ(10*i+5, map.stop());
382 }
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000383
384 // Tree limits.
385 EXPECT_FALSE(map.empty());
386 EXPECT_EQ(10u, map.start());
387 EXPECT_EQ(995u, map.stop());
388
389 // Tree lookup.
390 for (unsigned i = 1; i < 100; ++i) {
391 EXPECT_EQ(0u, map.lookup(10*i-1));
392 EXPECT_EQ(i, map.lookup(10*i));
393 EXPECT_EQ(i, map.lookup(10*i+5));
394 EXPECT_EQ(0u, map.lookup(10*i+6));
395 }
396
397 // Forward iteration.
398 UUMap::iterator I = map.begin();
399 for (unsigned i = 1; i < 100; ++i) {
400 ASSERT_TRUE(I.valid());
401 EXPECT_EQ(10*i, I.start());
402 EXPECT_EQ(10*i+5, I.stop());
403 EXPECT_EQ(i, *I);
404 ++I;
405 }
406 EXPECT_FALSE(I.valid());
407 EXPECT_TRUE(I == map.end());
408
Jakob Stoklund Olesen46389fd2010-11-19 23:28:53 +0000409 // Backwards iteration.
410 for (unsigned i = 99; i; --i) {
411 --I;
412 ASSERT_TRUE(I.valid());
413 EXPECT_EQ(10*i, I.start());
414 EXPECT_EQ(10*i+5, I.stop());
415 EXPECT_EQ(i, *I);
416 }
417 EXPECT_TRUE(I == map.begin());
418
Jakob Stoklund Olesenbd1a50e2010-11-28 07:00:46 +0000419 // Test advanceTo in same node.
420 I.advanceTo(20);
421 ASSERT_TRUE(I.valid());
422 EXPECT_EQ(20u, I.start());
423 EXPECT_EQ(25u, I.stop());
424
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000425 // Change value, no coalescing.
426 I.setValue(0);
427 ASSERT_TRUE(I.valid());
428 EXPECT_EQ(20u, I.start());
429 EXPECT_EQ(25u, I.stop());
430 EXPECT_EQ(0u, I.value());
431
432 // Close the gap right, no coalescing.
433 I.setStop(29);
434 ASSERT_TRUE(I.valid());
435 EXPECT_EQ(20u, I.start());
436 EXPECT_EQ(29u, I.stop());
437 EXPECT_EQ(0u, I.value());
438
439 // Change value, no coalescing.
440 I.setValue(2);
441 ASSERT_TRUE(I.valid());
442 EXPECT_EQ(20u, I.start());
443 EXPECT_EQ(29u, I.stop());
444 EXPECT_EQ(2u, I.value());
445
446 // Change value, now coalescing.
447 I.setValue(3);
448 ASSERT_TRUE(I.valid());
449 EXPECT_EQ(20u, I.start());
450 EXPECT_EQ(35u, I.stop());
451 EXPECT_EQ(3u, I.value());
452
453 // Close the gap, now coalescing.
454 I.setValue(4);
455 ASSERT_TRUE(I.valid());
456 I.setStop(39);
457 ASSERT_TRUE(I.valid());
458 EXPECT_EQ(20u, I.start());
459 EXPECT_EQ(45u, I.stop());
460 EXPECT_EQ(4u, I.value());
461
Jakob Stoklund Olesenbd1a50e2010-11-28 07:00:46 +0000462 // advanceTo another node.
463 I.advanceTo(200);
464 ASSERT_TRUE(I.valid());
465 EXPECT_EQ(200u, I.start());
466 EXPECT_EQ(205u, I.stop());
467
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000468 // Close the gap left, no coalescing.
469 I.setStart(196);
470 ASSERT_TRUE(I.valid());
471 EXPECT_EQ(196u, I.start());
472 EXPECT_EQ(205u, I.stop());
473 EXPECT_EQ(20u, I.value());
474
475 // Change value, no coalescing.
476 I.setValue(0);
477 ASSERT_TRUE(I.valid());
478 EXPECT_EQ(196u, I.start());
479 EXPECT_EQ(205u, I.stop());
480 EXPECT_EQ(0u, I.value());
481
482 // Change value, now coalescing.
483 I.setValue(19);
484 ASSERT_TRUE(I.valid());
485 EXPECT_EQ(190u, I.start());
486 EXPECT_EQ(205u, I.stop());
487 EXPECT_EQ(19u, I.value());
488
489 // Close the gap, now coalescing.
490 I.setValue(18);
491 ASSERT_TRUE(I.valid());
492 I.setStart(186);
493 ASSERT_TRUE(I.valid());
494 EXPECT_EQ(180u, I.start());
495 EXPECT_EQ(205u, I.stop());
496 EXPECT_EQ(18u, I.value());
497
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000498 // Erase from the front.
Jakob Stoklund Olesenbd1a50e2010-11-28 07:00:46 +0000499 I = map.begin();
Jakob Stoklund Olesen056356d2010-11-27 22:56:53 +0000500 for (unsigned i = 0; i != 20; ++i) {
501 I.erase();
502 EXPECT_TRUE(I == map.begin());
503 EXPECT_FALSE(map.empty());
504 EXPECT_EQ(I.start(), map.start());
505 EXPECT_EQ(995u, map.stop());
506 }
507
Jakob Stoklund Olesenc0412682010-11-19 23:28:57 +0000508 // Test clear() on branched map.
509 map.clear();
510 EXPECT_TRUE(map.empty());
511 EXPECT_TRUE(map.begin() == map.end());
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000512}
513
Jakob Stoklund Olesen5e9c70e2010-11-26 06:54:20 +0000514// Branched, high, non-coalescing tests.
515TEST(IntervalMapTest, Branched2) {
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000516 UUMap::Allocator allocator;
517 UUMap map(allocator);
Jakob Stoklund Olesen5e9c70e2010-11-26 06:54:20 +0000518
519 // Insert enough intervals to force a height >= 2 tree.
520 for (unsigned i = 1; i < 1000; ++i)
521 map.insert(10*i, 10*i+5, i);
522
523 // Tree limits.
524 EXPECT_FALSE(map.empty());
525 EXPECT_EQ(10u, map.start());
526 EXPECT_EQ(9995u, map.stop());
527
528 // Tree lookup.
529 for (unsigned i = 1; i < 1000; ++i) {
530 EXPECT_EQ(0u, map.lookup(10*i-1));
531 EXPECT_EQ(i, map.lookup(10*i));
532 EXPECT_EQ(i, map.lookup(10*i+5));
533 EXPECT_EQ(0u, map.lookup(10*i+6));
534 }
535
536 // Forward iteration.
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000537 UUMap::iterator I = map.begin();
Jakob Stoklund Olesen5e9c70e2010-11-26 06:54:20 +0000538 for (unsigned i = 1; i < 1000; ++i) {
539 ASSERT_TRUE(I.valid());
540 EXPECT_EQ(10*i, I.start());
541 EXPECT_EQ(10*i+5, I.stop());
542 EXPECT_EQ(i, *I);
543 ++I;
544 }
545 EXPECT_FALSE(I.valid());
546 EXPECT_TRUE(I == map.end());
547
548 // Backwards iteration.
549 for (unsigned i = 999; i; --i) {
550 --I;
551 ASSERT_TRUE(I.valid());
552 EXPECT_EQ(10*i, I.start());
553 EXPECT_EQ(10*i+5, I.stop());
554 EXPECT_EQ(i, *I);
555 }
556 EXPECT_TRUE(I == map.begin());
557
Jakob Stoklund Olesenbd1a50e2010-11-28 07:00:46 +0000558 // Test advanceTo in same node.
559 I.advanceTo(20);
560 ASSERT_TRUE(I.valid());
561 EXPECT_EQ(20u, I.start());
562 EXPECT_EQ(25u, I.stop());
563
564 // advanceTo sibling leaf node.
565 I.advanceTo(200);
566 ASSERT_TRUE(I.valid());
567 EXPECT_EQ(200u, I.start());
568 EXPECT_EQ(205u, I.stop());
569
570 // advanceTo further.
571 I.advanceTo(2000);
572 ASSERT_TRUE(I.valid());
573 EXPECT_EQ(2000u, I.start());
574 EXPECT_EQ(2005u, I.stop());
575
Jakob Stoklund Olesen54912ed2010-12-17 22:07:51 +0000576 // advanceTo beyond end()
577 I.advanceTo(20000);
578 EXPECT_FALSE(I.valid());
579
580 // end().advanceTo() is valid as long as x > map.stop()
581 I.advanceTo(30000);
582 EXPECT_FALSE(I.valid());
583
Jakob Stoklund Olesen5e9c70e2010-11-26 06:54:20 +0000584 // Test clear() on branched map.
585 map.clear();
586 EXPECT_TRUE(map.empty());
587 EXPECT_TRUE(map.begin() == map.end());
588}
589
Jakob Stoklund Olesenbb4bece2010-11-27 21:12:36 +0000590// Random insertions, coalescing to a single interval.
591TEST(IntervalMapTest, RandomCoalescing) {
Jakob Stoklund Olesene7ed7b62010-12-03 19:02:00 +0000592 UUMap::Allocator allocator;
593 UUMap map(allocator);
Jakob Stoklund Olesenbb4bece2010-11-27 21:12:36 +0000594
595 // This is a poor PRNG with maximal period:
596 // x_n = 5 x_{n-1} + 1 mod 2^N
597
598 unsigned x = 100;
599 for (unsigned i = 0; i != 4096; ++i) {
600 map.insert(10*x, 10*x+9, 1);
601 EXPECT_GE(10*x, map.start());
602 EXPECT_LE(10*x+9, map.stop());
603 x = (5*x+1)%4096;
604 }
605
606 // Map should be fully coalesced after that exercise.
607 EXPECT_FALSE(map.empty());
608 EXPECT_EQ(0u, map.start());
609 EXPECT_EQ(40959u, map.stop());
610 EXPECT_EQ(1, std::distance(map.begin(), map.end()));
611
612}
613
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000614TEST(IntervalMapOverlapsTest, SmallMaps) {
Jakob Stoklund Olesenaf49e972010-12-16 19:46:09 +0000615 typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
616 UUMap::Allocator allocator;
617 UUMap mapA(allocator);
618 UUMap mapB(allocator);
619
620 // empty, empty.
621 EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
622
623 mapA.insert(1, 2, 3);
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000624
Jakob Stoklund Olesenaf49e972010-12-16 19:46:09 +0000625 // full, empty
626 EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
627 // empty, full
628 EXPECT_FALSE(UUOverlaps(mapB, mapA).valid());
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000629
630 mapB.insert(3, 4, 5);
631
632 // full, full, non-overlapping
633 EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
634 EXPECT_FALSE(UUOverlaps(mapB, mapA).valid());
635
636 // Add an overlapping segment.
637 mapA.insert(4, 5, 6);
638
639 UUOverlaps AB(mapA, mapB);
640 ASSERT_TRUE(AB.valid());
641 EXPECT_EQ(4u, AB.a().start());
642 EXPECT_EQ(3u, AB.b().start());
643 ++AB;
644 EXPECT_FALSE(AB.valid());
645
646 UUOverlaps BA(mapB, mapA);
647 ASSERT_TRUE(BA.valid());
648 EXPECT_EQ(3u, BA.a().start());
649 EXPECT_EQ(4u, BA.b().start());
Jakob Stoklund Olesen213de042010-12-17 19:18:38 +0000650 // advance past end.
651 BA.advanceTo(6);
652 EXPECT_FALSE(BA.valid());
653 // advance an invalid iterator.
654 BA.advanceTo(7);
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000655 EXPECT_FALSE(BA.valid());
Jakob Stoklund Olesenaf49e972010-12-16 19:46:09 +0000656}
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000657
658TEST(IntervalMapOverlapsTest, BigMaps) {
659 typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
660 UUMap::Allocator allocator;
661 UUMap mapA(allocator);
662 UUMap mapB(allocator);
663
664 // [0;4] [10;14] [20;24] ...
665 for (unsigned n = 0; n != 100; ++n)
666 mapA.insert(10*n, 10*n+4, n);
667
668 // [5;6] [15;16] [25;26] ...
669 for (unsigned n = 10; n != 20; ++n)
670 mapB.insert(10*n+5, 10*n+6, n);
671
672 // [208;209] [218;219] ...
673 for (unsigned n = 20; n != 30; ++n)
674 mapB.insert(10*n+8, 10*n+9, n);
675
676 // insert some overlapping segments.
677 mapB.insert(400, 400, 400);
678 mapB.insert(401, 401, 401);
679 mapB.insert(402, 500, 402);
680 mapB.insert(600, 601, 402);
681
682 UUOverlaps AB(mapA, mapB);
683 ASSERT_TRUE(AB.valid());
684 EXPECT_EQ(400u, AB.a().start());
685 EXPECT_EQ(400u, AB.b().start());
686 ++AB;
687 ASSERT_TRUE(AB.valid());
688 EXPECT_EQ(400u, AB.a().start());
689 EXPECT_EQ(401u, AB.b().start());
690 ++AB;
691 ASSERT_TRUE(AB.valid());
692 EXPECT_EQ(400u, AB.a().start());
693 EXPECT_EQ(402u, AB.b().start());
694 ++AB;
695 ASSERT_TRUE(AB.valid());
696 EXPECT_EQ(410u, AB.a().start());
697 EXPECT_EQ(402u, AB.b().start());
698 ++AB;
699 ASSERT_TRUE(AB.valid());
700 EXPECT_EQ(420u, AB.a().start());
701 EXPECT_EQ(402u, AB.b().start());
702 AB.skipB();
703 ASSERT_TRUE(AB.valid());
704 EXPECT_EQ(600u, AB.a().start());
705 EXPECT_EQ(600u, AB.b().start());
706 ++AB;
707 EXPECT_FALSE(AB.valid());
708
Jakob Stoklund Olesen00b29fb2010-12-17 22:07:54 +0000709 // Test advanceTo.
710 UUOverlaps AB2(mapA, mapB);
711 AB2.advanceTo(410);
712 ASSERT_TRUE(AB2.valid());
713 EXPECT_EQ(410u, AB2.a().start());
714 EXPECT_EQ(402u, AB2.b().start());
715
716 // It is valid to advanceTo with any monotonic sequence.
717 AB2.advanceTo(411);
718 ASSERT_TRUE(AB2.valid());
719 EXPECT_EQ(410u, AB2.a().start());
720 EXPECT_EQ(402u, AB2.b().start());
721
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000722 // Check reversed maps.
723 UUOverlaps BA(mapB, mapA);
724 ASSERT_TRUE(BA.valid());
725 EXPECT_EQ(400u, BA.b().start());
726 EXPECT_EQ(400u, BA.a().start());
727 ++BA;
728 ASSERT_TRUE(BA.valid());
729 EXPECT_EQ(400u, BA.b().start());
730 EXPECT_EQ(401u, BA.a().start());
731 ++BA;
732 ASSERT_TRUE(BA.valid());
733 EXPECT_EQ(400u, BA.b().start());
734 EXPECT_EQ(402u, BA.a().start());
735 ++BA;
736 ASSERT_TRUE(BA.valid());
737 EXPECT_EQ(410u, BA.b().start());
738 EXPECT_EQ(402u, BA.a().start());
739 ++BA;
740 ASSERT_TRUE(BA.valid());
741 EXPECT_EQ(420u, BA.b().start());
742 EXPECT_EQ(402u, BA.a().start());
743 BA.skipA();
744 ASSERT_TRUE(BA.valid());
745 EXPECT_EQ(600u, BA.b().start());
746 EXPECT_EQ(600u, BA.a().start());
747 ++BA;
748 EXPECT_FALSE(BA.valid());
Jakob Stoklund Olesen00b29fb2010-12-17 22:07:54 +0000749
750 // Test advanceTo.
751 UUOverlaps BA2(mapB, mapA);
752 BA2.advanceTo(410);
753 ASSERT_TRUE(BA2.valid());
754 EXPECT_EQ(410u, BA2.b().start());
755 EXPECT_EQ(402u, BA2.a().start());
756
757 BA2.advanceTo(411);
758 ASSERT_TRUE(BA2.valid());
759 EXPECT_EQ(410u, BA2.b().start());
760 EXPECT_EQ(402u, BA2.a().start());
Jakob Stoklund Olesen649a72b2010-12-17 01:31:49 +0000761}
762
Jakob Stoklund Olesen345945e2010-11-19 04:47:19 +0000763} // namespace