Home | History | Annotate | Download | only in ADT
      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 
     14 #include "gtest/gtest.h"
     15 #include "llvm/ADT/SmallPtrSet.h"
     16 
     17 using namespace llvm;
     18 
     19 TEST(SmallPtrSetTest, Assignment) {
     20   int buf[8];
     21   for (int i = 0; i < 8; ++i)
     22     buf[i] = 0;
     23 
     24   SmallPtrSet<int *, 4> s1;
     25   s1.insert(&buf[0]);
     26   s1.insert(&buf[1]);
     27 
     28   SmallPtrSet<int *, 4> s2;
     29   (s2 = s1).insert(&buf[2]);
     30 
     31   // Self assign as well.
     32   (s2 = s2).insert(&buf[3]);
     33 
     34   s1 = s2;
     35   EXPECT_EQ(4U, s1.size());
     36   for (int i = 0; i < 8; ++i)
     37     if (i < 4)
     38       EXPECT_TRUE(s1.count(&buf[i]));
     39     else
     40       EXPECT_FALSE(s1.count(&buf[i]));
     41 }
     42 
     43 TEST(SmallPtrSetTest, GrowthTest) {
     44   int i;
     45   int buf[8];
     46   for(i=0; i<8; ++i) buf[i]=0;
     47 
     48 
     49   SmallPtrSet<int *, 4> s;
     50   typedef SmallPtrSet<int *, 4>::iterator iter;
     51 
     52   s.insert(&buf[0]);
     53   s.insert(&buf[1]);
     54   s.insert(&buf[2]);
     55   s.insert(&buf[3]);
     56   EXPECT_EQ(4U, s.size());
     57 
     58   i = 0;
     59   for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
     60       (**I)++;
     61   EXPECT_EQ(4, i);
     62   for(i=0; i<8; ++i)
     63       EXPECT_EQ(i<4?1:0,buf[i]);
     64 
     65   s.insert(&buf[4]);
     66   s.insert(&buf[5]);
     67   s.insert(&buf[6]);
     68   s.insert(&buf[7]);
     69 
     70   i = 0;
     71   for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
     72       (**I)++;
     73   EXPECT_EQ(8, i);
     74   s.erase(&buf[4]);
     75   s.erase(&buf[5]);
     76   s.erase(&buf[6]);
     77   s.erase(&buf[7]);
     78   EXPECT_EQ(4U, s.size());
     79 
     80   i = 0;
     81   for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
     82       (**I)++;
     83   EXPECT_EQ(4, i);
     84   for(i=0; i<8; ++i)
     85       EXPECT_EQ(i<4?3:1,buf[i]);
     86 
     87   s.clear();
     88   for(i=0; i<8; ++i) buf[i]=0;
     89   for(i=0; i<128; ++i) s.insert(&buf[i%8]); // test repeated entires
     90   EXPECT_EQ(8U, s.size());
     91   for(iter I=s.begin(), E=s.end(); I!=E; ++I, ++i)
     92       (**I)++;
     93   for(i=0; i<8; ++i)
     94       EXPECT_EQ(1,buf[i]);
     95 }
     96 
     97 TEST(SmallPtrSetTest, CopyAndMoveTest) {
     98   int buf[8];
     99   for (int i = 0; i < 8; ++i)
    100     buf[i] = 0;
    101 
    102   SmallPtrSet<int *, 4> s1;
    103   s1.insert(&buf[0]);
    104   s1.insert(&buf[1]);
    105   s1.insert(&buf[2]);
    106   s1.insert(&buf[3]);
    107   EXPECT_EQ(4U, s1.size());
    108   for (int i = 0; i < 8; ++i)
    109     if (i < 4)
    110       EXPECT_TRUE(s1.count(&buf[i]));
    111     else
    112       EXPECT_FALSE(s1.count(&buf[i]));
    113 
    114   SmallPtrSet<int *, 4> s2(s1);
    115   EXPECT_EQ(4U, s2.size());
    116   for (int i = 0; i < 8; ++i)
    117     if (i < 4)
    118       EXPECT_TRUE(s2.count(&buf[i]));
    119     else
    120       EXPECT_FALSE(s2.count(&buf[i]));
    121 
    122   s1 = s2;
    123   EXPECT_EQ(4U, s1.size());
    124   EXPECT_EQ(4U, s2.size());
    125   for (int i = 0; i < 8; ++i)
    126     if (i < 4)
    127       EXPECT_TRUE(s1.count(&buf[i]));
    128     else
    129       EXPECT_FALSE(s1.count(&buf[i]));
    130 
    131   SmallPtrSet<int *, 4> s3(std::move(s1));
    132   EXPECT_EQ(4U, s3.size());
    133   EXPECT_TRUE(s1.empty());
    134   for (int i = 0; i < 8; ++i)
    135     if (i < 4)
    136       EXPECT_TRUE(s3.count(&buf[i]));
    137     else
    138       EXPECT_FALSE(s3.count(&buf[i]));
    139 
    140   // Move assign into the moved-from object. Also test move of a non-small
    141   // container.
    142   s3.insert(&buf[4]);
    143   s3.insert(&buf[5]);
    144   s3.insert(&buf[6]);
    145   s3.insert(&buf[7]);
    146   s1 = std::move(s3);
    147   EXPECT_EQ(8U, s1.size());
    148   EXPECT_TRUE(s3.empty());
    149   for (int i = 0; i < 8; ++i)
    150     EXPECT_TRUE(s1.count(&buf[i]));
    151 
    152   // Copy assign into a moved-from object.
    153   s3 = s1;
    154   EXPECT_EQ(8U, s3.size());
    155   EXPECT_EQ(8U, s1.size());
    156   for (int i = 0; i < 8; ++i)
    157     EXPECT_TRUE(s3.count(&buf[i]));
    158 }
    159 
    160 TEST(SmallPtrSetTest, SwapTest) {
    161   int buf[10];
    162 
    163   SmallPtrSet<int *, 2> a;
    164   SmallPtrSet<int *, 2> b;
    165 
    166   a.insert(&buf[0]);
    167   a.insert(&buf[1]);
    168   b.insert(&buf[2]);
    169 
    170   EXPECT_EQ(2U, a.size());
    171   EXPECT_EQ(1U, b.size());
    172   EXPECT_TRUE(a.count(&buf[0]));
    173   EXPECT_TRUE(a.count(&buf[1]));
    174   EXPECT_FALSE(a.count(&buf[2]));
    175   EXPECT_FALSE(a.count(&buf[3]));
    176   EXPECT_FALSE(b.count(&buf[0]));
    177   EXPECT_FALSE(b.count(&buf[1]));
    178   EXPECT_TRUE(b.count(&buf[2]));
    179   EXPECT_FALSE(b.count(&buf[3]));
    180 
    181   std::swap(a, b);
    182 
    183   EXPECT_EQ(1U, a.size());
    184   EXPECT_EQ(2U, b.size());
    185   EXPECT_FALSE(a.count(&buf[0]));
    186   EXPECT_FALSE(a.count(&buf[1]));
    187   EXPECT_TRUE(a.count(&buf[2]));
    188   EXPECT_FALSE(a.count(&buf[3]));
    189   EXPECT_TRUE(b.count(&buf[0]));
    190   EXPECT_TRUE(b.count(&buf[1]));
    191   EXPECT_FALSE(b.count(&buf[2]));
    192   EXPECT_FALSE(b.count(&buf[3]));
    193 
    194   b.insert(&buf[3]);
    195   std::swap(a, b);
    196 
    197   EXPECT_EQ(3U, a.size());
    198   EXPECT_EQ(1U, b.size());
    199   EXPECT_TRUE(a.count(&buf[0]));
    200   EXPECT_TRUE(a.count(&buf[1]));
    201   EXPECT_FALSE(a.count(&buf[2]));
    202   EXPECT_TRUE(a.count(&buf[3]));
    203   EXPECT_FALSE(b.count(&buf[0]));
    204   EXPECT_FALSE(b.count(&buf[1]));
    205   EXPECT_TRUE(b.count(&buf[2]));
    206   EXPECT_FALSE(b.count(&buf[3]));
    207 
    208   std::swap(a, b);
    209 
    210   EXPECT_EQ(1U, a.size());
    211   EXPECT_EQ(3U, b.size());
    212   EXPECT_FALSE(a.count(&buf[0]));
    213   EXPECT_FALSE(a.count(&buf[1]));
    214   EXPECT_TRUE(a.count(&buf[2]));
    215   EXPECT_FALSE(a.count(&buf[3]));
    216   EXPECT_TRUE(b.count(&buf[0]));
    217   EXPECT_TRUE(b.count(&buf[1]));
    218   EXPECT_FALSE(b.count(&buf[2]));
    219   EXPECT_TRUE(b.count(&buf[3]));
    220 
    221   a.insert(&buf[4]);
    222   a.insert(&buf[5]);
    223   a.insert(&buf[6]);
    224 
    225   std::swap(b, a);
    226 
    227   EXPECT_EQ(3U, a.size());
    228   EXPECT_EQ(4U, b.size());
    229   EXPECT_TRUE(b.count(&buf[2]));
    230   EXPECT_TRUE(b.count(&buf[4]));
    231   EXPECT_TRUE(b.count(&buf[5]));
    232   EXPECT_TRUE(b.count(&buf[6]));
    233   EXPECT_TRUE(a.count(&buf[0]));
    234   EXPECT_TRUE(a.count(&buf[1]));
    235   EXPECT_TRUE(a.count(&buf[3]));
    236 }
    237 
    238 void checkEraseAndIterators(SmallPtrSetImpl<int*> &S) {
    239   int buf[3];
    240 
    241   S.insert(&buf[0]);
    242   S.insert(&buf[1]);
    243   S.insert(&buf[2]);
    244 
    245   // Iterators must still be valid after erase() calls;
    246   auto B = S.begin();
    247   auto M = std::next(B);
    248   auto E = S.end();
    249   EXPECT_TRUE(*B == &buf[0] || *B == &buf[1] || *B == &buf[2]);
    250   EXPECT_TRUE(*M == &buf[0] || *M == &buf[1] || *M == &buf[2]);
    251   EXPECT_TRUE(*B != *M);
    252   int *Removable = *std::next(M);
    253   // No iterator points to Removable now.
    254   EXPECT_TRUE(Removable == &buf[0] || Removable == &buf[1] ||
    255               Removable == &buf[2]);
    256   EXPECT_TRUE(Removable != *B && Removable != *M);
    257 
    258   S.erase(Removable);
    259 
    260   // B,M,E iterators should still be valid
    261   EXPECT_EQ(B, S.begin());
    262   EXPECT_EQ(M, std::next(B));
    263   EXPECT_EQ(E, S.end());
    264   EXPECT_EQ(std::next(M), E);
    265 }
    266 
    267 TEST(SmallPtrSetTest, EraseTest) {
    268   // Test when set stays small.
    269   SmallPtrSet<int *, 8> B;
    270   checkEraseAndIterators(B);
    271 
    272   // Test when set grows big.
    273   SmallPtrSet<int *, 2> A;
    274   checkEraseAndIterators(A);
    275 }
    276