bitmap_ut.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. #include "bitmap.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #define INIT_BITMAP(bitmap, bits) \
  4. for (size_t i = 0; i < sizeof(bits) / sizeof(size_t); ++i) { \
  5. bitmap.Set(bits[i]); \
  6. }
  7. #define CHECK_BITMAP(bitmap, bits) \
  8. { \
  9. size_t cur = 0, end = sizeof(bits) / sizeof(size_t); \
  10. for (size_t i = 0; i < bitmap.Size(); ++i) { \
  11. if (cur < end && bits[cur] == i) { \
  12. UNIT_ASSERT_EQUAL_C(bitmap.Get(i), true, "pos=" << i); \
  13. ++cur; \
  14. } else { \
  15. UNIT_ASSERT_EQUAL_C(bitmap.Get(i), false, "pos=" << i); \
  16. } \
  17. } \
  18. }
  19. #define CHECK_BITMAP_WITH_TAIL(bitmap, bits) \
  20. { \
  21. size_t cur = 0, end = sizeof(bits) / sizeof(size_t); \
  22. for (size_t i = 0; i < bitmap.Size(); ++i) { \
  23. if (cur < end) { \
  24. if (bits[cur] == i) { \
  25. UNIT_ASSERT_EQUAL_C(bitmap.Get(i), true, "pos=" << i); \
  26. ++cur; \
  27. } else { \
  28. UNIT_ASSERT_EQUAL_C(bitmap.Get(i), false, "pos=" << i); \
  29. } \
  30. } else { \
  31. UNIT_ASSERT_EQUAL_C(bitmap.Get(i), true, "pos=" << i); \
  32. } \
  33. } \
  34. }
  35. Y_UNIT_TEST_SUITE(TBitMapTest) {
  36. Y_UNIT_TEST(TestBitMap) {
  37. TBitMap<101> bitmap;
  38. UNIT_ASSERT_EQUAL(bitmap.Size(), 101);
  39. UNIT_ASSERT_EQUAL(bitmap.Count(), 0);
  40. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 101);
  41. size_t initBits[] = {0, 50, 100, 45};
  42. INIT_BITMAP(bitmap, initBits);
  43. bitmap.Reset(45);
  44. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 0);
  45. size_t setBits[] = {0, 50, 100};
  46. CHECK_BITMAP(bitmap, setBits);
  47. for (size_t i = 0; i < bitmap.Size(); ++i) {
  48. UNIT_ASSERT_EQUAL(bitmap.Get(i), bitmap.Test(i));
  49. }
  50. UNIT_ASSERT_EQUAL(bitmap.Count(), 3);
  51. bitmap.Reset(0);
  52. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 50);
  53. bitmap.Clear();
  54. UNIT_ASSERT_EQUAL(bitmap.Count(), 0);
  55. UNIT_ASSERT_EQUAL(bitmap.Empty(), true);
  56. }
  57. Y_UNIT_TEST(TestDynBitMap) {
  58. TDynBitMap bitmap;
  59. UNIT_ASSERT_EQUAL(bitmap.Size(), 64); // Initial capacity
  60. UNIT_ASSERT_EQUAL(bitmap.Count(), 0);
  61. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 64);
  62. size_t initBits[] = {0, 50, 100, 45};
  63. INIT_BITMAP(bitmap, initBits);
  64. bitmap.Reset(45);
  65. UNIT_ASSERT_EQUAL(bitmap.Size(), 128);
  66. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 0);
  67. size_t setBits[] = {0, 50, 100};
  68. CHECK_BITMAP(bitmap, setBits);
  69. for (size_t i = 0; i < bitmap.Size(); ++i) {
  70. UNIT_ASSERT_EQUAL(bitmap.Get(i), bitmap.Test(i));
  71. }
  72. UNIT_ASSERT_EQUAL(bitmap.Count(), 3);
  73. bitmap.Reset(0);
  74. UNIT_ASSERT_EQUAL(bitmap.FirstNonZeroBit(), 50);
  75. bitmap.Clear();
  76. UNIT_ASSERT_EQUAL(bitmap.Count(), 0);
  77. UNIT_ASSERT_EQUAL(bitmap.Empty(), true);
  78. }
  79. template <class TBitMapImpl>
  80. void TestAndImpl() {
  81. TBitMapImpl bitmap1;
  82. TBitMapImpl bitmap2;
  83. size_t initBits1[] = {10, 20, 50, 100};
  84. size_t initBits2[] = {10, 11, 22, 50};
  85. INIT_BITMAP(bitmap1, initBits1);
  86. INIT_BITMAP(bitmap2, initBits2);
  87. bitmap1.And(bitmap2);
  88. UNIT_ASSERT_EQUAL(bitmap1.Count(), 2);
  89. UNIT_ASSERT_EQUAL(bitmap2.Count(), 4);
  90. size_t resBits[] = {10, 50};
  91. CHECK_BITMAP(bitmap1, resBits);
  92. CHECK_BITMAP(bitmap2, initBits2);
  93. }
  94. Y_UNIT_TEST(TestAndFixed) {
  95. TestAndImpl<TBitMap<101>>();
  96. }
  97. Y_UNIT_TEST(TestAndDyn) {
  98. TestAndImpl<TDynBitMap>();
  99. }
  100. template <class TBitMapImpl>
  101. void TestOrImpl() {
  102. TBitMapImpl bitmap1;
  103. TBitMapImpl bitmap2;
  104. size_t initBits1[] = {0, 10, 11, 76};
  105. size_t initBits2[] = {1, 11, 22, 50};
  106. INIT_BITMAP(bitmap1, initBits1);
  107. INIT_BITMAP(bitmap2, initBits2);
  108. bitmap1.Or(bitmap2);
  109. UNIT_ASSERT_EQUAL(bitmap1.Count(), 7);
  110. UNIT_ASSERT_EQUAL(bitmap2.Count(), 4);
  111. size_t resBits[] = {0, 1, 10, 11, 22, 50, 76};
  112. CHECK_BITMAP(bitmap1, resBits);
  113. CHECK_BITMAP(bitmap2, initBits2);
  114. bitmap1.Clear();
  115. INIT_BITMAP(bitmap1, initBits1);
  116. UNIT_ASSERT_EQUAL(bitmap1 | (bitmap2 << 3), TBitMapImpl(bitmap1).Or(bitmap2, 3));
  117. UNIT_ASSERT_EQUAL(bitmap1 | (bitmap2 << 64), TBitMapImpl(bitmap1).Or(bitmap2, 64));
  118. UNIT_ASSERT_EQUAL(bitmap1 | (bitmap2 << 66), TBitMapImpl(bitmap1).Or(bitmap2, 66));
  119. UNIT_ASSERT_EQUAL(bitmap2 | (bitmap1 << 3), TBitMapImpl(bitmap2).Or(bitmap1, 3));
  120. UNIT_ASSERT_EQUAL(bitmap2 | (bitmap1 << 64), TBitMapImpl(bitmap2).Or(bitmap1, 64));
  121. UNIT_ASSERT_EQUAL(bitmap2 | (bitmap1 << 66), TBitMapImpl(bitmap2).Or(bitmap1, 66));
  122. }
  123. Y_UNIT_TEST(TestOrFixed) {
  124. TestOrImpl<TBitMap<145>>();
  125. }
  126. Y_UNIT_TEST(TestOrDyn) {
  127. TestOrImpl<TDynBitMap>();
  128. }
  129. Y_UNIT_TEST(TestCopy) {
  130. TBitMap<101> bitmap1;
  131. size_t initBits[] = {0, 10, 11, 76, 100};
  132. INIT_BITMAP(bitmap1, initBits);
  133. TDynBitMap bitmap2(bitmap1);
  134. CHECK_BITMAP(bitmap2, initBits);
  135. TBitMap<101> bitmap3(bitmap1);
  136. CHECK_BITMAP(bitmap3, initBits);
  137. TBitMap<127> bitmap4(bitmap1);
  138. CHECK_BITMAP(bitmap4, initBits);
  139. TDynBitMap bitmap5;
  140. bitmap5 = bitmap1;
  141. CHECK_BITMAP(bitmap5, initBits);
  142. TBitMap<101> bitmap6;
  143. bitmap6 = bitmap1;
  144. CHECK_BITMAP(bitmap6, initBits);
  145. TBitMap<127> bitmap7;
  146. bitmap7 = bitmap1;
  147. CHECK_BITMAP(bitmap7, initBits);
  148. TBitMap<101> bitmap8;
  149. DoSwap(bitmap8, bitmap6);
  150. CHECK_BITMAP(bitmap8, initBits);
  151. UNIT_ASSERT_EQUAL(bitmap6.Empty(), true);
  152. TDynBitMap bitmap9;
  153. DoSwap(bitmap9, bitmap5);
  154. CHECK_BITMAP(bitmap9, initBits);
  155. UNIT_ASSERT_EQUAL(bitmap5.Empty(), true);
  156. // 64->32
  157. TBitMap<160, ui32> bitmap10(bitmap1);
  158. CHECK_BITMAP(bitmap10, initBits);
  159. // 64->16
  160. TBitMap<160, ui16> bitmap11(bitmap1);
  161. CHECK_BITMAP(bitmap11, initBits);
  162. // 64->8
  163. TBitMap<160, ui8> bitmap12(bitmap1);
  164. CHECK_BITMAP(bitmap12, initBits);
  165. // 32->16
  166. TBitMap<160, ui16> bitmap13(bitmap10);
  167. CHECK_BITMAP(bitmap13, initBits);
  168. // 32->64
  169. TBitMap<160, ui64> bitmap14(bitmap10);
  170. CHECK_BITMAP(bitmap14, initBits);
  171. // 16->64
  172. TBitMap<160, ui64> bitmap15(bitmap11);
  173. CHECK_BITMAP(bitmap15, initBits);
  174. // 8->64
  175. TBitMap<160, ui64> bitmap16(bitmap12);
  176. CHECK_BITMAP(bitmap16, initBits);
  177. }
  178. Y_UNIT_TEST(TestOps) {
  179. TBitMap<16> bitmap1;
  180. TBitMap<12> bitmap2;
  181. size_t initBits1[] = {0, 3, 7, 11};
  182. size_t initBits2[] = {1, 3, 6, 7, 11};
  183. INIT_BITMAP(bitmap1, initBits1);
  184. INIT_BITMAP(bitmap2, initBits2);
  185. bitmap1.Or(3).And(bitmap2).Flip();
  186. size_t resBits[] = {0, 2, 4, 5, 6, 8, 9, 10, 12};
  187. CHECK_BITMAP_WITH_TAIL(bitmap1, resBits);
  188. TDynBitMap bitmap3;
  189. INIT_BITMAP(bitmap3, initBits1);
  190. bitmap3.Or(3).And(bitmap2).Flip();
  191. CHECK_BITMAP_WITH_TAIL(bitmap3, resBits);
  192. bitmap3.Clear();
  193. INIT_BITMAP(bitmap3, initBits1);
  194. TDynBitMap bitmap4 = ~((bitmap3 | 3) & bitmap2);
  195. CHECK_BITMAP_WITH_TAIL(bitmap4, resBits);
  196. TBitMap<128, ui32> expmap;
  197. expmap.Set(47);
  198. expmap.Set(90);
  199. ui64 tst1 = 0;
  200. ui32 tst2 = 0;
  201. ui16 tst3 = 0;
  202. expmap.Export(32, tst1);
  203. UNIT_ASSERT_EQUAL(tst1, (1 << 15) | (((ui64)1) << 58));
  204. expmap.Export(32, tst2);
  205. UNIT_ASSERT_EQUAL(tst2, (1 << 15));
  206. expmap.Export(32, tst3);
  207. UNIT_ASSERT_EQUAL(tst3, (1 << 15));
  208. expmap.Export(33, tst1);
  209. UNIT_ASSERT_EQUAL(tst1, (1 << 14) | (((ui64)1) << 57));
  210. expmap.Export(33, tst2);
  211. UNIT_ASSERT_EQUAL(tst2, (1 << 14));
  212. expmap.Export(33, tst3);
  213. UNIT_ASSERT_EQUAL(tst3, (1 << 14));
  214. }
  215. Y_UNIT_TEST(TestShiftFixed) {
  216. size_t initBits[] = {0, 3, 7, 11};
  217. TBitMap<128> bitmap1;
  218. INIT_BITMAP(bitmap1, initBits);
  219. bitmap1 <<= 62;
  220. size_t resBits1[] = {62, 65, 69, 73};
  221. CHECK_BITMAP(bitmap1, resBits1);
  222. bitmap1 >>= 62;
  223. CHECK_BITMAP(bitmap1, initBits);
  224. bitmap1.Clear();
  225. INIT_BITMAP(bitmap1, initBits);
  226. bitmap1 <<= 120;
  227. size_t resBits2[] = {120, 123, 127};
  228. CHECK_BITMAP(bitmap1, resBits2);
  229. bitmap1 >>= 120;
  230. size_t resBits3[] = {0, 3, 7};
  231. CHECK_BITMAP(bitmap1, resBits3);
  232. bitmap1.Clear();
  233. INIT_BITMAP(bitmap1, initBits);
  234. bitmap1 <<= 128;
  235. UNIT_ASSERT_EQUAL(bitmap1.Empty(), true);
  236. bitmap1.Clear();
  237. INIT_BITMAP(bitmap1, initBits);
  238. bitmap1 <<= 120;
  239. bitmap1 >>= 128;
  240. UNIT_ASSERT_EQUAL(bitmap1.Empty(), true);
  241. bitmap1.Clear();
  242. INIT_BITMAP(bitmap1, initBits);
  243. bitmap1 <<= 140;
  244. UNIT_ASSERT_EQUAL(bitmap1.Empty(), true);
  245. bitmap1.Clear();
  246. INIT_BITMAP(bitmap1, initBits);
  247. bitmap1 <<= 62;
  248. bitmap1 >>= 140;
  249. UNIT_ASSERT_EQUAL(bitmap1.Empty(), true);
  250. }
  251. Y_UNIT_TEST(TestShiftDyn) {
  252. size_t initBits[] = {0, 3, 7, 11};
  253. TDynBitMap bitmap1;
  254. INIT_BITMAP(bitmap1, initBits);
  255. bitmap1 <<= 62;
  256. size_t resBits1[] = {62, 65, 69, 73};
  257. CHECK_BITMAP(bitmap1, resBits1);
  258. bitmap1 >>= 62;
  259. CHECK_BITMAP(bitmap1, initBits);
  260. bitmap1.Clear();
  261. INIT_BITMAP(bitmap1, initBits);
  262. bitmap1 <<= 120;
  263. size_t resBits2[] = {120, 123, 127, 131};
  264. CHECK_BITMAP(bitmap1, resBits2);
  265. bitmap1 >>= 120;
  266. CHECK_BITMAP(bitmap1, initBits);
  267. bitmap1.Clear();
  268. INIT_BITMAP(bitmap1, initBits);
  269. bitmap1 <<= 128;
  270. size_t resBits3[] = {128, 131, 135, 139};
  271. CHECK_BITMAP(bitmap1, resBits3);
  272. bitmap1.Clear();
  273. INIT_BITMAP(bitmap1, initBits);
  274. bitmap1 <<= 120;
  275. bitmap1 >>= 128;
  276. size_t resBits4[] = {3};
  277. CHECK_BITMAP(bitmap1, resBits4);
  278. bitmap1.Clear();
  279. INIT_BITMAP(bitmap1, initBits);
  280. bitmap1 <<= 62;
  281. bitmap1 >>= 140;
  282. UNIT_ASSERT_EQUAL(bitmap1.Empty(), true);
  283. }
  284. // Test that we don't expand bitmap in LShift when high-order bits are zero
  285. Y_UNIT_TEST(TestShiftExpansion) {
  286. UNIT_ASSERT_EQUAL(TDynBitMap().LShift(1).Size(), 64);
  287. UNIT_ASSERT_EQUAL(TDynBitMap().LShift(65).Size(), 64);
  288. UNIT_ASSERT_EQUAL(TDynBitMap().LShift(128).Size(), 64);
  289. TDynBitMap bitmap;
  290. bitmap.Set(62).LShift(1);
  291. UNIT_ASSERT_EQUAL(bitmap, TDynBitMap().Set(63));
  292. UNIT_ASSERT_EQUAL(bitmap.Size(), 64);
  293. // Expand explicitly
  294. bitmap.Set(65);
  295. UNIT_ASSERT_EQUAL(bitmap.Size(), 128);
  296. bitmap.Clear().Set(0).LShift(1);
  297. UNIT_ASSERT_EQUAL(bitmap, TDynBitMap().Set(1));
  298. UNIT_ASSERT_EQUAL(bitmap.Size(), 128);
  299. bitmap.Clear().Set(63).LShift(1);
  300. UNIT_ASSERT_EQUAL(bitmap, TDynBitMap().Set(64));
  301. UNIT_ASSERT_EQUAL(bitmap.Size(), 128);
  302. bitmap.Clear().Set(63).LShift(64);
  303. UNIT_ASSERT_EQUAL(bitmap, TDynBitMap().Set(127));
  304. UNIT_ASSERT_EQUAL(bitmap.Size(), 128);
  305. bitmap.Clear().Set(62).LShift(129);
  306. UNIT_ASSERT_EQUAL(bitmap, TDynBitMap().Set(191));
  307. UNIT_ASSERT_EQUAL(bitmap.Size(), 256);
  308. }
  309. Y_UNIT_TEST(TestFixedSanity) {
  310. // test extra-bit cleanup
  311. UNIT_ASSERT_EQUAL(TBitMap<33>().Set(0).LShift(34).RShift(34).Empty(), true);
  312. UNIT_ASSERT_EQUAL(TBitMap<88>().Set(0).Set(1).Set(2).LShift(90).RShift(90).Empty(), true);
  313. UNIT_ASSERT_EQUAL(TBitMap<88>().Flip().RShift(88).Empty(), true);
  314. UNIT_ASSERT_EQUAL(TBitMap<64>().Flip().LShift(2).RShift(2).Count(), 62);
  315. UNIT_ASSERT_EQUAL(TBitMap<67>().Flip().LShift(2).RShift(2).Count(), 65);
  316. UNIT_ASSERT_EQUAL(TBitMap<128>().Flip().LShift(2).RShift(2).Count(), 126);
  317. UNIT_ASSERT_EQUAL(TBitMap<130>().Flip().LShift(2).RShift(2).Count(), 128);
  318. UNIT_ASSERT_EQUAL(TBitMap<130>(TDynBitMap().Set(131)).Empty(), true);
  319. UNIT_ASSERT_EQUAL(TBitMap<33>().Or(TBitMap<40>().Set(39)).Empty(), true);
  320. UNIT_ASSERT_EQUAL(TBitMap<33>().Xor(TBitMap<40>().Set(39)).Empty(), true);
  321. }
  322. Y_UNIT_TEST(TestIterate) {
  323. TDynBitMap bitmap1;
  324. TDynBitMap bitmap2;
  325. size_t initBits1[] = {0, 3, 7, 8, 11, 33, 34, 35, 36, 62, 63, 100, 127};
  326. INIT_BITMAP(bitmap1, initBits1);
  327. for (size_t i = bitmap1.FirstNonZeroBit(); i != bitmap1.Size(); i = bitmap1.NextNonZeroBit(i)) {
  328. bitmap2.Set(i);
  329. }
  330. CHECK_BITMAP(bitmap2, initBits1);
  331. UNIT_ASSERT_EQUAL(bitmap1, bitmap2);
  332. size_t initBits2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 33, 34, 35, 36, 62};
  333. bitmap1.Clear();
  334. bitmap2.Clear();
  335. INIT_BITMAP(bitmap1, initBits2);
  336. for (size_t i = bitmap1.FirstNonZeroBit(); i != bitmap1.Size(); i = bitmap1.NextNonZeroBit(i)) {
  337. bitmap2.Set(i);
  338. }
  339. CHECK_BITMAP(bitmap2, initBits2);
  340. UNIT_ASSERT_EQUAL(bitmap1, bitmap2);
  341. UNIT_ASSERT_EQUAL(bitmap1.NextNonZeroBit(63), bitmap1.Size());
  342. UNIT_ASSERT_EQUAL(bitmap1.NextNonZeroBit(64), bitmap1.Size());
  343. UNIT_ASSERT_EQUAL(bitmap1.NextNonZeroBit(65), bitmap1.Size());
  344. UNIT_ASSERT_EQUAL(bitmap1.NextNonZeroBit(127), bitmap1.Size());
  345. UNIT_ASSERT_EQUAL(bitmap1.NextNonZeroBit(533), bitmap1.Size());
  346. TBitMap<128, ui8> bitmap3;
  347. bitmap1.Clear();
  348. INIT_BITMAP(bitmap1, initBits1);
  349. for (size_t i = bitmap1.FirstNonZeroBit(); i != bitmap1.Size(); i = bitmap1.NextNonZeroBit(i)) {
  350. bitmap3.Set(i);
  351. }
  352. CHECK_BITMAP(bitmap3, initBits1);
  353. UNIT_ASSERT_EQUAL(bitmap3, bitmap1);
  354. TBitMap<18> bitmap4;
  355. bitmap4.Set(15);
  356. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(0), 15);
  357. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(15), bitmap4.Size());
  358. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(63), bitmap4.Size());
  359. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(64), bitmap4.Size());
  360. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(65), bitmap4.Size());
  361. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(127), bitmap4.Size());
  362. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(533), bitmap4.Size());
  363. bitmap4.Clear().Flip();
  364. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(0), 1);
  365. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(15), 16);
  366. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(17), bitmap4.Size());
  367. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(18), bitmap4.Size());
  368. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(63), bitmap4.Size());
  369. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(64), bitmap4.Size());
  370. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(65), bitmap4.Size());
  371. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(127), bitmap4.Size());
  372. UNIT_ASSERT_EQUAL(bitmap4.NextNonZeroBit(533), bitmap4.Size());
  373. }
  374. Y_UNIT_TEST(TestHashFixed) {
  375. TBitMap<32, ui8> bitmap32;
  376. TBitMap<32, ui8> bitmap322;
  377. TBitMap<64, ui8> bitmap64;
  378. bitmap32.Clear();
  379. bitmap322.Clear();
  380. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap322.Hash());
  381. bitmap32.Set(0);
  382. UNIT_ASSERT_UNEQUAL(bitmap32.Hash(), bitmap322.Hash());
  383. bitmap322.Set(0);
  384. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap322.Hash());
  385. bitmap32.Set(8).Set(31);
  386. UNIT_ASSERT_UNEQUAL(bitmap32.Hash(), bitmap322.Hash());
  387. bitmap322.Set(8).Set(31);
  388. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap322.Hash());
  389. bitmap32.Clear();
  390. bitmap64.Clear();
  391. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap64.Hash());
  392. bitmap32.Set(0);
  393. UNIT_ASSERT_UNEQUAL(bitmap32.Hash(), bitmap64.Hash());
  394. bitmap64.Set(0);
  395. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap64.Hash());
  396. bitmap32.Set(8).Set(31);
  397. UNIT_ASSERT_UNEQUAL(bitmap32.Hash(), bitmap64.Hash());
  398. bitmap64.Set(8).Set(31);
  399. UNIT_ASSERT_EQUAL(bitmap32.Hash(), bitmap64.Hash());
  400. bitmap64.Set(32);
  401. UNIT_ASSERT_UNEQUAL(bitmap32.Hash(), bitmap64.Hash());
  402. }
  403. Y_UNIT_TEST(TestHashDynamic) {
  404. TDynBitMap bitmap1;
  405. TDynBitMap bitmap2;
  406. bitmap1.Clear();
  407. bitmap2.Clear();
  408. UNIT_ASSERT_EQUAL(bitmap1.Hash(), bitmap2.Hash());
  409. bitmap1.Set(0);
  410. UNIT_ASSERT_UNEQUAL(bitmap1.Hash(), bitmap2.Hash());
  411. bitmap2.Set(0);
  412. UNIT_ASSERT_EQUAL(bitmap1.Hash(), bitmap2.Hash());
  413. bitmap1.Set(8).Set(31);
  414. UNIT_ASSERT_UNEQUAL(bitmap1.Hash(), bitmap2.Hash());
  415. bitmap2.Set(8).Set(31);
  416. UNIT_ASSERT_EQUAL(bitmap1.Hash(), bitmap2.Hash());
  417. bitmap1.Set(64);
  418. UNIT_ASSERT_UNEQUAL(bitmap1.Hash(), bitmap2.Hash());
  419. bitmap2.Set(64);
  420. UNIT_ASSERT_EQUAL(bitmap1.Hash(), bitmap2.Hash());
  421. }
  422. Y_UNIT_TEST(TestHashMixed) {
  423. static_assert((std::is_same<TDynBitMap::TChunk, ui64>::value), "expect (TSameType<TDynBitMap::TChunk, ui64>::Result)");
  424. TBitMap<sizeof(ui64) * 16, ui64> bitmapFixed;
  425. TDynBitMap bitmapDynamic;
  426. bitmapFixed.Clear();
  427. bitmapDynamic.Clear();
  428. UNIT_ASSERT_EQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  429. bitmapFixed.Set(0);
  430. UNIT_ASSERT_UNEQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  431. bitmapDynamic.Set(0);
  432. UNIT_ASSERT_EQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  433. bitmapFixed.Set(8).Set(127);
  434. UNIT_ASSERT_UNEQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  435. bitmapDynamic.Set(8).Set(127);
  436. UNIT_ASSERT_EQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  437. bitmapDynamic.Set(128);
  438. UNIT_ASSERT_UNEQUAL(bitmapFixed.Hash(), bitmapDynamic.Hash());
  439. }
  440. Y_UNIT_TEST(TestSetResetRange) {
  441. // Single chunk
  442. using TBitMap1Chunk = TBitMap<64>;
  443. UNIT_ASSERT_EQUAL(TBitMap1Chunk().Flip().Reset(10, 50), TBitMap1Chunk().Set(0, 10).Set(50, 64));
  444. UNIT_ASSERT_EQUAL(TBitMap1Chunk().Flip().Reset(0, 10), TBitMap1Chunk().Set(10, 64));
  445. UNIT_ASSERT_EQUAL(TBitMap1Chunk().Flip().Reset(50, 64), TBitMap1Chunk().Set(0, 50));
  446. UNIT_ASSERT_EQUAL(TBitMap1Chunk().Flip().Reset(0, 10).Reset(50, 64), TBitMap1Chunk().Set(10, 50));
  447. // Two chunks
  448. using TBitMap2Chunks = TBitMap<64, ui32>;
  449. UNIT_ASSERT_EQUAL(TBitMap2Chunks().Flip().Reset(10, 50), TBitMap2Chunks().Set(0, 10).Set(50, 64));
  450. UNIT_ASSERT_EQUAL(TBitMap2Chunks().Flip().Reset(0, 10), TBitMap2Chunks().Set(10, 64));
  451. UNIT_ASSERT_EQUAL(TBitMap2Chunks().Flip().Reset(50, 64), TBitMap2Chunks().Set(0, 50));
  452. UNIT_ASSERT_EQUAL(TBitMap2Chunks().Flip().Reset(0, 10).Reset(50, 64), TBitMap2Chunks().Set(10, 50));
  453. // Many chunks
  454. using TBitMap4Chunks = TBitMap<64, ui16>;
  455. UNIT_ASSERT_EQUAL(TBitMap4Chunks().Flip().Reset(10, 50), TBitMap4Chunks().Set(0, 10).Set(50, 64));
  456. UNIT_ASSERT_EQUAL(TBitMap4Chunks().Flip().Reset(0, 10), TBitMap4Chunks().Set(10, 64));
  457. UNIT_ASSERT_EQUAL(TBitMap4Chunks().Flip().Reset(50, 64), TBitMap4Chunks().Set(0, 50));
  458. UNIT_ASSERT_EQUAL(TBitMap4Chunks().Flip().Reset(0, 10).Reset(50, 64), TBitMap4Chunks().Set(10, 50));
  459. }
  460. Y_UNIT_TEST(TestSetRangeDyn) {
  461. for (size_t start = 0; start < 192; ++start) {
  462. for (size_t end = start; end < 192; ++end) {
  463. TDynBitMap bm;
  464. bm.Reserve(192);
  465. bm.Set(start, end);
  466. for (size_t k = 0; k < 192; ++k) {
  467. UNIT_ASSERT_VALUES_EQUAL(bm.Get(k), k >= start && k < end ? 1 : 0);
  468. }
  469. }
  470. }
  471. }
  472. Y_UNIT_TEST(TestResetLargeRangeDyn) {
  473. TDynBitMap bm;
  474. bm.Set(0);
  475. bm.Reset(1, 2048);
  476. bm.Set(2048);
  477. for (size_t k = 0; k <= 2048; ++k) {
  478. UNIT_ASSERT_VALUES_EQUAL(bm.Get(k), k >= 1 && k < 2048 ? 0 : 1);
  479. }
  480. }
  481. } // Y_UNIT_TEST_SUITE(TBitMapTest)