SparseSetTest.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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/SparseSet.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. typedef SparseSet<unsigned> USet;
  14. // Empty set tests.
  15. TEST(SparseSetTest, EmptySet) {
  16. USet Set;
  17. EXPECT_TRUE(Set.empty());
  18. EXPECT_TRUE(Set.begin() == Set.end());
  19. EXPECT_EQ(0u, Set.size());
  20. Set.setUniverse(10);
  21. // Lookups on empty set.
  22. EXPECT_TRUE(Set.find(0) == Set.end());
  23. EXPECT_TRUE(Set.find(9) == Set.end());
  24. // Same thing on a const reference.
  25. const USet &CSet = Set;
  26. EXPECT_TRUE(CSet.empty());
  27. EXPECT_TRUE(CSet.begin() == CSet.end());
  28. EXPECT_EQ(0u, CSet.size());
  29. EXPECT_TRUE(CSet.find(0) == CSet.end());
  30. USet::const_iterator I = CSet.find(5);
  31. EXPECT_TRUE(I == CSet.end());
  32. }
  33. // Single entry set tests.
  34. TEST(SparseSetTest, SingleEntrySet) {
  35. USet Set;
  36. Set.setUniverse(10);
  37. std::pair<USet::iterator, bool> IP = Set.insert(5);
  38. EXPECT_TRUE(IP.second);
  39. EXPECT_TRUE(IP.first == Set.begin());
  40. EXPECT_FALSE(Set.empty());
  41. EXPECT_FALSE(Set.begin() == Set.end());
  42. EXPECT_TRUE(Set.begin() + 1 == Set.end());
  43. EXPECT_EQ(1u, Set.size());
  44. EXPECT_TRUE(Set.find(0) == Set.end());
  45. EXPECT_TRUE(Set.find(9) == Set.end());
  46. EXPECT_FALSE(Set.count(0));
  47. EXPECT_TRUE(Set.count(5));
  48. // Redundant insert.
  49. IP = Set.insert(5);
  50. EXPECT_FALSE(IP.second);
  51. EXPECT_TRUE(IP.first == Set.begin());
  52. // Erase non-existent element.
  53. EXPECT_FALSE(Set.erase(1));
  54. EXPECT_EQ(1u, Set.size());
  55. EXPECT_EQ(5u, *Set.begin());
  56. // Erase iterator.
  57. USet::iterator I = Set.find(5);
  58. EXPECT_TRUE(I == Set.begin());
  59. I = Set.erase(I);
  60. EXPECT_TRUE(I == Set.end());
  61. EXPECT_TRUE(Set.empty());
  62. }
  63. // Multiple entry set tests.
  64. TEST(SparseSetTest, MultipleEntrySet) {
  65. USet Set;
  66. Set.setUniverse(10);
  67. Set.insert(5);
  68. Set.insert(3);
  69. Set.insert(2);
  70. Set.insert(1);
  71. Set.insert(4);
  72. EXPECT_EQ(5u, Set.size());
  73. // Without deletions, iteration order == insertion order.
  74. USet::const_iterator I = Set.begin();
  75. EXPECT_EQ(5u, *I);
  76. ++I;
  77. EXPECT_EQ(3u, *I);
  78. ++I;
  79. EXPECT_EQ(2u, *I);
  80. ++I;
  81. EXPECT_EQ(1u, *I);
  82. ++I;
  83. EXPECT_EQ(4u, *I);
  84. ++I;
  85. EXPECT_TRUE(I == Set.end());
  86. // Redundant insert.
  87. std::pair<USet::iterator, bool> IP = Set.insert(3);
  88. EXPECT_FALSE(IP.second);
  89. EXPECT_TRUE(IP.first == Set.begin() + 1);
  90. // Erase last element by key.
  91. EXPECT_TRUE(Set.erase(4));
  92. EXPECT_EQ(4u, Set.size());
  93. EXPECT_FALSE(Set.count(4));
  94. EXPECT_FALSE(Set.erase(4));
  95. EXPECT_EQ(4u, Set.size());
  96. EXPECT_FALSE(Set.count(4));
  97. // Erase first element by key.
  98. EXPECT_TRUE(Set.count(5));
  99. EXPECT_TRUE(Set.find(5) == Set.begin());
  100. EXPECT_TRUE(Set.erase(5));
  101. EXPECT_EQ(3u, Set.size());
  102. EXPECT_FALSE(Set.count(5));
  103. EXPECT_FALSE(Set.erase(5));
  104. EXPECT_EQ(3u, Set.size());
  105. EXPECT_FALSE(Set.count(5));
  106. Set.insert(6);
  107. Set.insert(7);
  108. EXPECT_EQ(5u, Set.size());
  109. // Erase last element by iterator.
  110. I = Set.erase(Set.end() - 1);
  111. EXPECT_TRUE(I == Set.end());
  112. EXPECT_EQ(4u, Set.size());
  113. // Erase second element by iterator.
  114. I = Set.erase(Set.begin() + 1);
  115. EXPECT_TRUE(I == Set.begin() + 1);
  116. // Clear and resize the universe.
  117. Set.clear();
  118. EXPECT_FALSE(Set.count(5));
  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.erase(i);
  125. for (unsigned i = 100; i != 800; ++i)
  126. EXPECT_TRUE(Set.count(i));
  127. EXPECT_FALSE(Set.count(99));
  128. EXPECT_FALSE(Set.count(800));
  129. EXPECT_EQ(700u, Set.size());
  130. }
  131. struct Alt {
  132. unsigned Value;
  133. explicit Alt(unsigned x) : Value(x) {}
  134. unsigned getSparseSetIndex() const { return Value - 1000; }
  135. };
  136. TEST(SparseSetTest, AltStructSet) {
  137. typedef SparseSet<Alt> ASet;
  138. ASet Set;
  139. Set.setUniverse(10);
  140. Set.insert(Alt(1005));
  141. ASet::iterator I = Set.find(5);
  142. ASSERT_TRUE(I == Set.begin());
  143. EXPECT_EQ(1005u, I->Value);
  144. Set.insert(Alt(1006));
  145. Set.insert(Alt(1006));
  146. I = Set.erase(Set.begin());
  147. ASSERT_TRUE(I == Set.begin());
  148. EXPECT_EQ(1006u, I->Value);
  149. EXPECT_FALSE(Set.erase(5));
  150. EXPECT_TRUE(Set.erase(6));
  151. }
  152. } // namespace