SparseBitVector.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. //===- llvm/ADT/SparseBitVector.h - Efficient Sparse BitVector -*- 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. // This file defines the SparseBitVector class. See the doxygen comment for
  11. // SparseBitVector for more details on the algorithm used.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #ifndef LLVM_ADT_SPARSEBITVECTOR_H
  15. #define LLVM_ADT_SPARSEBITVECTOR_H
  16. #include "llvm/ADT/ilist.h"
  17. #include "llvm/ADT/ilist_node.h"
  18. #include "llvm/Support/DataTypes.h"
  19. #include "llvm/Support/ErrorHandling.h"
  20. #include "llvm/Support/MathExtras.h"
  21. #include "llvm/Support/raw_ostream.h"
  22. #include <cassert>
  23. #include <climits>
  24. namespace llvm {
  25. /// SparseBitVector is an implementation of a bitvector that is sparse by only
  26. /// storing the elements that have non-zero bits set. In order to make this
  27. /// fast for the most common cases, SparseBitVector is implemented as a linked
  28. /// list of SparseBitVectorElements. We maintain a pointer to the last
  29. /// SparseBitVectorElement accessed (in the form of a list iterator), in order
  30. /// to make multiple in-order test/set constant time after the first one is
  31. /// executed. Note that using vectors to store SparseBitVectorElement's does
  32. /// not work out very well because it causes insertion in the middle to take
  33. /// enormous amounts of time with a large amount of bits. Other structures that
  34. /// have better worst cases for insertion in the middle (various balanced trees,
  35. /// etc) do not perform as well in practice as a linked list with this iterator
  36. /// kept up to date. They are also significantly more memory intensive.
  37. template <unsigned ElementSize = 128>
  38. struct SparseBitVectorElement
  39. : public ilist_node<SparseBitVectorElement<ElementSize> > {
  40. public:
  41. typedef unsigned long BitWord;
  42. typedef unsigned size_type;
  43. enum {
  44. BITWORD_SIZE = sizeof(BitWord) * CHAR_BIT,
  45. BITWORDS_PER_ELEMENT = (ElementSize + BITWORD_SIZE - 1) / BITWORD_SIZE,
  46. BITS_PER_ELEMENT = ElementSize
  47. };
  48. private:
  49. // Index of Element in terms of where first bit starts.
  50. unsigned ElementIndex;
  51. BitWord Bits[BITWORDS_PER_ELEMENT];
  52. // Needed for sentinels
  53. friend struct ilist_sentinel_traits<SparseBitVectorElement>;
  54. SparseBitVectorElement() {
  55. ElementIndex = ~0U;
  56. memset(&Bits[0], 0, sizeof (BitWord) * BITWORDS_PER_ELEMENT);
  57. }
  58. public:
  59. explicit SparseBitVectorElement(unsigned Idx) {
  60. ElementIndex = Idx;
  61. memset(&Bits[0], 0, sizeof (BitWord) * BITWORDS_PER_ELEMENT);
  62. }
  63. // Comparison.
  64. bool operator==(const SparseBitVectorElement &RHS) const {
  65. if (ElementIndex != RHS.ElementIndex)
  66. return false;
  67. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i)
  68. if (Bits[i] != RHS.Bits[i])
  69. return false;
  70. return true;
  71. }
  72. bool operator!=(const SparseBitVectorElement &RHS) const {
  73. return !(*this == RHS);
  74. }
  75. // Return the bits that make up word Idx in our element.
  76. BitWord word(unsigned Idx) const {
  77. assert (Idx < BITWORDS_PER_ELEMENT);
  78. return Bits[Idx];
  79. }
  80. unsigned index() const {
  81. return ElementIndex;
  82. }
  83. bool empty() const {
  84. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i)
  85. if (Bits[i])
  86. return false;
  87. return true;
  88. }
  89. void set(unsigned Idx) {
  90. Bits[Idx / BITWORD_SIZE] |= 1L << (Idx % BITWORD_SIZE);
  91. }
  92. bool test_and_set (unsigned Idx) {
  93. bool old = test(Idx);
  94. if (!old) {
  95. set(Idx);
  96. return true;
  97. }
  98. return false;
  99. }
  100. void reset(unsigned Idx) {
  101. Bits[Idx / BITWORD_SIZE] &= ~(1L << (Idx % BITWORD_SIZE));
  102. }
  103. bool test(unsigned Idx) const {
  104. return Bits[Idx / BITWORD_SIZE] & (1L << (Idx % BITWORD_SIZE));
  105. }
  106. size_type count() const {
  107. unsigned NumBits = 0;
  108. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i)
  109. NumBits += countPopulation(Bits[i]);
  110. return NumBits;
  111. }
  112. /// find_first - Returns the index of the first set bit.
  113. int find_first() const {
  114. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i)
  115. if (Bits[i] != 0)
  116. return i * BITWORD_SIZE + countTrailingZeros(Bits[i]);
  117. llvm_unreachable("Illegal empty element");
  118. }
  119. /// find_next - Returns the index of the next set bit starting from the
  120. /// "Curr" bit. Returns -1 if the next set bit is not found.
  121. int find_next(unsigned Curr) const {
  122. if (Curr >= BITS_PER_ELEMENT)
  123. return -1;
  124. unsigned WordPos = Curr / BITWORD_SIZE;
  125. unsigned BitPos = Curr % BITWORD_SIZE;
  126. BitWord Copy = Bits[WordPos];
  127. assert (WordPos <= BITWORDS_PER_ELEMENT
  128. && "Word Position outside of element");
  129. // Mask off previous bits.
  130. Copy &= ~0UL << BitPos;
  131. if (Copy != 0)
  132. return WordPos * BITWORD_SIZE + countTrailingZeros(Copy);
  133. // Check subsequent words.
  134. for (unsigned i = WordPos+1; i < BITWORDS_PER_ELEMENT; ++i)
  135. if (Bits[i] != 0)
  136. return i * BITWORD_SIZE + countTrailingZeros(Bits[i]);
  137. return -1;
  138. }
  139. // Union this element with RHS and return true if this one changed.
  140. bool unionWith(const SparseBitVectorElement &RHS) {
  141. bool changed = false;
  142. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
  143. BitWord old = changed ? 0 : Bits[i];
  144. Bits[i] |= RHS.Bits[i];
  145. if (!changed && old != Bits[i])
  146. changed = true;
  147. }
  148. return changed;
  149. }
  150. // Return true if we have any bits in common with RHS
  151. bool intersects(const SparseBitVectorElement &RHS) const {
  152. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
  153. if (RHS.Bits[i] & Bits[i])
  154. return true;
  155. }
  156. return false;
  157. }
  158. // Intersect this Element with RHS and return true if this one changed.
  159. // BecameZero is set to true if this element became all-zero bits.
  160. bool intersectWith(const SparseBitVectorElement &RHS,
  161. bool &BecameZero) {
  162. bool changed = false;
  163. bool allzero = true;
  164. BecameZero = false;
  165. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
  166. BitWord old = changed ? 0 : Bits[i];
  167. Bits[i] &= RHS.Bits[i];
  168. if (Bits[i] != 0)
  169. allzero = false;
  170. if (!changed && old != Bits[i])
  171. changed = true;
  172. }
  173. BecameZero = allzero;
  174. return changed;
  175. }
  176. // Intersect this Element with the complement of RHS and return true if this
  177. // one changed. BecameZero is set to true if this element became all-zero
  178. // bits.
  179. bool intersectWithComplement(const SparseBitVectorElement &RHS,
  180. bool &BecameZero) {
  181. bool changed = false;
  182. bool allzero = true;
  183. BecameZero = false;
  184. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
  185. BitWord old = changed ? 0 : Bits[i];
  186. Bits[i] &= ~RHS.Bits[i];
  187. if (Bits[i] != 0)
  188. allzero = false;
  189. if (!changed && old != Bits[i])
  190. changed = true;
  191. }
  192. BecameZero = allzero;
  193. return changed;
  194. }
  195. // Three argument version of intersectWithComplement that intersects
  196. // RHS1 & ~RHS2 into this element
  197. void intersectWithComplement(const SparseBitVectorElement &RHS1,
  198. const SparseBitVectorElement &RHS2,
  199. bool &BecameZero) {
  200. bool allzero = true;
  201. BecameZero = false;
  202. for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
  203. Bits[i] = RHS1.Bits[i] & ~RHS2.Bits[i];
  204. if (Bits[i] != 0)
  205. allzero = false;
  206. }
  207. BecameZero = allzero;
  208. }
  209. };
  210. template <unsigned ElementSize>
  211. struct ilist_traits<SparseBitVectorElement<ElementSize> >
  212. : public ilist_default_traits<SparseBitVectorElement<ElementSize> > {
  213. typedef SparseBitVectorElement<ElementSize> Element;
  214. Element *createSentinel() const { return static_cast<Element *>(&Sentinel); }
  215. static void destroySentinel(Element *) {}
  216. Element *provideInitialHead() const { return createSentinel(); }
  217. Element *ensureHead(Element *) const { return createSentinel(); }
  218. static void noteHead(Element *, Element *) {}
  219. private:
  220. mutable ilist_half_node<Element> Sentinel;
  221. };
  222. template <unsigned ElementSize = 128>
  223. class SparseBitVector {
  224. typedef ilist<SparseBitVectorElement<ElementSize> > ElementList;
  225. typedef typename ElementList::iterator ElementListIter;
  226. typedef typename ElementList::const_iterator ElementListConstIter;
  227. enum {
  228. BITWORD_SIZE = SparseBitVectorElement<ElementSize>::BITWORD_SIZE
  229. };
  230. // Pointer to our current Element.
  231. ElementListIter CurrElementIter;
  232. ElementList Elements;
  233. // This is like std::lower_bound, except we do linear searching from the
  234. // current position.
  235. ElementListIter FindLowerBound(unsigned ElementIndex) {
  236. if (Elements.empty()) {
  237. CurrElementIter = Elements.begin();
  238. return Elements.begin();
  239. }
  240. // Make sure our current iterator is valid.
  241. if (CurrElementIter == Elements.end())
  242. --CurrElementIter;
  243. // Search from our current iterator, either backwards or forwards,
  244. // depending on what element we are looking for.
  245. ElementListIter ElementIter = CurrElementIter;
  246. if (CurrElementIter->index() == ElementIndex) {
  247. return ElementIter;
  248. } else if (CurrElementIter->index() > ElementIndex) {
  249. while (ElementIter != Elements.begin()
  250. && ElementIter->index() > ElementIndex)
  251. --ElementIter;
  252. } else {
  253. while (ElementIter != Elements.end() &&
  254. ElementIter->index() < ElementIndex)
  255. ++ElementIter;
  256. }
  257. CurrElementIter = ElementIter;
  258. return ElementIter;
  259. }
  260. // Iterator to walk set bits in the bitmap. This iterator is a lot uglier
  261. // than it would be, in order to be efficient.
  262. class SparseBitVectorIterator {
  263. private:
  264. bool AtEnd;
  265. const SparseBitVector<ElementSize> *BitVector;
  266. // Current element inside of bitmap.
  267. ElementListConstIter Iter;
  268. // Current bit number inside of our bitmap.
  269. unsigned BitNumber;
  270. // Current word number inside of our element.
  271. unsigned WordNumber;
  272. // Current bits from the element.
  273. typename SparseBitVectorElement<ElementSize>::BitWord Bits;
  274. // Move our iterator to the first non-zero bit in the bitmap.
  275. void AdvanceToFirstNonZero() {
  276. if (AtEnd)
  277. return;
  278. if (BitVector->Elements.empty()) {
  279. AtEnd = true;
  280. return;
  281. }
  282. Iter = BitVector->Elements.begin();
  283. BitNumber = Iter->index() * ElementSize;
  284. unsigned BitPos = Iter->find_first();
  285. BitNumber += BitPos;
  286. WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;
  287. Bits = Iter->word(WordNumber);
  288. Bits >>= BitPos % BITWORD_SIZE;
  289. }
  290. // Move our iterator to the next non-zero bit.
  291. void AdvanceToNextNonZero() {
  292. if (AtEnd)
  293. return;
  294. while (Bits && !(Bits & 1)) {
  295. Bits >>= 1;
  296. BitNumber += 1;
  297. }
  298. // See if we ran out of Bits in this word.
  299. if (!Bits) {
  300. int NextSetBitNumber = Iter->find_next(BitNumber % ElementSize) ;
  301. // If we ran out of set bits in this element, move to next element.
  302. if (NextSetBitNumber == -1 || (BitNumber % ElementSize == 0)) {
  303. ++Iter;
  304. WordNumber = 0;
  305. // We may run out of elements in the bitmap.
  306. if (Iter == BitVector->Elements.end()) {
  307. AtEnd = true;
  308. return;
  309. }
  310. // Set up for next non-zero word in bitmap.
  311. BitNumber = Iter->index() * ElementSize;
  312. NextSetBitNumber = Iter->find_first();
  313. BitNumber += NextSetBitNumber;
  314. WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;
  315. Bits = Iter->word(WordNumber);
  316. Bits >>= NextSetBitNumber % BITWORD_SIZE;
  317. } else {
  318. WordNumber = (NextSetBitNumber % ElementSize) / BITWORD_SIZE;
  319. Bits = Iter->word(WordNumber);
  320. Bits >>= NextSetBitNumber % BITWORD_SIZE;
  321. BitNumber = Iter->index() * ElementSize;
  322. BitNumber += NextSetBitNumber;
  323. }
  324. }
  325. }
  326. public:
  327. // Preincrement.
  328. inline SparseBitVectorIterator& operator++() {
  329. ++BitNumber;
  330. Bits >>= 1;
  331. AdvanceToNextNonZero();
  332. return *this;
  333. }
  334. // Postincrement.
  335. inline SparseBitVectorIterator operator++(int) {
  336. SparseBitVectorIterator tmp = *this;
  337. ++*this;
  338. return tmp;
  339. }
  340. // Return the current set bit number.
  341. unsigned operator*() const {
  342. return BitNumber;
  343. }
  344. bool operator==(const SparseBitVectorIterator &RHS) const {
  345. // If they are both at the end, ignore the rest of the fields.
  346. if (AtEnd && RHS.AtEnd)
  347. return true;
  348. // Otherwise they are the same if they have the same bit number and
  349. // bitmap.
  350. return AtEnd == RHS.AtEnd && RHS.BitNumber == BitNumber;
  351. }
  352. bool operator!=(const SparseBitVectorIterator &RHS) const {
  353. return !(*this == RHS);
  354. }
  355. SparseBitVectorIterator(): BitVector(NULL) {
  356. }
  357. SparseBitVectorIterator(const SparseBitVector<ElementSize> *RHS,
  358. bool end = false):BitVector(RHS) {
  359. Iter = BitVector->Elements.begin();
  360. BitNumber = 0;
  361. Bits = 0;
  362. WordNumber = ~0;
  363. AtEnd = end;
  364. AdvanceToFirstNonZero();
  365. }
  366. };
  367. public:
  368. typedef SparseBitVectorIterator iterator;
  369. SparseBitVector () {
  370. CurrElementIter = Elements.begin ();
  371. }
  372. ~SparseBitVector() {
  373. }
  374. // SparseBitVector copy ctor.
  375. SparseBitVector(const SparseBitVector &RHS) {
  376. ElementListConstIter ElementIter = RHS.Elements.begin();
  377. while (ElementIter != RHS.Elements.end()) {
  378. Elements.push_back(SparseBitVectorElement<ElementSize>(*ElementIter));
  379. ++ElementIter;
  380. }
  381. CurrElementIter = Elements.begin ();
  382. }
  383. // Clear.
  384. void clear() {
  385. Elements.clear();
  386. }
  387. // Assignment
  388. SparseBitVector& operator=(const SparseBitVector& RHS) {
  389. Elements.clear();
  390. ElementListConstIter ElementIter = RHS.Elements.begin();
  391. while (ElementIter != RHS.Elements.end()) {
  392. Elements.push_back(SparseBitVectorElement<ElementSize>(*ElementIter));
  393. ++ElementIter;
  394. }
  395. CurrElementIter = Elements.begin ();
  396. return *this;
  397. }
  398. // Test, Reset, and Set a bit in the bitmap.
  399. bool test(unsigned Idx) {
  400. if (Elements.empty())
  401. return false;
  402. unsigned ElementIndex = Idx / ElementSize;
  403. ElementListIter ElementIter = FindLowerBound(ElementIndex);
  404. // If we can't find an element that is supposed to contain this bit, there
  405. // is nothing more to do.
  406. if (ElementIter == Elements.end() ||
  407. ElementIter->index() != ElementIndex)
  408. return false;
  409. return ElementIter->test(Idx % ElementSize);
  410. }
  411. void reset(unsigned Idx) {
  412. if (Elements.empty())
  413. return;
  414. unsigned ElementIndex = Idx / ElementSize;
  415. ElementListIter ElementIter = FindLowerBound(ElementIndex);
  416. // If we can't find an element that is supposed to contain this bit, there
  417. // is nothing more to do.
  418. if (ElementIter == Elements.end() ||
  419. ElementIter->index() != ElementIndex)
  420. return;
  421. ElementIter->reset(Idx % ElementSize);
  422. // When the element is zeroed out, delete it.
  423. if (ElementIter->empty()) {
  424. ++CurrElementIter;
  425. Elements.erase(ElementIter);
  426. }
  427. }
  428. void set(unsigned Idx) {
  429. unsigned ElementIndex = Idx / ElementSize;
  430. SparseBitVectorElement<ElementSize> *Element;
  431. ElementListIter ElementIter;
  432. if (Elements.empty()) {
  433. Element = new SparseBitVectorElement<ElementSize>(ElementIndex);
  434. ElementIter = Elements.insert(Elements.end(), Element);
  435. } else {
  436. ElementIter = FindLowerBound(ElementIndex);
  437. if (ElementIter == Elements.end() ||
  438. ElementIter->index() != ElementIndex) {
  439. Element = new SparseBitVectorElement<ElementSize>(ElementIndex);
  440. // We may have hit the beginning of our SparseBitVector, in which case,
  441. // we may need to insert right after this element, which requires moving
  442. // the current iterator forward one, because insert does insert before.
  443. if (ElementIter != Elements.end() &&
  444. ElementIter->index() < ElementIndex)
  445. ElementIter = Elements.insert(++ElementIter, Element);
  446. else
  447. ElementIter = Elements.insert(ElementIter, Element);
  448. }
  449. }
  450. CurrElementIter = ElementIter;
  451. ElementIter->set(Idx % ElementSize);
  452. }
  453. bool test_and_set (unsigned Idx) {
  454. bool old = test(Idx);
  455. if (!old) {
  456. set(Idx);
  457. return true;
  458. }
  459. return false;
  460. }
  461. bool operator!=(const SparseBitVector &RHS) const {
  462. return !(*this == RHS);
  463. }
  464. bool operator==(const SparseBitVector &RHS) const {
  465. ElementListConstIter Iter1 = Elements.begin();
  466. ElementListConstIter Iter2 = RHS.Elements.begin();
  467. for (; Iter1 != Elements.end() && Iter2 != RHS.Elements.end();
  468. ++Iter1, ++Iter2) {
  469. if (*Iter1 != *Iter2)
  470. return false;
  471. }
  472. return Iter1 == Elements.end() && Iter2 == RHS.Elements.end();
  473. }
  474. // Union our bitmap with the RHS and return true if we changed.
  475. bool operator|=(const SparseBitVector &RHS) {
  476. bool changed = false;
  477. ElementListIter Iter1 = Elements.begin();
  478. ElementListConstIter Iter2 = RHS.Elements.begin();
  479. // If RHS is empty, we are done
  480. if (RHS.Elements.empty())
  481. return false;
  482. while (Iter2 != RHS.Elements.end()) {
  483. if (Iter1 == Elements.end() || Iter1->index() > Iter2->index()) {
  484. Elements.insert(Iter1,
  485. new SparseBitVectorElement<ElementSize>(*Iter2));
  486. ++Iter2;
  487. changed = true;
  488. } else if (Iter1->index() == Iter2->index()) {
  489. changed |= Iter1->unionWith(*Iter2);
  490. ++Iter1;
  491. ++Iter2;
  492. } else {
  493. ++Iter1;
  494. }
  495. }
  496. CurrElementIter = Elements.begin();
  497. return changed;
  498. }
  499. // Intersect our bitmap with the RHS and return true if ours changed.
  500. bool operator&=(const SparseBitVector &RHS) {
  501. bool changed = false;
  502. ElementListIter Iter1 = Elements.begin();
  503. ElementListConstIter Iter2 = RHS.Elements.begin();
  504. // Check if both bitmaps are empty.
  505. if (Elements.empty() && RHS.Elements.empty())
  506. return false;
  507. // Loop through, intersecting as we go, erasing elements when necessary.
  508. while (Iter2 != RHS.Elements.end()) {
  509. if (Iter1 == Elements.end()) {
  510. CurrElementIter = Elements.begin();
  511. return changed;
  512. }
  513. if (Iter1->index() > Iter2->index()) {
  514. ++Iter2;
  515. } else if (Iter1->index() == Iter2->index()) {
  516. bool BecameZero;
  517. changed |= Iter1->intersectWith(*Iter2, BecameZero);
  518. if (BecameZero) {
  519. ElementListIter IterTmp = Iter1;
  520. ++Iter1;
  521. Elements.erase(IterTmp);
  522. } else {
  523. ++Iter1;
  524. }
  525. ++Iter2;
  526. } else {
  527. ElementListIter IterTmp = Iter1;
  528. ++Iter1;
  529. Elements.erase(IterTmp);
  530. }
  531. }
  532. Elements.erase(Iter1, Elements.end());
  533. CurrElementIter = Elements.begin();
  534. return changed;
  535. }
  536. // Intersect our bitmap with the complement of the RHS and return true
  537. // if ours changed.
  538. bool intersectWithComplement(const SparseBitVector &RHS) {
  539. bool changed = false;
  540. ElementListIter Iter1 = Elements.begin();
  541. ElementListConstIter Iter2 = RHS.Elements.begin();
  542. // If either our bitmap or RHS is empty, we are done
  543. if (Elements.empty() || RHS.Elements.empty())
  544. return false;
  545. // Loop through, intersecting as we go, erasing elements when necessary.
  546. while (Iter2 != RHS.Elements.end()) {
  547. if (Iter1 == Elements.end()) {
  548. CurrElementIter = Elements.begin();
  549. return changed;
  550. }
  551. if (Iter1->index() > Iter2->index()) {
  552. ++Iter2;
  553. } else if (Iter1->index() == Iter2->index()) {
  554. bool BecameZero;
  555. changed |= Iter1->intersectWithComplement(*Iter2, BecameZero);
  556. if (BecameZero) {
  557. ElementListIter IterTmp = Iter1;
  558. ++Iter1;
  559. Elements.erase(IterTmp);
  560. } else {
  561. ++Iter1;
  562. }
  563. ++Iter2;
  564. } else {
  565. ++Iter1;
  566. }
  567. }
  568. CurrElementIter = Elements.begin();
  569. return changed;
  570. }
  571. bool intersectWithComplement(const SparseBitVector<ElementSize> *RHS) const {
  572. return intersectWithComplement(*RHS);
  573. }
  574. // Three argument version of intersectWithComplement.
  575. // Result of RHS1 & ~RHS2 is stored into this bitmap.
  576. void intersectWithComplement(const SparseBitVector<ElementSize> &RHS1,
  577. const SparseBitVector<ElementSize> &RHS2)
  578. {
  579. Elements.clear();
  580. CurrElementIter = Elements.begin();
  581. ElementListConstIter Iter1 = RHS1.Elements.begin();
  582. ElementListConstIter Iter2 = RHS2.Elements.begin();
  583. // If RHS1 is empty, we are done
  584. // If RHS2 is empty, we still have to copy RHS1
  585. if (RHS1.Elements.empty())
  586. return;
  587. // Loop through, intersecting as we go, erasing elements when necessary.
  588. while (Iter2 != RHS2.Elements.end()) {
  589. if (Iter1 == RHS1.Elements.end())
  590. return;
  591. if (Iter1->index() > Iter2->index()) {
  592. ++Iter2;
  593. } else if (Iter1->index() == Iter2->index()) {
  594. bool BecameZero = false;
  595. SparseBitVectorElement<ElementSize> *NewElement =
  596. new SparseBitVectorElement<ElementSize>(Iter1->index());
  597. NewElement->intersectWithComplement(*Iter1, *Iter2, BecameZero);
  598. if (!BecameZero) {
  599. Elements.push_back(NewElement);
  600. }
  601. else
  602. delete NewElement;
  603. ++Iter1;
  604. ++Iter2;
  605. } else {
  606. SparseBitVectorElement<ElementSize> *NewElement =
  607. new SparseBitVectorElement<ElementSize>(*Iter1);
  608. Elements.push_back(NewElement);
  609. ++Iter1;
  610. }
  611. }
  612. // copy the remaining elements
  613. while (Iter1 != RHS1.Elements.end()) {
  614. SparseBitVectorElement<ElementSize> *NewElement =
  615. new SparseBitVectorElement<ElementSize>(*Iter1);
  616. Elements.push_back(NewElement);
  617. ++Iter1;
  618. }
  619. return;
  620. }
  621. void intersectWithComplement(const SparseBitVector<ElementSize> *RHS1,
  622. const SparseBitVector<ElementSize> *RHS2) {
  623. intersectWithComplement(*RHS1, *RHS2);
  624. }
  625. bool intersects(const SparseBitVector<ElementSize> *RHS) const {
  626. return intersects(*RHS);
  627. }
  628. // Return true if we share any bits in common with RHS
  629. bool intersects(const SparseBitVector<ElementSize> &RHS) const {
  630. ElementListConstIter Iter1 = Elements.begin();
  631. ElementListConstIter Iter2 = RHS.Elements.begin();
  632. // Check if both bitmaps are empty.
  633. if (Elements.empty() && RHS.Elements.empty())
  634. return false;
  635. // Loop through, intersecting stopping when we hit bits in common.
  636. while (Iter2 != RHS.Elements.end()) {
  637. if (Iter1 == Elements.end())
  638. return false;
  639. if (Iter1->index() > Iter2->index()) {
  640. ++Iter2;
  641. } else if (Iter1->index() == Iter2->index()) {
  642. if (Iter1->intersects(*Iter2))
  643. return true;
  644. ++Iter1;
  645. ++Iter2;
  646. } else {
  647. ++Iter1;
  648. }
  649. }
  650. return false;
  651. }
  652. // Return true iff all bits set in this SparseBitVector are
  653. // also set in RHS.
  654. bool contains(const SparseBitVector<ElementSize> &RHS) const {
  655. SparseBitVector<ElementSize> Result(*this);
  656. Result &= RHS;
  657. return (Result == RHS);
  658. }
  659. // Return the first set bit in the bitmap. Return -1 if no bits are set.
  660. int find_first() const {
  661. if (Elements.empty())
  662. return -1;
  663. const SparseBitVectorElement<ElementSize> &First = *(Elements.begin());
  664. return (First.index() * ElementSize) + First.find_first();
  665. }
  666. // Return true if the SparseBitVector is empty
  667. bool empty() const {
  668. return Elements.empty();
  669. }
  670. unsigned count() const {
  671. unsigned BitCount = 0;
  672. for (ElementListConstIter Iter = Elements.begin();
  673. Iter != Elements.end();
  674. ++Iter)
  675. BitCount += Iter->count();
  676. return BitCount;
  677. }
  678. iterator begin() const {
  679. return iterator(this);
  680. }
  681. iterator end() const {
  682. return iterator(this, true);
  683. }
  684. };
  685. // Convenience functions to allow Or and And without dereferencing in the user
  686. // code.
  687. template <unsigned ElementSize>
  688. inline bool operator |=(SparseBitVector<ElementSize> &LHS,
  689. const SparseBitVector<ElementSize> *RHS) {
  690. return LHS |= *RHS;
  691. }
  692. template <unsigned ElementSize>
  693. inline bool operator |=(SparseBitVector<ElementSize> *LHS,
  694. const SparseBitVector<ElementSize> &RHS) {
  695. return LHS->operator|=(RHS);
  696. }
  697. template <unsigned ElementSize>
  698. inline bool operator &=(SparseBitVector<ElementSize> *LHS,
  699. const SparseBitVector<ElementSize> &RHS) {
  700. return LHS->operator&=(RHS);
  701. }
  702. template <unsigned ElementSize>
  703. inline bool operator &=(SparseBitVector<ElementSize> &LHS,
  704. const SparseBitVector<ElementSize> *RHS) {
  705. return LHS &= *RHS;
  706. }
  707. // Convenience functions for infix union, intersection, difference operators.
  708. template <unsigned ElementSize>
  709. inline SparseBitVector<ElementSize>
  710. operator|(const SparseBitVector<ElementSize> &LHS,
  711. const SparseBitVector<ElementSize> &RHS) {
  712. SparseBitVector<ElementSize> Result(LHS);
  713. Result |= RHS;
  714. return Result;
  715. }
  716. template <unsigned ElementSize>
  717. inline SparseBitVector<ElementSize>
  718. operator&(const SparseBitVector<ElementSize> &LHS,
  719. const SparseBitVector<ElementSize> &RHS) {
  720. SparseBitVector<ElementSize> Result(LHS);
  721. Result &= RHS;
  722. return Result;
  723. }
  724. template <unsigned ElementSize>
  725. inline SparseBitVector<ElementSize>
  726. operator-(const SparseBitVector<ElementSize> &LHS,
  727. const SparseBitVector<ElementSize> &RHS) {
  728. SparseBitVector<ElementSize> Result;
  729. Result.intersectWithComplement(LHS, RHS);
  730. return Result;
  731. }
  732. // Dump a SparseBitVector to a stream
  733. template <unsigned ElementSize>
  734. void dump(const SparseBitVector<ElementSize> &LHS, raw_ostream &out) {
  735. out << "[";
  736. typename SparseBitVector<ElementSize>::iterator bi = LHS.begin(),
  737. be = LHS.end();
  738. if (bi != be) {
  739. out << *bi;
  740. for (++bi; bi != be; ++bi) {
  741. out << " " << *bi;
  742. }
  743. }
  744. out << "]\n";
  745. }
  746. } // end namespace llvm
  747. #endif