move_to_front_test.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. // Copyright (c) 2017 Google Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <algorithm>
  15. #include <iostream>
  16. #include <set>
  17. #include <string>
  18. #include <vector>
  19. #include "gmock/gmock.h"
  20. #include "source/comp/move_to_front.h"
  21. namespace spvtools {
  22. namespace comp {
  23. namespace {
  24. // Class used to test the inner workings of MoveToFront.
  25. class MoveToFrontTester : public MoveToFront {
  26. public:
  27. // Inserts the value in the internal tree data structure. For testing only.
  28. void TestInsert(uint32_t val) { InsertNode(CreateNode(val, val)); }
  29. // Removes the value from the internal tree data structure. For testing only.
  30. void TestRemove(uint32_t val) {
  31. const auto it = value_to_node_.find(val);
  32. assert(it != value_to_node_.end());
  33. RemoveNode(it->second);
  34. }
  35. // Prints the internal tree data structure to |out|. For testing only.
  36. void PrintTree(std::ostream& out, bool print_timestamp = false) const {
  37. if (root_) PrintTreeInternal(out, root_, 1, print_timestamp);
  38. }
  39. // Returns node handle corresponding to the value. The value may not be in the
  40. // tree.
  41. uint32_t GetNodeHandle(uint32_t value) const {
  42. const auto it = value_to_node_.find(value);
  43. if (it == value_to_node_.end()) return 0;
  44. return it->second;
  45. }
  46. // Returns total node count (both those in the tree and removed,
  47. // but not the NIL singleton).
  48. size_t GetTotalNodeCount() const {
  49. assert(nodes_.size());
  50. return nodes_.size() - 1;
  51. }
  52. uint32_t GetLastAccessedValue() const { return last_accessed_value_; }
  53. private:
  54. // Prints the internal tree data structure for debug purposes in the following
  55. // format:
  56. // 10H3S4----5H1S1-----D2
  57. // 15H2S2----12H1S1----D3
  58. // Right links are horizontal, left links step down one line.
  59. // 5H1S1 is read as value 5, height 1, size 1. Optionally node label can also
  60. // contain timestamp (5H1S1T15). D3 stands for depth 3.
  61. void PrintTreeInternal(std::ostream& out, uint32_t node, size_t depth,
  62. bool print_timestamp) const;
  63. };
  64. void MoveToFrontTester::PrintTreeInternal(std::ostream& out, uint32_t node,
  65. size_t depth,
  66. bool print_timestamp) const {
  67. if (!node) {
  68. out << "D" << depth - 1 << std::endl;
  69. return;
  70. }
  71. const size_t kTextFieldWvaluethWithoutTimestamp = 10;
  72. const size_t kTextFieldWvaluethWithTimestamp = 14;
  73. const size_t text_field_wvalueth = print_timestamp
  74. ? kTextFieldWvaluethWithTimestamp
  75. : kTextFieldWvaluethWithoutTimestamp;
  76. std::stringstream label;
  77. label << ValueOf(node) << "H" << HeightOf(node) << "S" << SizeOf(node);
  78. if (print_timestamp) label << "T" << TimestampOf(node);
  79. const size_t label_length = label.str().length();
  80. if (label_length < text_field_wvalueth)
  81. label << std::string(text_field_wvalueth - label_length, '-');
  82. out << label.str();
  83. PrintTreeInternal(out, RightOf(node), depth + 1, print_timestamp);
  84. if (LeftOf(node)) {
  85. out << std::string(depth * text_field_wvalueth, ' ');
  86. PrintTreeInternal(out, LeftOf(node), depth + 1, print_timestamp);
  87. }
  88. }
  89. void CheckTree(const MoveToFrontTester& mtf, const std::string& expected,
  90. bool print_timestamp = false) {
  91. std::stringstream ss;
  92. mtf.PrintTree(ss, print_timestamp);
  93. EXPECT_EQ(expected, ss.str());
  94. }
  95. TEST(MoveToFront, EmptyTree) {
  96. MoveToFrontTester mtf;
  97. CheckTree(mtf, std::string());
  98. }
  99. TEST(MoveToFront, InsertLeftRotation) {
  100. MoveToFrontTester mtf;
  101. mtf.TestInsert(30);
  102. mtf.TestInsert(20);
  103. CheckTree(mtf, std::string(R"(
  104. 30H2S2----20H1S1----D2
  105. )")
  106. .substr(1));
  107. mtf.TestInsert(10);
  108. CheckTree(mtf, std::string(R"(
  109. 20H2S3----10H1S1----D2
  110. 30H1S1----D2
  111. )")
  112. .substr(1));
  113. }
  114. TEST(MoveToFront, InsertRightRotation) {
  115. MoveToFrontTester mtf;
  116. mtf.TestInsert(10);
  117. mtf.TestInsert(20);
  118. CheckTree(mtf, std::string(R"(
  119. 10H2S2----D1
  120. 20H1S1----D2
  121. )")
  122. .substr(1));
  123. mtf.TestInsert(30);
  124. CheckTree(mtf, std::string(R"(
  125. 20H2S3----10H1S1----D2
  126. 30H1S1----D2
  127. )")
  128. .substr(1));
  129. }
  130. TEST(MoveToFront, InsertRightLeftRotation) {
  131. MoveToFrontTester mtf;
  132. mtf.TestInsert(30);
  133. mtf.TestInsert(20);
  134. CheckTree(mtf, std::string(R"(
  135. 30H2S2----20H1S1----D2
  136. )")
  137. .substr(1));
  138. mtf.TestInsert(25);
  139. CheckTree(mtf, std::string(R"(
  140. 25H2S3----20H1S1----D2
  141. 30H1S1----D2
  142. )")
  143. .substr(1));
  144. }
  145. TEST(MoveToFront, InsertLeftRightRotation) {
  146. MoveToFrontTester mtf;
  147. mtf.TestInsert(10);
  148. mtf.TestInsert(20);
  149. CheckTree(mtf, std::string(R"(
  150. 10H2S2----D1
  151. 20H1S1----D2
  152. )")
  153. .substr(1));
  154. mtf.TestInsert(15);
  155. CheckTree(mtf, std::string(R"(
  156. 15H2S3----10H1S1----D2
  157. 20H1S1----D2
  158. )")
  159. .substr(1));
  160. }
  161. TEST(MoveToFront, RemoveSingleton) {
  162. MoveToFrontTester mtf;
  163. mtf.TestInsert(10);
  164. CheckTree(mtf, std::string(R"(
  165. 10H1S1----D1
  166. )")
  167. .substr(1));
  168. mtf.TestRemove(10);
  169. CheckTree(mtf, "");
  170. }
  171. TEST(MoveToFront, RemoveRootWithScapegoat) {
  172. MoveToFrontTester mtf;
  173. mtf.TestInsert(10);
  174. mtf.TestInsert(5);
  175. mtf.TestInsert(15);
  176. CheckTree(mtf, std::string(R"(
  177. 10H2S3----5H1S1-----D2
  178. 15H1S1----D2
  179. )")
  180. .substr(1));
  181. mtf.TestRemove(10);
  182. CheckTree(mtf, std::string(R"(
  183. 15H2S2----5H1S1-----D2
  184. )")
  185. .substr(1));
  186. }
  187. TEST(MoveToFront, RemoveRightRotation) {
  188. MoveToFrontTester mtf;
  189. mtf.TestInsert(10);
  190. mtf.TestInsert(5);
  191. mtf.TestInsert(15);
  192. mtf.TestInsert(20);
  193. CheckTree(mtf, std::string(R"(
  194. 10H3S4----5H1S1-----D2
  195. 15H2S2----D2
  196. 20H1S1----D3
  197. )")
  198. .substr(1));
  199. mtf.TestRemove(5);
  200. CheckTree(mtf, std::string(R"(
  201. 15H2S3----10H1S1----D2
  202. 20H1S1----D2
  203. )")
  204. .substr(1));
  205. }
  206. TEST(MoveToFront, RemoveLeftRotation) {
  207. MoveToFrontTester mtf;
  208. mtf.TestInsert(10);
  209. mtf.TestInsert(15);
  210. mtf.TestInsert(5);
  211. mtf.TestInsert(1);
  212. CheckTree(mtf, std::string(R"(
  213. 10H3S4----5H2S2-----1H1S1-----D3
  214. 15H1S1----D2
  215. )")
  216. .substr(1));
  217. mtf.TestRemove(15);
  218. CheckTree(mtf, std::string(R"(
  219. 5H2S3-----1H1S1-----D2
  220. 10H1S1----D2
  221. )")
  222. .substr(1));
  223. }
  224. TEST(MoveToFront, RemoveLeftRightRotation) {
  225. MoveToFrontTester mtf;
  226. mtf.TestInsert(10);
  227. mtf.TestInsert(15);
  228. mtf.TestInsert(5);
  229. mtf.TestInsert(12);
  230. CheckTree(mtf, std::string(R"(
  231. 10H3S4----5H1S1-----D2
  232. 15H2S2----12H1S1----D3
  233. )")
  234. .substr(1));
  235. mtf.TestRemove(5);
  236. CheckTree(mtf, std::string(R"(
  237. 12H2S3----10H1S1----D2
  238. 15H1S1----D2
  239. )")
  240. .substr(1));
  241. }
  242. TEST(MoveToFront, RemoveRightLeftRotation) {
  243. MoveToFrontTester mtf;
  244. mtf.TestInsert(10);
  245. mtf.TestInsert(15);
  246. mtf.TestInsert(5);
  247. mtf.TestInsert(8);
  248. CheckTree(mtf, std::string(R"(
  249. 10H3S4----5H2S2-----D2
  250. 8H1S1-----D3
  251. 15H1S1----D2
  252. )")
  253. .substr(1));
  254. mtf.TestRemove(15);
  255. CheckTree(mtf, std::string(R"(
  256. 8H2S3-----5H1S1-----D2
  257. 10H1S1----D2
  258. )")
  259. .substr(1));
  260. }
  261. TEST(MoveToFront, MultipleOperations) {
  262. MoveToFrontTester mtf;
  263. std::vector<uint32_t> vals = {5, 11, 12, 16, 15, 6, 14, 2,
  264. 7, 10, 4, 8, 9, 3, 1, 13};
  265. for (uint32_t i : vals) {
  266. mtf.TestInsert(i);
  267. }
  268. CheckTree(mtf, std::string(R"(
  269. 11H5S16---5H4S10----3H3S4-----2H2S2-----1H1S1-----D5
  270. 4H1S1-----D4
  271. 7H3S5-----6H1S1-----D4
  272. 9H2S3-----8H1S1-----D5
  273. 10H1S1----D5
  274. 15H3S5----13H2S3----12H1S1----D4
  275. 14H1S1----D4
  276. 16H1S1----D3
  277. )")
  278. .substr(1));
  279. mtf.TestRemove(11);
  280. CheckTree(mtf, std::string(R"(
  281. 10H5S15---5H4S9-----3H3S4-----2H2S2-----1H1S1-----D5
  282. 4H1S1-----D4
  283. 7H3S4-----6H1S1-----D4
  284. 9H2S2-----8H1S1-----D5
  285. 15H3S5----13H2S3----12H1S1----D4
  286. 14H1S1----D4
  287. 16H1S1----D3
  288. )")
  289. .substr(1));
  290. mtf.TestInsert(11);
  291. CheckTree(mtf, std::string(R"(
  292. 10H5S16---5H4S9-----3H3S4-----2H2S2-----1H1S1-----D5
  293. 4H1S1-----D4
  294. 7H3S4-----6H1S1-----D4
  295. 9H2S2-----8H1S1-----D5
  296. 13H3S6----12H2S2----11H1S1----D4
  297. 15H2S3----14H1S1----D4
  298. 16H1S1----D4
  299. )")
  300. .substr(1));
  301. mtf.TestRemove(5);
  302. CheckTree(mtf, std::string(R"(
  303. 10H5S15---6H4S8-----3H3S4-----2H2S2-----1H1S1-----D5
  304. 4H1S1-----D4
  305. 8H2S3-----7H1S1-----D4
  306. 9H1S1-----D4
  307. 13H3S6----12H2S2----11H1S1----D4
  308. 15H2S3----14H1S1----D4
  309. 16H1S1----D4
  310. )")
  311. .substr(1));
  312. mtf.TestInsert(5);
  313. CheckTree(mtf, std::string(R"(
  314. 10H5S16---6H4S9-----3H3S5-----2H2S2-----1H1S1-----D5
  315. 4H2S2-----D4
  316. 5H1S1-----D5
  317. 8H2S3-----7H1S1-----D4
  318. 9H1S1-----D4
  319. 13H3S6----12H2S2----11H1S1----D4
  320. 15H2S3----14H1S1----D4
  321. 16H1S1----D4
  322. )")
  323. .substr(1));
  324. mtf.TestRemove(2);
  325. mtf.TestRemove(1);
  326. mtf.TestRemove(4);
  327. mtf.TestRemove(3);
  328. mtf.TestRemove(6);
  329. mtf.TestRemove(5);
  330. mtf.TestRemove(7);
  331. mtf.TestRemove(9);
  332. CheckTree(mtf, std::string(R"(
  333. 13H4S8----10H3S4----8H1S1-----D3
  334. 12H2S2----11H1S1----D4
  335. 15H2S3----14H1S1----D3
  336. 16H1S1----D3
  337. )")
  338. .substr(1));
  339. }
  340. TEST(MoveToFront, BiggerScaleTreeTest) {
  341. MoveToFrontTester mtf;
  342. std::set<uint32_t> all_vals;
  343. const uint32_t kMagic1 = 2654435761;
  344. const uint32_t kMagic2 = 10000;
  345. for (uint32_t i = 1; i < 1000; ++i) {
  346. const uint32_t val = (i * kMagic1) % kMagic2;
  347. if (!all_vals.count(val)) {
  348. mtf.TestInsert(val);
  349. all_vals.insert(val);
  350. }
  351. }
  352. for (uint32_t i = 1; i < 1000; ++i) {
  353. const uint32_t val = (i * kMagic1) % kMagic2;
  354. if (val % 2 == 0) {
  355. mtf.TestRemove(val);
  356. all_vals.erase(val);
  357. }
  358. }
  359. for (uint32_t i = 1000; i < 2000; ++i) {
  360. const uint32_t val = (i * kMagic1) % kMagic2;
  361. if (!all_vals.count(val)) {
  362. mtf.TestInsert(val);
  363. all_vals.insert(val);
  364. }
  365. }
  366. for (uint32_t i = 1; i < 2000; ++i) {
  367. const uint32_t val = (i * kMagic1) % kMagic2;
  368. if (val > 50) {
  369. mtf.TestRemove(val);
  370. all_vals.erase(val);
  371. }
  372. }
  373. EXPECT_EQ(all_vals, std::set<uint32_t>({2, 4, 11, 13, 24, 33, 35, 37, 46}));
  374. CheckTree(mtf, std::string(R"(
  375. 33H4S9----11H3S5----2H2S2-----D3
  376. 4H1S1-----D4
  377. 13H2S2----D3
  378. 24H1S1----D4
  379. 37H2S3----35H1S1----D3
  380. 46H1S1----D3
  381. )")
  382. .substr(1));
  383. }
  384. TEST(MoveToFront, RankFromValue) {
  385. MoveToFrontTester mtf;
  386. uint32_t rank = 0;
  387. EXPECT_FALSE(mtf.RankFromValue(1, &rank));
  388. EXPECT_TRUE(mtf.Insert(1));
  389. EXPECT_TRUE(mtf.Insert(2));
  390. EXPECT_TRUE(mtf.Insert(3));
  391. EXPECT_FALSE(mtf.Insert(2));
  392. CheckTree(mtf,
  393. std::string(R"(
  394. 2H2S3T2-------1H1S1T1-------D2
  395. 3H1S1T3-------D2
  396. )")
  397. .substr(1),
  398. /* print_timestamp = */ true);
  399. EXPECT_FALSE(mtf.RankFromValue(4, &rank));
  400. EXPECT_TRUE(mtf.RankFromValue(1, &rank));
  401. EXPECT_EQ(3u, rank);
  402. CheckTree(mtf,
  403. std::string(R"(
  404. 3H2S3T3-------2H1S1T2-------D2
  405. 1H1S1T4-------D2
  406. )")
  407. .substr(1),
  408. /* print_timestamp = */ true);
  409. EXPECT_TRUE(mtf.RankFromValue(1, &rank));
  410. EXPECT_EQ(1u, rank);
  411. EXPECT_TRUE(mtf.RankFromValue(3, &rank));
  412. EXPECT_EQ(2u, rank);
  413. EXPECT_TRUE(mtf.RankFromValue(2, &rank));
  414. EXPECT_EQ(3u, rank);
  415. EXPECT_TRUE(mtf.Insert(40));
  416. EXPECT_TRUE(mtf.RankFromValue(1, &rank));
  417. EXPECT_EQ(4u, rank);
  418. EXPECT_TRUE(mtf.Insert(50));
  419. EXPECT_TRUE(mtf.RankFromValue(1, &rank));
  420. EXPECT_EQ(2u, rank);
  421. CheckTree(mtf,
  422. std::string(R"(
  423. 2H3S5T6-------3H1S1T5-------D2
  424. 50H2S3T9------40H1S1T7------D3
  425. 1H1S1T10------D3
  426. )")
  427. .substr(1),
  428. /* print_timestamp = */ true);
  429. EXPECT_TRUE(mtf.RankFromValue(50, &rank));
  430. EXPECT_EQ(2u, rank);
  431. EXPECT_EQ(5u, mtf.GetSize());
  432. CheckTree(mtf,
  433. std::string(R"(
  434. 2H3S5T6-------3H1S1T5-------D2
  435. 1H2S3T10------40H1S1T7------D3
  436. 50H1S1T11-----D3
  437. )")
  438. .substr(1),
  439. /* print_timestamp = */ true);
  440. EXPECT_FALSE(mtf.RankFromValue(0, &rank));
  441. EXPECT_FALSE(mtf.RankFromValue(20, &rank));
  442. }
  443. TEST(MoveToFront, ValueFromRank) {
  444. MoveToFrontTester mtf;
  445. uint32_t value = 0;
  446. EXPECT_FALSE(mtf.ValueFromRank(0, &value));
  447. EXPECT_FALSE(mtf.ValueFromRank(1, &value));
  448. EXPECT_TRUE(mtf.Insert(1));
  449. EXPECT_EQ(1u, mtf.GetLastAccessedValue());
  450. EXPECT_TRUE(mtf.Insert(2));
  451. EXPECT_EQ(2u, mtf.GetLastAccessedValue());
  452. EXPECT_TRUE(mtf.Insert(3));
  453. EXPECT_EQ(3u, mtf.GetLastAccessedValue());
  454. EXPECT_TRUE(mtf.ValueFromRank(3, &value));
  455. EXPECT_EQ(1u, value);
  456. EXPECT_EQ(1u, mtf.GetLastAccessedValue());
  457. EXPECT_TRUE(mtf.ValueFromRank(1, &value));
  458. EXPECT_EQ(1u, value);
  459. EXPECT_EQ(1u, mtf.GetLastAccessedValue());
  460. CheckTree(mtf,
  461. std::string(R"(
  462. 3H2S3T3-------2H1S1T2-------D2
  463. 1H1S1T4-------D2
  464. )")
  465. .substr(1),
  466. /* print_timestamp = */ true);
  467. EXPECT_TRUE(mtf.ValueFromRank(2, &value));
  468. EXPECT_EQ(3u, value);
  469. EXPECT_EQ(3u, mtf.GetSize());
  470. CheckTree(mtf,
  471. std::string(R"(
  472. 1H2S3T4-------2H1S1T2-------D2
  473. 3H1S1T5-------D2
  474. )")
  475. .substr(1),
  476. /* print_timestamp = */ true);
  477. EXPECT_TRUE(mtf.ValueFromRank(3, &value));
  478. EXPECT_EQ(2u, value);
  479. CheckTree(mtf,
  480. std::string(R"(
  481. 3H2S3T5-------1H1S1T4-------D2
  482. 2H1S1T6-------D2
  483. )")
  484. .substr(1),
  485. /* print_timestamp = */ true);
  486. EXPECT_TRUE(mtf.Insert(10));
  487. CheckTree(mtf,
  488. std::string(R"(
  489. 3H3S4T5-------1H1S1T4-------D2
  490. 2H2S2T6-------D2
  491. 10H1S1T7------D3
  492. )")
  493. .substr(1),
  494. /* print_timestamp = */ true);
  495. EXPECT_TRUE(mtf.ValueFromRank(1, &value));
  496. EXPECT_EQ(10u, value);
  497. }
  498. TEST(MoveToFront, Remove) {
  499. MoveToFrontTester mtf;
  500. EXPECT_FALSE(mtf.Remove(1));
  501. EXPECT_EQ(0u, mtf.GetTotalNodeCount());
  502. EXPECT_TRUE(mtf.Insert(1));
  503. EXPECT_TRUE(mtf.Insert(2));
  504. EXPECT_TRUE(mtf.Insert(3));
  505. CheckTree(mtf,
  506. std::string(R"(
  507. 2H2S3T2-------1H1S1T1-------D2
  508. 3H1S1T3-------D2
  509. )")
  510. .substr(1),
  511. /* print_timestamp = */ true);
  512. EXPECT_EQ(1u, mtf.GetNodeHandle(1));
  513. EXPECT_EQ(3u, mtf.GetTotalNodeCount());
  514. EXPECT_TRUE(mtf.Remove(1));
  515. EXPECT_EQ(3u, mtf.GetTotalNodeCount());
  516. CheckTree(mtf,
  517. std::string(R"(
  518. 2H2S2T2-------D1
  519. 3H1S1T3-------D2
  520. )")
  521. .substr(1),
  522. /* print_timestamp = */ true);
  523. uint32_t value = 0;
  524. EXPECT_TRUE(mtf.ValueFromRank(2, &value));
  525. EXPECT_EQ(2u, value);
  526. CheckTree(mtf,
  527. std::string(R"(
  528. 3H2S2T3-------D1
  529. 2H1S1T4-------D2
  530. )")
  531. .substr(1),
  532. /* print_timestamp = */ true);
  533. EXPECT_TRUE(mtf.Insert(1));
  534. EXPECT_EQ(1u, mtf.GetNodeHandle(1));
  535. EXPECT_EQ(3u, mtf.GetTotalNodeCount());
  536. }
  537. TEST(MoveToFront, LargerScale) {
  538. MoveToFrontTester mtf;
  539. uint32_t value = 0;
  540. uint32_t rank = 0;
  541. for (uint32_t i = 1; i < 1000; ++i) {
  542. ASSERT_TRUE(mtf.Insert(i));
  543. ASSERT_EQ(i, mtf.GetSize());
  544. ASSERT_TRUE(mtf.RankFromValue(i, &rank));
  545. ASSERT_EQ(1u, rank);
  546. ASSERT_TRUE(mtf.ValueFromRank(1, &value));
  547. ASSERT_EQ(i, value);
  548. }
  549. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  550. ASSERT_EQ(1u, value);
  551. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  552. ASSERT_EQ(2u, value);
  553. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  554. ASSERT_EQ(3u, value);
  555. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  556. ASSERT_EQ(4u, value);
  557. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  558. ASSERT_EQ(5u, value);
  559. ASSERT_TRUE(mtf.ValueFromRank(999, &value));
  560. ASSERT_EQ(6u, value);
  561. ASSERT_TRUE(mtf.ValueFromRank(101, &value));
  562. ASSERT_EQ(905u, value);
  563. ASSERT_TRUE(mtf.ValueFromRank(101, &value));
  564. ASSERT_EQ(906u, value);
  565. ASSERT_TRUE(mtf.ValueFromRank(101, &value));
  566. ASSERT_EQ(907u, value);
  567. ASSERT_TRUE(mtf.ValueFromRank(201, &value));
  568. ASSERT_EQ(805u, value);
  569. ASSERT_TRUE(mtf.ValueFromRank(201, &value));
  570. ASSERT_EQ(806u, value);
  571. ASSERT_TRUE(mtf.ValueFromRank(201, &value));
  572. ASSERT_EQ(807u, value);
  573. ASSERT_TRUE(mtf.ValueFromRank(301, &value));
  574. ASSERT_EQ(705u, value);
  575. ASSERT_TRUE(mtf.ValueFromRank(301, &value));
  576. ASSERT_EQ(706u, value);
  577. ASSERT_TRUE(mtf.ValueFromRank(301, &value));
  578. ASSERT_EQ(707u, value);
  579. ASSERT_TRUE(mtf.RankFromValue(605, &rank));
  580. ASSERT_EQ(401u, rank);
  581. ASSERT_TRUE(mtf.RankFromValue(606, &rank));
  582. ASSERT_EQ(401u, rank);
  583. ASSERT_TRUE(mtf.RankFromValue(607, &rank));
  584. ASSERT_EQ(401u, rank);
  585. ASSERT_TRUE(mtf.ValueFromRank(1, &value));
  586. ASSERT_EQ(607u, value);
  587. ASSERT_TRUE(mtf.ValueFromRank(2, &value));
  588. ASSERT_EQ(606u, value);
  589. ASSERT_TRUE(mtf.ValueFromRank(3, &value));
  590. ASSERT_EQ(605u, value);
  591. ASSERT_TRUE(mtf.ValueFromRank(4, &value));
  592. ASSERT_EQ(707u, value);
  593. ASSERT_TRUE(mtf.ValueFromRank(5, &value));
  594. ASSERT_EQ(706u, value);
  595. ASSERT_TRUE(mtf.ValueFromRank(6, &value));
  596. ASSERT_EQ(705u, value);
  597. ASSERT_TRUE(mtf.ValueFromRank(7, &value));
  598. ASSERT_EQ(807u, value);
  599. ASSERT_TRUE(mtf.ValueFromRank(8, &value));
  600. ASSERT_EQ(806u, value);
  601. ASSERT_TRUE(mtf.ValueFromRank(9, &value));
  602. ASSERT_EQ(805u, value);
  603. ASSERT_TRUE(mtf.ValueFromRank(10, &value));
  604. ASSERT_EQ(907u, value);
  605. ASSERT_TRUE(mtf.ValueFromRank(11, &value));
  606. ASSERT_EQ(906u, value);
  607. ASSERT_TRUE(mtf.ValueFromRank(12, &value));
  608. ASSERT_EQ(905u, value);
  609. ASSERT_TRUE(mtf.ValueFromRank(13, &value));
  610. ASSERT_EQ(6u, value);
  611. ASSERT_TRUE(mtf.ValueFromRank(14, &value));
  612. ASSERT_EQ(5u, value);
  613. ASSERT_TRUE(mtf.ValueFromRank(15, &value));
  614. ASSERT_EQ(4u, value);
  615. ASSERT_TRUE(mtf.ValueFromRank(16, &value));
  616. ASSERT_EQ(3u, value);
  617. ASSERT_TRUE(mtf.ValueFromRank(17, &value));
  618. ASSERT_EQ(2u, value);
  619. ASSERT_TRUE(mtf.ValueFromRank(18, &value));
  620. ASSERT_EQ(1u, value);
  621. ASSERT_TRUE(mtf.ValueFromRank(19, &value));
  622. ASSERT_EQ(999u, value);
  623. ASSERT_TRUE(mtf.ValueFromRank(20, &value));
  624. ASSERT_EQ(998u, value);
  625. ASSERT_TRUE(mtf.ValueFromRank(21, &value));
  626. ASSERT_EQ(997u, value);
  627. ASSERT_TRUE(mtf.RankFromValue(997, &rank));
  628. ASSERT_EQ(1u, rank);
  629. ASSERT_TRUE(mtf.RankFromValue(998, &rank));
  630. ASSERT_EQ(2u, rank);
  631. ASSERT_TRUE(mtf.RankFromValue(996, &rank));
  632. ASSERT_EQ(22u, rank);
  633. ASSERT_TRUE(mtf.Remove(995));
  634. ASSERT_TRUE(mtf.RankFromValue(994, &rank));
  635. ASSERT_EQ(23u, rank);
  636. for (uint32_t i = 10; i < 1000; ++i) {
  637. if (i != 995) {
  638. ASSERT_TRUE(mtf.Remove(i));
  639. } else {
  640. ASSERT_FALSE(mtf.Remove(i));
  641. }
  642. }
  643. CheckTree(mtf,
  644. std::string(R"(
  645. 6H4S9T1029----8H2S3T8-------7H1S1T7-------D3
  646. 9H1S1T9-------D3
  647. 2H3S5T1033----4H2S3T1031----5H1S1T1030----D4
  648. 3H1S1T1032----D4
  649. 1H1S1T1034----D3
  650. )")
  651. .substr(1),
  652. /* print_timestamp = */ true);
  653. ASSERT_TRUE(mtf.Insert(1000));
  654. ASSERT_TRUE(mtf.ValueFromRank(1, &value));
  655. ASSERT_EQ(1000u, value);
  656. }
  657. } // namespace
  658. } // namespace comp
  659. } // namespace spvtools