BitVectorTest.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. //===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
  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. #ifndef __ppc__
  10. #include "llvm/ADT/BitVector.h"
  11. #include "llvm/ADT/SmallBitVector.h"
  12. #include "gtest/gtest.h"
  13. using namespace llvm;
  14. namespace {
  15. // Test fixture
  16. template <typename T>
  17. class BitVectorTest : public ::testing::Test { };
  18. // Test both BitVector and SmallBitVector with the same suite of tests.
  19. typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
  20. TYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);
  21. TYPED_TEST(BitVectorTest, TrivialOperation) {
  22. TypeParam Vec;
  23. EXPECT_EQ(0U, Vec.count());
  24. EXPECT_EQ(0U, Vec.size());
  25. EXPECT_FALSE(Vec.any());
  26. EXPECT_TRUE(Vec.all());
  27. EXPECT_TRUE(Vec.none());
  28. EXPECT_TRUE(Vec.empty());
  29. Vec.resize(5, true);
  30. EXPECT_EQ(5U, Vec.count());
  31. EXPECT_EQ(5U, Vec.size());
  32. EXPECT_TRUE(Vec.any());
  33. EXPECT_TRUE(Vec.all());
  34. EXPECT_FALSE(Vec.none());
  35. EXPECT_FALSE(Vec.empty());
  36. Vec.resize(11);
  37. EXPECT_EQ(5U, Vec.count());
  38. EXPECT_EQ(11U, Vec.size());
  39. EXPECT_TRUE(Vec.any());
  40. EXPECT_FALSE(Vec.all());
  41. EXPECT_FALSE(Vec.none());
  42. EXPECT_FALSE(Vec.empty());
  43. TypeParam Inv = Vec;
  44. Inv.flip();
  45. EXPECT_EQ(6U, Inv.count());
  46. EXPECT_EQ(11U, Inv.size());
  47. EXPECT_TRUE(Inv.any());
  48. EXPECT_FALSE(Inv.all());
  49. EXPECT_FALSE(Inv.none());
  50. EXPECT_FALSE(Inv.empty());
  51. EXPECT_FALSE(Inv == Vec);
  52. EXPECT_TRUE(Inv != Vec);
  53. Vec.flip();
  54. EXPECT_TRUE(Inv == Vec);
  55. EXPECT_FALSE(Inv != Vec);
  56. // Add some "interesting" data to Vec.
  57. Vec.resize(23, true);
  58. Vec.resize(25, false);
  59. Vec.resize(26, true);
  60. Vec.resize(29, false);
  61. Vec.resize(33, true);
  62. Vec.resize(57, false);
  63. unsigned Count = 0;
  64. for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
  65. ++Count;
  66. EXPECT_TRUE(Vec[i]);
  67. EXPECT_TRUE(Vec.test(i));
  68. }
  69. EXPECT_EQ(Count, Vec.count());
  70. EXPECT_EQ(Count, 23u);
  71. EXPECT_FALSE(Vec[0]);
  72. EXPECT_TRUE(Vec[32]);
  73. EXPECT_FALSE(Vec[56]);
  74. Vec.resize(61, false);
  75. TypeParam Copy = Vec;
  76. TypeParam Alt(3, false);
  77. Alt.resize(6, true);
  78. std::swap(Alt, Vec);
  79. EXPECT_TRUE(Copy == Alt);
  80. EXPECT_TRUE(Vec.size() == 6);
  81. EXPECT_TRUE(Vec.count() == 3);
  82. EXPECT_TRUE(Vec.find_first() == 3);
  83. std::swap(Copy, Vec);
  84. // Add some more "interesting" data.
  85. Vec.resize(68, true);
  86. Vec.resize(78, false);
  87. Vec.resize(89, true);
  88. Vec.resize(90, false);
  89. Vec.resize(91, true);
  90. Vec.resize(130, false);
  91. Count = 0;
  92. for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
  93. ++Count;
  94. EXPECT_TRUE(Vec[i]);
  95. EXPECT_TRUE(Vec.test(i));
  96. }
  97. EXPECT_EQ(Count, Vec.count());
  98. EXPECT_EQ(Count, 42u);
  99. EXPECT_FALSE(Vec[0]);
  100. EXPECT_TRUE(Vec[32]);
  101. EXPECT_FALSE(Vec[60]);
  102. EXPECT_FALSE(Vec[129]);
  103. Vec.flip(60);
  104. EXPECT_TRUE(Vec[60]);
  105. EXPECT_EQ(Count + 1, Vec.count());
  106. Vec.flip(60);
  107. EXPECT_FALSE(Vec[60]);
  108. EXPECT_EQ(Count, Vec.count());
  109. Vec.reset(32);
  110. EXPECT_FALSE(Vec[32]);
  111. EXPECT_EQ(Count - 1, Vec.count());
  112. Vec.set(32);
  113. EXPECT_TRUE(Vec[32]);
  114. EXPECT_EQ(Count, Vec.count());
  115. Vec.flip();
  116. EXPECT_EQ(Vec.size() - Count, Vec.count());
  117. Vec.reset();
  118. EXPECT_EQ(0U, Vec.count());
  119. EXPECT_EQ(130U, Vec.size());
  120. EXPECT_FALSE(Vec.any());
  121. EXPECT_FALSE(Vec.all());
  122. EXPECT_TRUE(Vec.none());
  123. EXPECT_FALSE(Vec.empty());
  124. Vec.flip();
  125. EXPECT_EQ(130U, Vec.count());
  126. EXPECT_EQ(130U, Vec.size());
  127. EXPECT_TRUE(Vec.any());
  128. EXPECT_TRUE(Vec.all());
  129. EXPECT_FALSE(Vec.none());
  130. EXPECT_FALSE(Vec.empty());
  131. Vec.resize(64);
  132. EXPECT_EQ(64U, Vec.count());
  133. EXPECT_EQ(64U, Vec.size());
  134. EXPECT_TRUE(Vec.any());
  135. EXPECT_TRUE(Vec.all());
  136. EXPECT_FALSE(Vec.none());
  137. EXPECT_FALSE(Vec.empty());
  138. Vec.flip();
  139. EXPECT_EQ(0U, Vec.count());
  140. EXPECT_EQ(64U, Vec.size());
  141. EXPECT_FALSE(Vec.any());
  142. EXPECT_FALSE(Vec.all());
  143. EXPECT_TRUE(Vec.none());
  144. EXPECT_FALSE(Vec.empty());
  145. Inv = TypeParam().flip();
  146. EXPECT_EQ(0U, Inv.count());
  147. EXPECT_EQ(0U, Inv.size());
  148. EXPECT_FALSE(Inv.any());
  149. EXPECT_TRUE(Inv.all());
  150. EXPECT_TRUE(Inv.none());
  151. EXPECT_TRUE(Inv.empty());
  152. Vec.clear();
  153. EXPECT_EQ(0U, Vec.count());
  154. EXPECT_EQ(0U, Vec.size());
  155. EXPECT_FALSE(Vec.any());
  156. EXPECT_TRUE(Vec.all());
  157. EXPECT_TRUE(Vec.none());
  158. EXPECT_TRUE(Vec.empty());
  159. }
  160. TYPED_TEST(BitVectorTest, CompoundAssignment) {
  161. TypeParam A;
  162. A.resize(10);
  163. A.set(4);
  164. A.set(7);
  165. TypeParam B;
  166. B.resize(50);
  167. B.set(5);
  168. B.set(18);
  169. A |= B;
  170. EXPECT_TRUE(A.test(4));
  171. EXPECT_TRUE(A.test(5));
  172. EXPECT_TRUE(A.test(7));
  173. EXPECT_TRUE(A.test(18));
  174. EXPECT_EQ(4U, A.count());
  175. EXPECT_EQ(50U, A.size());
  176. B.resize(10);
  177. B.set();
  178. B.reset(2);
  179. B.reset(7);
  180. A &= B;
  181. EXPECT_FALSE(A.test(2));
  182. EXPECT_FALSE(A.test(7));
  183. EXPECT_EQ(2U, A.count());
  184. EXPECT_EQ(50U, A.size());
  185. B.resize(100);
  186. B.set();
  187. A ^= B;
  188. EXPECT_TRUE(A.test(2));
  189. EXPECT_TRUE(A.test(7));
  190. EXPECT_EQ(98U, A.count());
  191. EXPECT_EQ(100U, A.size());
  192. }
  193. TYPED_TEST(BitVectorTest, ProxyIndex) {
  194. TypeParam Vec(3);
  195. EXPECT_TRUE(Vec.none());
  196. Vec[0] = Vec[1] = Vec[2] = true;
  197. EXPECT_EQ(Vec.size(), Vec.count());
  198. Vec[2] = Vec[1] = Vec[0] = false;
  199. EXPECT_TRUE(Vec.none());
  200. }
  201. TYPED_TEST(BitVectorTest, PortableBitMask) {
  202. TypeParam A;
  203. const uint32_t Mask1[] = { 0x80000000, 6, 5 };
  204. A.resize(10);
  205. A.setBitsInMask(Mask1, 3);
  206. EXPECT_EQ(10u, A.size());
  207. EXPECT_FALSE(A.test(0));
  208. A.resize(32);
  209. A.setBitsInMask(Mask1, 3);
  210. EXPECT_FALSE(A.test(0));
  211. EXPECT_TRUE(A.test(31));
  212. EXPECT_EQ(1u, A.count());
  213. A.resize(33);
  214. A.setBitsInMask(Mask1, 1);
  215. EXPECT_EQ(1u, A.count());
  216. A.setBitsInMask(Mask1, 2);
  217. EXPECT_EQ(1u, A.count());
  218. A.resize(34);
  219. A.setBitsInMask(Mask1, 2);
  220. EXPECT_EQ(2u, A.count());
  221. A.resize(65);
  222. A.setBitsInMask(Mask1, 3);
  223. EXPECT_EQ(4u, A.count());
  224. A.setBitsNotInMask(Mask1, 1);
  225. EXPECT_EQ(32u+3u, A.count());
  226. A.setBitsNotInMask(Mask1, 3);
  227. EXPECT_EQ(65u, A.count());
  228. A.resize(96);
  229. EXPECT_EQ(65u, A.count());
  230. A.clear();
  231. A.resize(128);
  232. A.setBitsNotInMask(Mask1, 3);
  233. EXPECT_EQ(96u-5u, A.count());
  234. A.clearBitsNotInMask(Mask1, 1);
  235. EXPECT_EQ(64-4u, A.count());
  236. }
  237. TYPED_TEST(BitVectorTest, BinOps) {
  238. TypeParam A;
  239. TypeParam B;
  240. A.resize(65);
  241. EXPECT_FALSE(A.anyCommon(B));
  242. EXPECT_FALSE(B.anyCommon(B));
  243. B.resize(64);
  244. A.set(64);
  245. EXPECT_FALSE(A.anyCommon(B));
  246. EXPECT_FALSE(B.anyCommon(A));
  247. B.set(63);
  248. EXPECT_FALSE(A.anyCommon(B));
  249. EXPECT_FALSE(B.anyCommon(A));
  250. A.set(63);
  251. EXPECT_TRUE(A.anyCommon(B));
  252. EXPECT_TRUE(B.anyCommon(A));
  253. B.resize(70);
  254. B.set(64);
  255. B.reset(63);
  256. A.resize(64);
  257. EXPECT_FALSE(A.anyCommon(B));
  258. EXPECT_FALSE(B.anyCommon(A));
  259. }
  260. TYPED_TEST(BitVectorTest, RangeOps) {
  261. TypeParam A;
  262. A.resize(256);
  263. A.reset();
  264. A.set(1, 255);
  265. EXPECT_FALSE(A.test(0));
  266. EXPECT_TRUE( A.test(1));
  267. EXPECT_TRUE( A.test(23));
  268. EXPECT_TRUE( A.test(254));
  269. EXPECT_FALSE(A.test(255));
  270. TypeParam B;
  271. B.resize(256);
  272. B.set();
  273. B.reset(1, 255);
  274. EXPECT_TRUE( B.test(0));
  275. EXPECT_FALSE(B.test(1));
  276. EXPECT_FALSE(B.test(23));
  277. EXPECT_FALSE(B.test(254));
  278. EXPECT_TRUE( B.test(255));
  279. TypeParam C;
  280. C.resize(3);
  281. C.reset();
  282. C.set(0, 1);
  283. EXPECT_TRUE(C.test(0));
  284. EXPECT_FALSE( C.test(1));
  285. EXPECT_FALSE( C.test(2));
  286. TypeParam D;
  287. D.resize(3);
  288. D.set();
  289. D.reset(0, 1);
  290. EXPECT_FALSE(D.test(0));
  291. EXPECT_TRUE( D.test(1));
  292. EXPECT_TRUE( D.test(2));
  293. TypeParam E;
  294. E.resize(128);
  295. E.reset();
  296. E.set(1, 33);
  297. EXPECT_FALSE(E.test(0));
  298. EXPECT_TRUE( E.test(1));
  299. EXPECT_TRUE( E.test(32));
  300. EXPECT_FALSE(E.test(33));
  301. TypeParam BufferOverrun;
  302. unsigned size = sizeof(unsigned long) * 8;
  303. BufferOverrun.resize(size);
  304. BufferOverrun.reset(0, size);
  305. BufferOverrun.set(0, size);
  306. }
  307. TYPED_TEST(BitVectorTest, CompoundTestReset) {
  308. TypeParam A(50, true);
  309. TypeParam B(50, false);
  310. TypeParam C(100, true);
  311. TypeParam D(100, false);
  312. EXPECT_FALSE(A.test(A));
  313. EXPECT_TRUE(A.test(B));
  314. EXPECT_FALSE(A.test(C));
  315. EXPECT_TRUE(A.test(D));
  316. EXPECT_FALSE(B.test(A));
  317. EXPECT_FALSE(B.test(B));
  318. EXPECT_FALSE(B.test(C));
  319. EXPECT_FALSE(B.test(D));
  320. EXPECT_TRUE(C.test(A));
  321. EXPECT_TRUE(C.test(B));
  322. EXPECT_FALSE(C.test(C));
  323. EXPECT_TRUE(C.test(D));
  324. A.reset(B);
  325. A.reset(D);
  326. EXPECT_TRUE(A.all());
  327. A.reset(A);
  328. EXPECT_TRUE(A.none());
  329. A.set();
  330. A.reset(C);
  331. EXPECT_TRUE(A.none());
  332. A.set();
  333. C.reset(A);
  334. EXPECT_EQ(50, C.find_first());
  335. C.reset(C);
  336. EXPECT_TRUE(C.none());
  337. }
  338. }
  339. #endif