Home | History | Annotate | Download | only in ADT
      1 //===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
      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 // Some of these tests fail on PowerPC for unknown reasons.
     11 #ifndef __ppc__
     12 
     13 #include "llvm/ADT/BitVector.h"
     14 #include "gtest/gtest.h"
     15 
     16 using namespace llvm;
     17 
     18 namespace {
     19 
     20 TEST(BitVectorTest, TrivialOperation) {
     21   BitVector Vec;
     22   EXPECT_EQ(0U, Vec.count());
     23   EXPECT_EQ(0U, Vec.size());
     24   EXPECT_FALSE(Vec.any());
     25   EXPECT_TRUE(Vec.all());
     26   EXPECT_TRUE(Vec.none());
     27   EXPECT_TRUE(Vec.empty());
     28 
     29   Vec.resize(5, true);
     30   EXPECT_EQ(5U, Vec.count());
     31   EXPECT_EQ(5U, Vec.size());
     32   EXPECT_TRUE(Vec.any());
     33   EXPECT_TRUE(Vec.all());
     34   EXPECT_FALSE(Vec.none());
     35   EXPECT_FALSE(Vec.empty());
     36 
     37   Vec.resize(11);
     38   EXPECT_EQ(5U, Vec.count());
     39   EXPECT_EQ(11U, Vec.size());
     40   EXPECT_TRUE(Vec.any());
     41   EXPECT_FALSE(Vec.all());
     42   EXPECT_FALSE(Vec.none());
     43   EXPECT_FALSE(Vec.empty());
     44 
     45   BitVector Inv = ~Vec;
     46   EXPECT_EQ(6U, Inv.count());
     47   EXPECT_EQ(11U, Inv.size());
     48   EXPECT_TRUE(Inv.any());
     49   EXPECT_FALSE(Inv.all());
     50   EXPECT_FALSE(Inv.none());
     51   EXPECT_FALSE(Inv.empty());
     52 
     53   EXPECT_FALSE(Inv == Vec);
     54   EXPECT_TRUE(Inv != Vec);
     55   Vec = ~Vec;
     56   EXPECT_TRUE(Inv == Vec);
     57   EXPECT_FALSE(Inv != Vec);
     58 
     59   // Add some "interesting" data to Vec.
     60   Vec.resize(23, true);
     61   Vec.resize(25, false);
     62   Vec.resize(26, true);
     63   Vec.resize(29, false);
     64   Vec.resize(33, true);
     65   Vec.resize(57, false);
     66   unsigned Count = 0;
     67   for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
     68     ++Count;
     69     EXPECT_TRUE(Vec[i]);
     70     EXPECT_TRUE(Vec.test(i));
     71   }
     72   EXPECT_EQ(Count, Vec.count());
     73   EXPECT_EQ(Count, 23u);
     74   EXPECT_FALSE(Vec[0]);
     75   EXPECT_TRUE(Vec[32]);
     76   EXPECT_FALSE(Vec[56]);
     77   Vec.resize(61, false);
     78 
     79   BitVector Copy = Vec;
     80   BitVector Alt(3, false);
     81   Alt.resize(6, true);
     82   std::swap(Alt, Vec);
     83   EXPECT_TRUE(Copy == Alt);
     84   EXPECT_TRUE(Vec.size() == 6);
     85   EXPECT_TRUE(Vec.count() == 3);
     86   EXPECT_TRUE(Vec.find_first() == 3);
     87   std::swap(Copy, Vec);
     88 
     89   // Add some more "interesting" data.
     90   Vec.resize(68, true);
     91   Vec.resize(78, false);
     92   Vec.resize(89, true);
     93   Vec.resize(90, false);
     94   Vec.resize(91, true);
     95   Vec.resize(130, false);
     96   Count = 0;
     97   for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
     98     ++Count;
     99     EXPECT_TRUE(Vec[i]);
    100     EXPECT_TRUE(Vec.test(i));
    101   }
    102   EXPECT_EQ(Count, Vec.count());
    103   EXPECT_EQ(Count, 42u);
    104   EXPECT_FALSE(Vec[0]);
    105   EXPECT_TRUE(Vec[32]);
    106   EXPECT_FALSE(Vec[60]);
    107   EXPECT_FALSE(Vec[129]);
    108 
    109   Vec.flip(60);
    110   EXPECT_TRUE(Vec[60]);
    111   EXPECT_EQ(Count + 1, Vec.count());
    112   Vec.flip(60);
    113   EXPECT_FALSE(Vec[60]);
    114   EXPECT_EQ(Count, Vec.count());
    115 
    116   Vec.reset(32);
    117   EXPECT_FALSE(Vec[32]);
    118   EXPECT_EQ(Count - 1, Vec.count());
    119   Vec.set(32);
    120   EXPECT_TRUE(Vec[32]);
    121   EXPECT_EQ(Count, Vec.count());
    122 
    123   Vec.flip();
    124   EXPECT_EQ(Vec.size() - Count, Vec.count());
    125 
    126   Vec.reset();
    127   EXPECT_EQ(0U, Vec.count());
    128   EXPECT_EQ(130U, Vec.size());
    129   EXPECT_FALSE(Vec.any());
    130   EXPECT_FALSE(Vec.all());
    131   EXPECT_TRUE(Vec.none());
    132   EXPECT_FALSE(Vec.empty());
    133 
    134   Inv = ~BitVector();
    135   EXPECT_EQ(0U, Inv.count());
    136   EXPECT_EQ(0U, Inv.size());
    137   EXPECT_FALSE(Inv.any());
    138   EXPECT_TRUE(Inv.all());
    139   EXPECT_TRUE(Inv.none());
    140   EXPECT_TRUE(Inv.empty());
    141 
    142   Vec.clear();
    143   EXPECT_EQ(0U, Vec.count());
    144   EXPECT_EQ(0U, Vec.size());
    145   EXPECT_FALSE(Vec.any());
    146   EXPECT_TRUE(Vec.all());
    147   EXPECT_TRUE(Vec.none());
    148   EXPECT_TRUE(Vec.empty());
    149 }
    150 
    151 TEST(BitVectorTest, CompoundAssignment) {
    152   BitVector A;
    153   A.resize(10);
    154   A.set(4);
    155   A.set(7);
    156 
    157   BitVector B;
    158   B.resize(50);
    159   B.set(5);
    160   B.set(18);
    161 
    162   A |= B;
    163   EXPECT_TRUE(A.test(4));
    164   EXPECT_TRUE(A.test(5));
    165   EXPECT_TRUE(A.test(7));
    166   EXPECT_TRUE(A.test(18));
    167   EXPECT_EQ(4U, A.count());
    168   EXPECT_EQ(50U, A.size());
    169 
    170   B.resize(10);
    171   B.set();
    172   B.reset(2);
    173   B.reset(7);
    174   A &= B;
    175   EXPECT_FALSE(A.test(2));
    176   EXPECT_FALSE(A.test(7));
    177   EXPECT_EQ(2U, A.count());
    178   EXPECT_EQ(50U, A.size());
    179 
    180   B.resize(100);
    181   B.set();
    182 
    183   A ^= B;
    184   EXPECT_TRUE(A.test(2));
    185   EXPECT_TRUE(A.test(7));
    186   EXPECT_EQ(98U, A.count());
    187   EXPECT_EQ(100U, A.size());
    188 }
    189 
    190 TEST(BitVectorTest, ProxyIndex) {
    191   BitVector Vec(3);
    192   EXPECT_TRUE(Vec.none());
    193   Vec[0] = Vec[1] = Vec[2] = true;
    194   EXPECT_EQ(Vec.size(), Vec.count());
    195   Vec[2] = Vec[1] = Vec[0] = false;
    196   EXPECT_TRUE(Vec.none());
    197 }
    198 
    199 TEST(BitVectorTest, PortableBitMask) {
    200   BitVector A;
    201   const uint32_t Mask1[] = { 0x80000000, 6, 5 };
    202 
    203   A.resize(10);
    204   A.setBitsInMask(Mask1, 3);
    205   EXPECT_EQ(10u, A.size());
    206   EXPECT_FALSE(A.test(0));
    207 
    208   A.resize(32);
    209   A.setBitsInMask(Mask1, 3);
    210   EXPECT_FALSE(A.test(0));
    211   EXPECT_TRUE(A.test(31));
    212   EXPECT_EQ(1u, A.count());
    213 
    214   A.resize(33);
    215   A.setBitsInMask(Mask1, 1);
    216   EXPECT_EQ(1u, A.count());
    217   A.setBitsInMask(Mask1, 2);
    218   EXPECT_EQ(1u, A.count());
    219 
    220   A.resize(34);
    221   A.setBitsInMask(Mask1, 2);
    222   EXPECT_EQ(2u, A.count());
    223 
    224   A.resize(65);
    225   A.setBitsInMask(Mask1, 3);
    226   EXPECT_EQ(4u, A.count());
    227 
    228   A.setBitsNotInMask(Mask1, 1);
    229   EXPECT_EQ(32u+3u, A.count());
    230 
    231   A.setBitsNotInMask(Mask1, 3);
    232   EXPECT_EQ(65u, A.count());
    233 
    234   A.resize(96);
    235   EXPECT_EQ(65u, A.count());
    236 
    237   A.clear();
    238   A.resize(128);
    239   A.setBitsNotInMask(Mask1, 3);
    240   EXPECT_EQ(96u-5u, A.count());
    241 
    242   A.clearBitsNotInMask(Mask1, 1);
    243   EXPECT_EQ(64-4u, A.count());
    244 }
    245 }
    246 
    247 #endif
    248