SparseMultiSetTest.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. //===------ ADT/SparseSetTest.cpp - SparseSet 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/SparseMultiSet.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. typedef SparseMultiSet<unsigned> USet;
  14. // Empty set tests.
  15. TEST(SparseMultiSetTest, EmptySet) {
  16. USet Set;
  17. EXPECT_TRUE(Set.empty());
  18. EXPECT_EQ(0u, Set.size());
  19. Set.setUniverse(10);
  20. // Lookups on empty set.
  21. EXPECT_TRUE(Set.find(0) == Set.end());
  22. EXPECT_TRUE(Set.find(9) == Set.end());
  23. // Same thing on a const reference.
  24. const USet &CSet = Set;
  25. EXPECT_TRUE(CSet.empty());
  26. EXPECT_EQ(0u, CSet.size());
  27. EXPECT_TRUE(CSet.find(0) == CSet.end());
  28. USet::const_iterator I = CSet.find(5);
  29. EXPECT_TRUE(I == CSet.end());
  30. }
  31. // Single entry set tests.
  32. TEST(SparseMultiSetTest, SingleEntrySet) {
  33. USet Set;
  34. Set.setUniverse(10);
  35. USet::iterator I = Set.insert(5);
  36. EXPECT_TRUE(I != Set.end());
  37. EXPECT_TRUE(*I == 5);
  38. EXPECT_FALSE(Set.empty());
  39. EXPECT_EQ(1u, Set.size());
  40. EXPECT_TRUE(Set.find(0) == Set.end());
  41. EXPECT_TRUE(Set.find(9) == Set.end());
  42. EXPECT_FALSE(Set.contains(0));
  43. EXPECT_TRUE(Set.contains(5));
  44. // Extra insert.
  45. I = Set.insert(5);
  46. EXPECT_TRUE(I != Set.end());
  47. EXPECT_TRUE(I == ++Set.find(5));
  48. I--;
  49. EXPECT_TRUE(I == Set.find(5));
  50. // Erase non-existent element.
  51. I = Set.find(1);
  52. EXPECT_TRUE(I == Set.end());
  53. EXPECT_EQ(2u, Set.size());
  54. EXPECT_EQ(5u, *Set.find(5));
  55. // Erase iterator.
  56. I = Set.find(5);
  57. EXPECT_TRUE(I != Set.end());
  58. I = Set.erase(I);
  59. EXPECT_TRUE(I != Set.end());
  60. I = Set.erase(I);
  61. EXPECT_TRUE(I == Set.end());
  62. EXPECT_TRUE(Set.empty());
  63. }
  64. // Multiple entry set tests.
  65. TEST(SparseMultiSetTest, MultipleEntrySet) {
  66. USet Set;
  67. Set.setUniverse(10);
  68. Set.insert(5);
  69. Set.insert(5);
  70. Set.insert(5);
  71. Set.insert(3);
  72. Set.insert(2);
  73. Set.insert(1);
  74. Set.insert(4);
  75. EXPECT_EQ(7u, Set.size());
  76. // Erase last element by key.
  77. EXPECT_TRUE(Set.erase(Set.find(4)) == Set.end());
  78. EXPECT_EQ(6u, Set.size());
  79. EXPECT_FALSE(Set.contains(4));
  80. EXPECT_TRUE(Set.find(4) == Set.end());
  81. // Erase first element by key.
  82. EXPECT_EQ(3u, Set.count(5));
  83. EXPECT_TRUE(Set.find(5) != Set.end());
  84. EXPECT_TRUE(Set.erase(Set.find(5)) != Set.end());
  85. EXPECT_EQ(5u, Set.size());
  86. EXPECT_EQ(2u, Set.count(5));
  87. Set.insert(6);
  88. Set.insert(7);
  89. EXPECT_EQ(7u, Set.size());
  90. // Erase tail by iterator.
  91. EXPECT_TRUE(Set.getTail(6) == Set.getHead(6));
  92. USet::iterator I = Set.erase(Set.find(6));
  93. EXPECT_TRUE(I == Set.end());
  94. EXPECT_EQ(6u, Set.size());
  95. // Erase tails by iterator.
  96. EXPECT_EQ(2u, Set.count(5));
  97. I = Set.getTail(5);
  98. I = Set.erase(I);
  99. EXPECT_TRUE(I == Set.end());
  100. --I;
  101. EXPECT_EQ(1u, Set.count(5));
  102. EXPECT_EQ(5u, *I);
  103. I = Set.erase(I);
  104. EXPECT_TRUE(I == Set.end());
  105. EXPECT_EQ(0u, Set.count(5));
  106. Set.insert(8);
  107. Set.insert(8);
  108. Set.insert(8);
  109. Set.insert(8);
  110. Set.insert(8);
  111. // Erase all the 8s
  112. EXPECT_EQ(5, std::distance(Set.getHead(8), Set.end()));
  113. Set.eraseAll(8);
  114. EXPECT_EQ(0, std::distance(Set.getHead(8), Set.end()));
  115. // Clear and resize the universe.
  116. Set.clear();
  117. EXPECT_EQ(0u, Set.size());
  118. EXPECT_FALSE(Set.contains(3));
  119. Set.setUniverse(1000);
  120. // Add more than 256 elements.
  121. for (unsigned i = 100; i != 800; ++i)
  122. Set.insert(i);
  123. for (unsigned i = 0; i != 10; ++i)
  124. Set.eraseAll(i);
  125. for (unsigned i = 100; i != 800; ++i)
  126. EXPECT_EQ(1u, Set.count(i));
  127. EXPECT_FALSE(Set.contains(99));
  128. EXPECT_FALSE(Set.contains(800));
  129. EXPECT_EQ(700u, Set.size());
  130. }
  131. // Test out iterators
  132. TEST(SparseMultiSetTest, Iterators) {
  133. USet Set;
  134. Set.setUniverse(100);
  135. Set.insert(0);
  136. Set.insert(1);
  137. Set.insert(2);
  138. Set.insert(0);
  139. Set.insert(1);
  140. Set.insert(0);
  141. USet::RangePair RangePair = Set.equal_range(0);
  142. USet::iterator B = RangePair.first;
  143. USet::iterator E = RangePair.second;
  144. // Move the iterators around, going to end and coming back.
  145. EXPECT_EQ(3, std::distance(B, E));
  146. EXPECT_EQ(B, --(--(--E)));
  147. EXPECT_EQ(++(++(++E)), Set.end());
  148. EXPECT_EQ(B, --(--(--E)));
  149. EXPECT_EQ(++(++(++E)), Set.end());
  150. // Insert into the tail, and move around again
  151. Set.insert(0);
  152. EXPECT_EQ(B, --(--(--(--E))));
  153. EXPECT_EQ(++(++(++(++E))), Set.end());
  154. EXPECT_EQ(B, --(--(--(--E))));
  155. EXPECT_EQ(++(++(++(++E))), Set.end());
  156. // Erase a tail, and move around again
  157. USet::iterator Erased = Set.erase(Set.getTail(0));
  158. EXPECT_EQ(Erased, E);
  159. EXPECT_EQ(B, --(--(--E)));
  160. USet Set2;
  161. Set2.setUniverse(11);
  162. Set2.insert(3);
  163. EXPECT_TRUE(!Set2.contains(0));
  164. EXPECT_TRUE(!Set.contains(3));
  165. EXPECT_EQ(Set2.getHead(3), Set2.getTail(3));
  166. EXPECT_EQ(Set2.getHead(0), Set2.getTail(0));
  167. B = Set2.find(3);
  168. EXPECT_EQ(Set2.find(3), --(++B));
  169. }
  170. struct Alt {
  171. unsigned Value;
  172. explicit Alt(unsigned x) : Value(x) {}
  173. unsigned getSparseSetIndex() const { return Value - 1000; }
  174. };
  175. TEST(SparseMultiSetTest, AltStructSet) {
  176. typedef SparseMultiSet<Alt> ASet;
  177. ASet Set;
  178. Set.setUniverse(10);
  179. Set.insert(Alt(1005));
  180. ASet::iterator I = Set.find(5);
  181. ASSERT_TRUE(I != Set.end());
  182. EXPECT_EQ(1005u, I->Value);
  183. Set.insert(Alt(1006));
  184. Set.insert(Alt(1006));
  185. I = Set.erase(Set.find(6));
  186. ASSERT_TRUE(I != Set.end());
  187. EXPECT_EQ(1006u, I->Value);
  188. I = Set.erase(Set.find(6));
  189. ASSERT_TRUE(I == Set.end());
  190. EXPECT_TRUE(Set.contains(5));
  191. EXPECT_FALSE(Set.contains(6));
  192. }
  193. } // namespace