IntervalMapTest.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. //===---- 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. #include "llvm/ADT/IntervalMap.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. typedef IntervalMap<unsigned, unsigned, 4> UUMap;
  14. // Empty map tests
  15. TEST(IntervalMapTest, EmptyMap) {
  16. UUMap::Allocator allocator;
  17. UUMap map(allocator);
  18. EXPECT_TRUE(map.empty());
  19. // Lookup on empty map.
  20. EXPECT_EQ(0u, map.lookup(0));
  21. EXPECT_EQ(7u, map.lookup(0, 7));
  22. EXPECT_EQ(0u, map.lookup(~0u-1));
  23. EXPECT_EQ(7u, map.lookup(~0u-1, 7));
  24. // Iterators.
  25. EXPECT_TRUE(map.begin() == map.begin());
  26. EXPECT_TRUE(map.begin() == map.end());
  27. EXPECT_TRUE(map.end() == map.end());
  28. EXPECT_FALSE(map.begin() != map.begin());
  29. EXPECT_FALSE(map.begin() != map.end());
  30. EXPECT_FALSE(map.end() != map.end());
  31. EXPECT_FALSE(map.begin().valid());
  32. EXPECT_FALSE(map.end().valid());
  33. UUMap::iterator I = map.begin();
  34. EXPECT_FALSE(I.valid());
  35. EXPECT_TRUE(I == map.end());
  36. // Default constructor and cross-constness compares.
  37. UUMap::const_iterator CI;
  38. CI = map.begin();
  39. EXPECT_TRUE(CI == I);
  40. UUMap::iterator I2;
  41. I2 = map.end();
  42. EXPECT_TRUE(I2 == CI);
  43. }
  44. // Single entry map tests
  45. TEST(IntervalMapTest, SingleEntryMap) {
  46. UUMap::Allocator allocator;
  47. UUMap map(allocator);
  48. map.insert(100, 150, 1);
  49. EXPECT_FALSE(map.empty());
  50. // Lookup around interval.
  51. EXPECT_EQ(0u, map.lookup(0));
  52. EXPECT_EQ(0u, map.lookup(99));
  53. EXPECT_EQ(1u, map.lookup(100));
  54. EXPECT_EQ(1u, map.lookup(101));
  55. EXPECT_EQ(1u, map.lookup(125));
  56. EXPECT_EQ(1u, map.lookup(149));
  57. EXPECT_EQ(1u, map.lookup(150));
  58. EXPECT_EQ(0u, map.lookup(151));
  59. EXPECT_EQ(0u, map.lookup(200));
  60. EXPECT_EQ(0u, map.lookup(~0u-1));
  61. // Iterators.
  62. EXPECT_TRUE(map.begin() == map.begin());
  63. EXPECT_FALSE(map.begin() == map.end());
  64. EXPECT_TRUE(map.end() == map.end());
  65. EXPECT_TRUE(map.begin().valid());
  66. EXPECT_FALSE(map.end().valid());
  67. // Iter deref.
  68. UUMap::iterator I = map.begin();
  69. ASSERT_TRUE(I.valid());
  70. EXPECT_EQ(100u, I.start());
  71. EXPECT_EQ(150u, I.stop());
  72. EXPECT_EQ(1u, I.value());
  73. // Preincrement.
  74. ++I;
  75. EXPECT_FALSE(I.valid());
  76. EXPECT_FALSE(I == map.begin());
  77. EXPECT_TRUE(I == map.end());
  78. // PreDecrement.
  79. --I;
  80. ASSERT_TRUE(I.valid());
  81. EXPECT_EQ(100u, I.start());
  82. EXPECT_EQ(150u, I.stop());
  83. EXPECT_EQ(1u, I.value());
  84. EXPECT_TRUE(I == map.begin());
  85. EXPECT_FALSE(I == map.end());
  86. // Change the value.
  87. I.setValue(2);
  88. ASSERT_TRUE(I.valid());
  89. EXPECT_EQ(100u, I.start());
  90. EXPECT_EQ(150u, I.stop());
  91. EXPECT_EQ(2u, I.value());
  92. // Grow the bounds.
  93. I.setStart(0);
  94. ASSERT_TRUE(I.valid());
  95. EXPECT_EQ(0u, I.start());
  96. EXPECT_EQ(150u, I.stop());
  97. EXPECT_EQ(2u, I.value());
  98. I.setStop(200);
  99. ASSERT_TRUE(I.valid());
  100. EXPECT_EQ(0u, I.start());
  101. EXPECT_EQ(200u, I.stop());
  102. EXPECT_EQ(2u, I.value());
  103. // Shrink the bounds.
  104. I.setStart(150);
  105. ASSERT_TRUE(I.valid());
  106. EXPECT_EQ(150u, I.start());
  107. EXPECT_EQ(200u, I.stop());
  108. EXPECT_EQ(2u, I.value());
  109. I.setStop(160);
  110. ASSERT_TRUE(I.valid());
  111. EXPECT_EQ(150u, I.start());
  112. EXPECT_EQ(160u, I.stop());
  113. EXPECT_EQ(2u, I.value());
  114. // Erase last elem.
  115. I.erase();
  116. EXPECT_TRUE(map.empty());
  117. EXPECT_EQ(0, std::distance(map.begin(), map.end()));
  118. }
  119. // Flat coalescing tests.
  120. TEST(IntervalMapTest, RootCoalescing) {
  121. UUMap::Allocator allocator;
  122. UUMap map(allocator);
  123. map.insert(100, 150, 1);
  124. // Coalesce from the left.
  125. map.insert(90, 99, 1);
  126. EXPECT_EQ(1, std::distance(map.begin(), map.end()));
  127. EXPECT_EQ(90u, map.start());
  128. EXPECT_EQ(150u, map.stop());
  129. // Coalesce from the right.
  130. map.insert(151, 200, 1);
  131. EXPECT_EQ(1, std::distance(map.begin(), map.end()));
  132. EXPECT_EQ(90u, map.start());
  133. EXPECT_EQ(200u, map.stop());
  134. // Non-coalesce from the left.
  135. map.insert(60, 89, 2);
  136. EXPECT_EQ(2, std::distance(map.begin(), map.end()));
  137. EXPECT_EQ(60u, map.start());
  138. EXPECT_EQ(200u, map.stop());
  139. EXPECT_EQ(2u, map.lookup(89));
  140. EXPECT_EQ(1u, map.lookup(90));
  141. UUMap::iterator I = map.begin();
  142. EXPECT_EQ(60u, I.start());
  143. EXPECT_EQ(89u, I.stop());
  144. EXPECT_EQ(2u, I.value());
  145. ++I;
  146. EXPECT_EQ(90u, I.start());
  147. EXPECT_EQ(200u, I.stop());
  148. EXPECT_EQ(1u, I.value());
  149. ++I;
  150. EXPECT_FALSE(I.valid());
  151. // Non-coalesce from the right.
  152. map.insert(201, 210, 2);
  153. EXPECT_EQ(3, std::distance(map.begin(), map.end()));
  154. EXPECT_EQ(60u, map.start());
  155. EXPECT_EQ(210u, map.stop());
  156. EXPECT_EQ(2u, map.lookup(201));
  157. EXPECT_EQ(1u, map.lookup(200));
  158. // Erase from the left.
  159. map.begin().erase();
  160. EXPECT_EQ(2, std::distance(map.begin(), map.end()));
  161. EXPECT_EQ(90u, map.start());
  162. EXPECT_EQ(210u, map.stop());
  163. // Erase from the right.
  164. (--map.end()).erase();
  165. EXPECT_EQ(1, std::distance(map.begin(), map.end()));
  166. EXPECT_EQ(90u, map.start());
  167. EXPECT_EQ(200u, map.stop());
  168. // Add non-coalescing, then trigger coalescing with setValue.
  169. map.insert(80, 89, 2);
  170. map.insert(201, 210, 2);
  171. EXPECT_EQ(3, std::distance(map.begin(), map.end()));
  172. (++map.begin()).setValue(2);
  173. EXPECT_EQ(1, std::distance(map.begin(), map.end()));
  174. I = map.begin();
  175. ASSERT_TRUE(I.valid());
  176. EXPECT_EQ(80u, I.start());
  177. EXPECT_EQ(210u, I.stop());
  178. EXPECT_EQ(2u, I.value());
  179. }
  180. // Flat multi-coalescing tests.
  181. TEST(IntervalMapTest, RootMultiCoalescing) {
  182. UUMap::Allocator allocator;
  183. UUMap map(allocator);
  184. map.insert(140, 150, 1);
  185. map.insert(160, 170, 1);
  186. map.insert(100, 110, 1);
  187. map.insert(120, 130, 1);
  188. EXPECT_EQ(4, std::distance(map.begin(), map.end()));
  189. EXPECT_EQ(100u, map.start());
  190. EXPECT_EQ(170u, map.stop());
  191. // Verify inserts.
  192. UUMap::iterator I = map.begin();
  193. EXPECT_EQ(100u, I.start());
  194. EXPECT_EQ(110u, I.stop());
  195. ++I;
  196. EXPECT_EQ(120u, I.start());
  197. EXPECT_EQ(130u, I.stop());
  198. ++I;
  199. EXPECT_EQ(140u, I.start());
  200. EXPECT_EQ(150u, I.stop());
  201. ++I;
  202. EXPECT_EQ(160u, I.start());
  203. EXPECT_EQ(170u, I.stop());
  204. ++I;
  205. EXPECT_FALSE(I.valid());
  206. // Test advanceTo on flat tree.
  207. I = map.begin();
  208. I.advanceTo(135);
  209. ASSERT_TRUE(I.valid());
  210. EXPECT_EQ(140u, I.start());
  211. EXPECT_EQ(150u, I.stop());
  212. I.advanceTo(145);
  213. ASSERT_TRUE(I.valid());
  214. EXPECT_EQ(140u, I.start());
  215. EXPECT_EQ(150u, I.stop());
  216. I.advanceTo(200);
  217. EXPECT_FALSE(I.valid());
  218. I.advanceTo(300);
  219. EXPECT_FALSE(I.valid());
  220. // Coalesce left with followers.
  221. // [100;110] [120;130] [140;150] [160;170]
  222. map.insert(111, 115, 1);
  223. I = map.begin();
  224. ASSERT_TRUE(I.valid());
  225. EXPECT_EQ(100u, I.start());
  226. EXPECT_EQ(115u, I.stop());
  227. ++I;
  228. ASSERT_TRUE(I.valid());
  229. EXPECT_EQ(120u, I.start());
  230. EXPECT_EQ(130u, I.stop());
  231. ++I;
  232. ASSERT_TRUE(I.valid());
  233. EXPECT_EQ(140u, I.start());
  234. EXPECT_EQ(150u, I.stop());
  235. ++I;
  236. ASSERT_TRUE(I.valid());
  237. EXPECT_EQ(160u, I.start());
  238. EXPECT_EQ(170u, I.stop());
  239. ++I;
  240. EXPECT_FALSE(I.valid());
  241. // Coalesce right with followers.
  242. // [100;115] [120;130] [140;150] [160;170]
  243. map.insert(135, 139, 1);
  244. I = map.begin();
  245. ASSERT_TRUE(I.valid());
  246. EXPECT_EQ(100u, I.start());
  247. EXPECT_EQ(115u, I.stop());
  248. ++I;
  249. ASSERT_TRUE(I.valid());
  250. EXPECT_EQ(120u, I.start());
  251. EXPECT_EQ(130u, I.stop());
  252. ++I;
  253. ASSERT_TRUE(I.valid());
  254. EXPECT_EQ(135u, I.start());
  255. EXPECT_EQ(150u, I.stop());
  256. ++I;
  257. ASSERT_TRUE(I.valid());
  258. EXPECT_EQ(160u, I.start());
  259. EXPECT_EQ(170u, I.stop());
  260. ++I;
  261. EXPECT_FALSE(I.valid());
  262. // Coalesce left and right with followers.
  263. // [100;115] [120;130] [135;150] [160;170]
  264. map.insert(131, 134, 1);
  265. I = map.begin();
  266. ASSERT_TRUE(I.valid());
  267. EXPECT_EQ(100u, I.start());
  268. EXPECT_EQ(115u, I.stop());
  269. ++I;
  270. ASSERT_TRUE(I.valid());
  271. EXPECT_EQ(120u, I.start());
  272. EXPECT_EQ(150u, I.stop());
  273. ++I;
  274. ASSERT_TRUE(I.valid());
  275. EXPECT_EQ(160u, I.start());
  276. EXPECT_EQ(170u, I.stop());
  277. ++I;
  278. EXPECT_FALSE(I.valid());
  279. // Test clear() on non-branched map.
  280. map.clear();
  281. EXPECT_TRUE(map.empty());
  282. EXPECT_TRUE(map.begin() == map.end());
  283. }
  284. // Branched, non-coalescing tests.
  285. TEST(IntervalMapTest, Branched) {
  286. UUMap::Allocator allocator;
  287. UUMap map(allocator);
  288. // Insert enough intervals to force a branched tree.
  289. // This creates 9 leaf nodes with 11 elements each, tree height = 1.
  290. for (unsigned i = 1; i < 100; ++i) {
  291. map.insert(10*i, 10*i+5, i);
  292. EXPECT_EQ(10u, map.start());
  293. EXPECT_EQ(10*i+5, map.stop());
  294. }
  295. // Tree limits.
  296. EXPECT_FALSE(map.empty());
  297. EXPECT_EQ(10u, map.start());
  298. EXPECT_EQ(995u, map.stop());
  299. // Tree lookup.
  300. for (unsigned i = 1; i < 100; ++i) {
  301. EXPECT_EQ(0u, map.lookup(10*i-1));
  302. EXPECT_EQ(i, map.lookup(10*i));
  303. EXPECT_EQ(i, map.lookup(10*i+5));
  304. EXPECT_EQ(0u, map.lookup(10*i+6));
  305. }
  306. // Forward iteration.
  307. UUMap::iterator I = map.begin();
  308. for (unsigned i = 1; i < 100; ++i) {
  309. ASSERT_TRUE(I.valid());
  310. EXPECT_EQ(10*i, I.start());
  311. EXPECT_EQ(10*i+5, I.stop());
  312. EXPECT_EQ(i, *I);
  313. ++I;
  314. }
  315. EXPECT_FALSE(I.valid());
  316. EXPECT_TRUE(I == map.end());
  317. // Backwards iteration.
  318. for (unsigned i = 99; i; --i) {
  319. --I;
  320. ASSERT_TRUE(I.valid());
  321. EXPECT_EQ(10*i, I.start());
  322. EXPECT_EQ(10*i+5, I.stop());
  323. EXPECT_EQ(i, *I);
  324. }
  325. EXPECT_TRUE(I == map.begin());
  326. // Test advanceTo in same node.
  327. I.advanceTo(20);
  328. ASSERT_TRUE(I.valid());
  329. EXPECT_EQ(20u, I.start());
  330. EXPECT_EQ(25u, I.stop());
  331. // Change value, no coalescing.
  332. I.setValue(0);
  333. ASSERT_TRUE(I.valid());
  334. EXPECT_EQ(20u, I.start());
  335. EXPECT_EQ(25u, I.stop());
  336. EXPECT_EQ(0u, I.value());
  337. // Close the gap right, no coalescing.
  338. I.setStop(29);
  339. ASSERT_TRUE(I.valid());
  340. EXPECT_EQ(20u, I.start());
  341. EXPECT_EQ(29u, I.stop());
  342. EXPECT_EQ(0u, I.value());
  343. // Change value, no coalescing.
  344. I.setValue(2);
  345. ASSERT_TRUE(I.valid());
  346. EXPECT_EQ(20u, I.start());
  347. EXPECT_EQ(29u, I.stop());
  348. EXPECT_EQ(2u, I.value());
  349. // Change value, now coalescing.
  350. I.setValue(3);
  351. ASSERT_TRUE(I.valid());
  352. EXPECT_EQ(20u, I.start());
  353. EXPECT_EQ(35u, I.stop());
  354. EXPECT_EQ(3u, I.value());
  355. // Close the gap, now coalescing.
  356. I.setValue(4);
  357. ASSERT_TRUE(I.valid());
  358. I.setStop(39);
  359. ASSERT_TRUE(I.valid());
  360. EXPECT_EQ(20u, I.start());
  361. EXPECT_EQ(45u, I.stop());
  362. EXPECT_EQ(4u, I.value());
  363. // advanceTo another node.
  364. I.advanceTo(200);
  365. ASSERT_TRUE(I.valid());
  366. EXPECT_EQ(200u, I.start());
  367. EXPECT_EQ(205u, I.stop());
  368. // Close the gap left, no coalescing.
  369. I.setStart(196);
  370. ASSERT_TRUE(I.valid());
  371. EXPECT_EQ(196u, I.start());
  372. EXPECT_EQ(205u, I.stop());
  373. EXPECT_EQ(20u, I.value());
  374. // Change value, no coalescing.
  375. I.setValue(0);
  376. ASSERT_TRUE(I.valid());
  377. EXPECT_EQ(196u, I.start());
  378. EXPECT_EQ(205u, I.stop());
  379. EXPECT_EQ(0u, I.value());
  380. // Change value, now coalescing.
  381. I.setValue(19);
  382. ASSERT_TRUE(I.valid());
  383. EXPECT_EQ(190u, I.start());
  384. EXPECT_EQ(205u, I.stop());
  385. EXPECT_EQ(19u, I.value());
  386. // Close the gap, now coalescing.
  387. I.setValue(18);
  388. ASSERT_TRUE(I.valid());
  389. I.setStart(186);
  390. ASSERT_TRUE(I.valid());
  391. EXPECT_EQ(180u, I.start());
  392. EXPECT_EQ(205u, I.stop());
  393. EXPECT_EQ(18u, I.value());
  394. // Erase from the front.
  395. I = map.begin();
  396. for (unsigned i = 0; i != 20; ++i) {
  397. I.erase();
  398. EXPECT_TRUE(I == map.begin());
  399. EXPECT_FALSE(map.empty());
  400. EXPECT_EQ(I.start(), map.start());
  401. EXPECT_EQ(995u, map.stop());
  402. }
  403. // Test clear() on branched map.
  404. map.clear();
  405. EXPECT_TRUE(map.empty());
  406. EXPECT_TRUE(map.begin() == map.end());
  407. }
  408. // Branched, high, non-coalescing tests.
  409. TEST(IntervalMapTest, Branched2) {
  410. UUMap::Allocator allocator;
  411. UUMap map(allocator);
  412. // Insert enough intervals to force a height >= 2 tree.
  413. for (unsigned i = 1; i < 1000; ++i)
  414. map.insert(10*i, 10*i+5, i);
  415. // Tree limits.
  416. EXPECT_FALSE(map.empty());
  417. EXPECT_EQ(10u, map.start());
  418. EXPECT_EQ(9995u, map.stop());
  419. // Tree lookup.
  420. for (unsigned i = 1; i < 1000; ++i) {
  421. EXPECT_EQ(0u, map.lookup(10*i-1));
  422. EXPECT_EQ(i, map.lookup(10*i));
  423. EXPECT_EQ(i, map.lookup(10*i+5));
  424. EXPECT_EQ(0u, map.lookup(10*i+6));
  425. }
  426. // Forward iteration.
  427. UUMap::iterator I = map.begin();
  428. for (unsigned i = 1; i < 1000; ++i) {
  429. ASSERT_TRUE(I.valid());
  430. EXPECT_EQ(10*i, I.start());
  431. EXPECT_EQ(10*i+5, I.stop());
  432. EXPECT_EQ(i, *I);
  433. ++I;
  434. }
  435. EXPECT_FALSE(I.valid());
  436. EXPECT_TRUE(I == map.end());
  437. // Backwards iteration.
  438. for (unsigned i = 999; i; --i) {
  439. --I;
  440. ASSERT_TRUE(I.valid());
  441. EXPECT_EQ(10*i, I.start());
  442. EXPECT_EQ(10*i+5, I.stop());
  443. EXPECT_EQ(i, *I);
  444. }
  445. EXPECT_TRUE(I == map.begin());
  446. // Test advanceTo in same node.
  447. I.advanceTo(20);
  448. ASSERT_TRUE(I.valid());
  449. EXPECT_EQ(20u, I.start());
  450. EXPECT_EQ(25u, I.stop());
  451. // advanceTo sibling leaf node.
  452. I.advanceTo(200);
  453. ASSERT_TRUE(I.valid());
  454. EXPECT_EQ(200u, I.start());
  455. EXPECT_EQ(205u, I.stop());
  456. // advanceTo further.
  457. I.advanceTo(2000);
  458. ASSERT_TRUE(I.valid());
  459. EXPECT_EQ(2000u, I.start());
  460. EXPECT_EQ(2005u, I.stop());
  461. // advanceTo beyond end()
  462. I.advanceTo(20000);
  463. EXPECT_FALSE(I.valid());
  464. // end().advanceTo() is valid as long as x > map.stop()
  465. I.advanceTo(30000);
  466. EXPECT_FALSE(I.valid());
  467. // Test clear() on branched map.
  468. map.clear();
  469. EXPECT_TRUE(map.empty());
  470. EXPECT_TRUE(map.begin() == map.end());
  471. }
  472. // Random insertions, coalescing to a single interval.
  473. TEST(IntervalMapTest, RandomCoalescing) {
  474. UUMap::Allocator allocator;
  475. UUMap map(allocator);
  476. // This is a poor PRNG with maximal period:
  477. // x_n = 5 x_{n-1} + 1 mod 2^N
  478. unsigned x = 100;
  479. for (unsigned i = 0; i != 4096; ++i) {
  480. map.insert(10*x, 10*x+9, 1);
  481. EXPECT_GE(10*x, map.start());
  482. EXPECT_LE(10*x+9, map.stop());
  483. x = (5*x+1)%4096;
  484. }
  485. // Map should be fully coalesced after that exercise.
  486. EXPECT_FALSE(map.empty());
  487. EXPECT_EQ(0u, map.start());
  488. EXPECT_EQ(40959u, map.stop());
  489. EXPECT_EQ(1, std::distance(map.begin(), map.end()));
  490. }
  491. TEST(IntervalMapOverlapsTest, SmallMaps) {
  492. typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
  493. UUMap::Allocator allocator;
  494. UUMap mapA(allocator);
  495. UUMap mapB(allocator);
  496. // empty, empty.
  497. EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
  498. mapA.insert(1, 2, 3);
  499. // full, empty
  500. EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
  501. // empty, full
  502. EXPECT_FALSE(UUOverlaps(mapB, mapA).valid());
  503. mapB.insert(3, 4, 5);
  504. // full, full, non-overlapping
  505. EXPECT_FALSE(UUOverlaps(mapA, mapB).valid());
  506. EXPECT_FALSE(UUOverlaps(mapB, mapA).valid());
  507. // Add an overlapping segment.
  508. mapA.insert(4, 5, 6);
  509. UUOverlaps AB(mapA, mapB);
  510. ASSERT_TRUE(AB.valid());
  511. EXPECT_EQ(4u, AB.a().start());
  512. EXPECT_EQ(3u, AB.b().start());
  513. ++AB;
  514. EXPECT_FALSE(AB.valid());
  515. UUOverlaps BA(mapB, mapA);
  516. ASSERT_TRUE(BA.valid());
  517. EXPECT_EQ(3u, BA.a().start());
  518. EXPECT_EQ(4u, BA.b().start());
  519. // advance past end.
  520. BA.advanceTo(6);
  521. EXPECT_FALSE(BA.valid());
  522. // advance an invalid iterator.
  523. BA.advanceTo(7);
  524. EXPECT_FALSE(BA.valid());
  525. }
  526. TEST(IntervalMapOverlapsTest, BigMaps) {
  527. typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
  528. UUMap::Allocator allocator;
  529. UUMap mapA(allocator);
  530. UUMap mapB(allocator);
  531. // [0;4] [10;14] [20;24] ...
  532. for (unsigned n = 0; n != 100; ++n)
  533. mapA.insert(10*n, 10*n+4, n);
  534. // [5;6] [15;16] [25;26] ...
  535. for (unsigned n = 10; n != 20; ++n)
  536. mapB.insert(10*n+5, 10*n+6, n);
  537. // [208;209] [218;219] ...
  538. for (unsigned n = 20; n != 30; ++n)
  539. mapB.insert(10*n+8, 10*n+9, n);
  540. // insert some overlapping segments.
  541. mapB.insert(400, 400, 400);
  542. mapB.insert(401, 401, 401);
  543. mapB.insert(402, 500, 402);
  544. mapB.insert(600, 601, 402);
  545. UUOverlaps AB(mapA, mapB);
  546. ASSERT_TRUE(AB.valid());
  547. EXPECT_EQ(400u, AB.a().start());
  548. EXPECT_EQ(400u, AB.b().start());
  549. ++AB;
  550. ASSERT_TRUE(AB.valid());
  551. EXPECT_EQ(400u, AB.a().start());
  552. EXPECT_EQ(401u, AB.b().start());
  553. ++AB;
  554. ASSERT_TRUE(AB.valid());
  555. EXPECT_EQ(400u, AB.a().start());
  556. EXPECT_EQ(402u, AB.b().start());
  557. ++AB;
  558. ASSERT_TRUE(AB.valid());
  559. EXPECT_EQ(410u, AB.a().start());
  560. EXPECT_EQ(402u, AB.b().start());
  561. ++AB;
  562. ASSERT_TRUE(AB.valid());
  563. EXPECT_EQ(420u, AB.a().start());
  564. EXPECT_EQ(402u, AB.b().start());
  565. AB.skipB();
  566. ASSERT_TRUE(AB.valid());
  567. EXPECT_EQ(600u, AB.a().start());
  568. EXPECT_EQ(600u, AB.b().start());
  569. ++AB;
  570. EXPECT_FALSE(AB.valid());
  571. // Test advanceTo.
  572. UUOverlaps AB2(mapA, mapB);
  573. AB2.advanceTo(410);
  574. ASSERT_TRUE(AB2.valid());
  575. EXPECT_EQ(410u, AB2.a().start());
  576. EXPECT_EQ(402u, AB2.b().start());
  577. // It is valid to advanceTo with any monotonic sequence.
  578. AB2.advanceTo(411);
  579. ASSERT_TRUE(AB2.valid());
  580. EXPECT_EQ(410u, AB2.a().start());
  581. EXPECT_EQ(402u, AB2.b().start());
  582. // Check reversed maps.
  583. UUOverlaps BA(mapB, mapA);
  584. ASSERT_TRUE(BA.valid());
  585. EXPECT_EQ(400u, BA.b().start());
  586. EXPECT_EQ(400u, BA.a().start());
  587. ++BA;
  588. ASSERT_TRUE(BA.valid());
  589. EXPECT_EQ(400u, BA.b().start());
  590. EXPECT_EQ(401u, BA.a().start());
  591. ++BA;
  592. ASSERT_TRUE(BA.valid());
  593. EXPECT_EQ(400u, BA.b().start());
  594. EXPECT_EQ(402u, BA.a().start());
  595. ++BA;
  596. ASSERT_TRUE(BA.valid());
  597. EXPECT_EQ(410u, BA.b().start());
  598. EXPECT_EQ(402u, BA.a().start());
  599. ++BA;
  600. ASSERT_TRUE(BA.valid());
  601. EXPECT_EQ(420u, BA.b().start());
  602. EXPECT_EQ(402u, BA.a().start());
  603. BA.skipA();
  604. ASSERT_TRUE(BA.valid());
  605. EXPECT_EQ(600u, BA.b().start());
  606. EXPECT_EQ(600u, BA.a().start());
  607. ++BA;
  608. EXPECT_FALSE(BA.valid());
  609. // Test advanceTo.
  610. UUOverlaps BA2(mapB, mapA);
  611. BA2.advanceTo(410);
  612. ASSERT_TRUE(BA2.valid());
  613. EXPECT_EQ(410u, BA2.b().start());
  614. EXPECT_EQ(402u, BA2.a().start());
  615. BA2.advanceTo(411);
  616. ASSERT_TRUE(BA2.valid());
  617. EXPECT_EQ(410u, BA2.b().start());
  618. EXPECT_EQ(402u, BA2.a().start());
  619. }
  620. } // namespace