SmallPtrSetTest.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. //===- llvm/unittest/ADT/SmallPtrSetTest.cpp ------------------------------===//
  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. // SmallPtrSet unit tests.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "gtest/gtest.h"
  14. #include "llvm/ADT/SmallPtrSet.h"
  15. using namespace llvm;
  16. TEST(SmallPtrSetTest, Assignment) {
  17. int buf[8];
  18. for (int i = 0; i < 8; ++i)
  19. buf[i] = 0;
  20. SmallPtrSet<int *, 4> s1;
  21. s1.insert(&buf[0]);
  22. s1.insert(&buf[1]);
  23. SmallPtrSet<int *, 4> s2;
  24. (s2 = s1).insert(&buf[2]);
  25. // Self assign as well.
  26. (s2 = s2).insert(&buf[3]);
  27. s1 = s2;
  28. EXPECT_EQ(4U, s1.size());
  29. for (int i = 0; i < 8; ++i)
  30. if (i < 4)
  31. EXPECT_TRUE(s1.count(&buf[i]));
  32. else
  33. EXPECT_FALSE(s1.count(&buf[i]));
  34. }
  35. TEST(SmallPtrSetTest, GrowthTest) {
  36. int i;
  37. int buf[8];
  38. for(i=0; i<8; ++i) buf[i]=0;
  39. SmallPtrSet<int *, 4> s;
  40. typedef SmallPtrSet<int *, 4>::iterator iter;
  41. s.insert(&buf[0]);
  42. s.insert(&buf[1]);
  43. s.insert(&buf[2]);
  44. s.insert(&buf[3]);
  45. EXPECT_EQ(4U, s.size());
  46. i = 0;
  47. for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
  48. (**I)++;
  49. EXPECT_EQ(4, i);
  50. for(i=0; i<8; ++i)
  51. EXPECT_EQ(i<4?1:0,buf[i]);
  52. s.insert(&buf[4]);
  53. s.insert(&buf[5]);
  54. s.insert(&buf[6]);
  55. s.insert(&buf[7]);
  56. i = 0;
  57. for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
  58. (**I)++;
  59. EXPECT_EQ(8, i);
  60. s.erase(&buf[4]);
  61. s.erase(&buf[5]);
  62. s.erase(&buf[6]);
  63. s.erase(&buf[7]);
  64. EXPECT_EQ(4U, s.size());
  65. i = 0;
  66. for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
  67. (**I)++;
  68. EXPECT_EQ(4, i);
  69. for(i=0; i<8; ++i)
  70. EXPECT_EQ(i<4?3:1,buf[i]);
  71. s.clear();
  72. for(i=0; i<8; ++i) buf[i]=0;
  73. for(i=0; i<128; ++i) s.insert(&buf[i%8]); // test repeated entires
  74. EXPECT_EQ(8U, s.size());
  75. for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
  76. (**I)++;
  77. for(i=0; i<8; ++i)
  78. EXPECT_EQ(1,buf[i]);
  79. }
  80. TEST(SmallPtrSetTest, CopyAndMoveTest) {
  81. int buf[8];
  82. for (int i = 0; i < 8; ++i)
  83. buf[i] = 0;
  84. SmallPtrSet<int *, 4> s1;
  85. s1.insert(&buf[0]);
  86. s1.insert(&buf[1]);
  87. s1.insert(&buf[2]);
  88. s1.insert(&buf[3]);
  89. EXPECT_EQ(4U, s1.size());
  90. for (int i = 0; i < 8; ++i)
  91. if (i < 4)
  92. EXPECT_TRUE(s1.count(&buf[i]));
  93. else
  94. EXPECT_FALSE(s1.count(&buf[i]));
  95. SmallPtrSet<int *, 4> s2(s1);
  96. EXPECT_EQ(4U, s2.size());
  97. for (int i = 0; i < 8; ++i)
  98. if (i < 4)
  99. EXPECT_TRUE(s2.count(&buf[i]));
  100. else
  101. EXPECT_FALSE(s2.count(&buf[i]));
  102. s1 = s2;
  103. EXPECT_EQ(4U, s1.size());
  104. EXPECT_EQ(4U, s2.size());
  105. for (int i = 0; i < 8; ++i)
  106. if (i < 4)
  107. EXPECT_TRUE(s1.count(&buf[i]));
  108. else
  109. EXPECT_FALSE(s1.count(&buf[i]));
  110. SmallPtrSet<int *, 4> s3(std::move(s1));
  111. EXPECT_EQ(4U, s3.size());
  112. EXPECT_TRUE(s1.empty());
  113. for (int i = 0; i < 8; ++i)
  114. if (i < 4)
  115. EXPECT_TRUE(s3.count(&buf[i]));
  116. else
  117. EXPECT_FALSE(s3.count(&buf[i]));
  118. // Move assign into the moved-from object. Also test move of a non-small
  119. // container.
  120. s3.insert(&buf[4]);
  121. s3.insert(&buf[5]);
  122. s3.insert(&buf[6]);
  123. s3.insert(&buf[7]);
  124. s1 = std::move(s3);
  125. EXPECT_EQ(8U, s1.size());
  126. EXPECT_TRUE(s3.empty());
  127. for (int i = 0; i < 8; ++i)
  128. EXPECT_TRUE(s1.count(&buf[i]));
  129. // Copy assign into a moved-from object.
  130. s3 = s1;
  131. EXPECT_EQ(8U, s3.size());
  132. EXPECT_EQ(8U, s1.size());
  133. for (int i = 0; i < 8; ++i)
  134. EXPECT_TRUE(s3.count(&buf[i]));
  135. }
  136. TEST(SmallPtrSetTest, SwapTest) {
  137. int buf[10];
  138. SmallPtrSet<int *, 2> a;
  139. SmallPtrSet<int *, 2> b;
  140. a.insert(&buf[0]);
  141. a.insert(&buf[1]);
  142. b.insert(&buf[2]);
  143. std::swap(a, b);
  144. EXPECT_EQ(1U, a.size());
  145. EXPECT_EQ(2U, b.size());
  146. EXPECT_TRUE(a.count(&buf[2]));
  147. EXPECT_TRUE(b.count(&buf[0]));
  148. EXPECT_TRUE(b.count(&buf[1]));
  149. b.insert(&buf[3]);
  150. std::swap(a, b);
  151. EXPECT_EQ(3U, a.size());
  152. EXPECT_EQ(1U, b.size());
  153. EXPECT_TRUE(a.count(&buf[0]));
  154. EXPECT_TRUE(a.count(&buf[1]));
  155. EXPECT_TRUE(a.count(&buf[3]));
  156. EXPECT_TRUE(b.count(&buf[2]));
  157. std::swap(a, b);
  158. EXPECT_EQ(1U, a.size());
  159. EXPECT_EQ(3U, b.size());
  160. EXPECT_TRUE(a.count(&buf[2]));
  161. EXPECT_TRUE(b.count(&buf[0]));
  162. EXPECT_TRUE(b.count(&buf[1]));
  163. EXPECT_TRUE(b.count(&buf[3]));
  164. a.insert(&buf[4]);
  165. a.insert(&buf[5]);
  166. a.insert(&buf[6]);
  167. std::swap(b, a);
  168. EXPECT_EQ(3U, a.size());
  169. EXPECT_EQ(4U, b.size());
  170. EXPECT_TRUE(b.count(&buf[2]));
  171. EXPECT_TRUE(b.count(&buf[4]));
  172. EXPECT_TRUE(b.count(&buf[5]));
  173. EXPECT_TRUE(b.count(&buf[6]));
  174. EXPECT_TRUE(a.count(&buf[0]));
  175. EXPECT_TRUE(a.count(&buf[1]));
  176. EXPECT_TRUE(a.count(&buf[3]));
  177. }