1cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===// 2cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// 3cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// The LLVM Compiler Infrastructure 4cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// 5cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// This file is distributed under the University of Illinois Open Source 6cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// License. See LICENSE.TXT for details. 7cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// 8cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===----------------------------------------------------------------------===// 9cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 103f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman// Some of these tests fail on PowerPC for unknown reasons. 11496cf2308acf4bb719a015517f27dff10db7de49Rafael Espindola#ifndef __ppc__ 123f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman 13cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "llvm/ADT/BitVector.h" 14904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer#include "llvm/ADT/SmallBitVector.h" 15cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "gtest/gtest.h" 16cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 17cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmanusing namespace llvm; 18cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 19cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmannamespace { 20cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 21904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer// Test fixture 22904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramertemplate <typename T> 23904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramerclass BitVectorTest : public ::testing::Test { }; 24904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer 25904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer// Test both BitVector and SmallBitVector with the same suite of tests. 26904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramertypedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes; 27904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes); 28904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer 29904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, TrivialOperation) { 30904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam Vec; 31cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Vec.count()); 32cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Vec.size()); 33cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.any()); 34fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_TRUE(Vec.all()); 35cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.none()); 36cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.empty()); 37cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 38cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(5, true); 39cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(5U, Vec.count()); 40cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(5U, Vec.size()); 41cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.any()); 42fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_TRUE(Vec.all()); 43cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.none()); 44cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.empty()); 45cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 46cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(11); 47cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(5U, Vec.count()); 48cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(11U, Vec.size()); 49cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.any()); 50fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_FALSE(Vec.all()); 51cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.none()); 52cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.empty()); 53cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 54904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam Inv = Vec; 5500570224891da83c5066b8d135232f96786dbd56Jakob Stoklund Olesen Inv.flip(); 56cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(6U, Inv.count()); 57cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(11U, Inv.size()); 58cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Inv.any()); 59fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_FALSE(Inv.all()); 60cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Inv.none()); 61cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Inv.empty()); 62cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 63cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Inv == Vec); 64cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Inv != Vec); 6500570224891da83c5066b8d135232f96786dbd56Jakob Stoklund Olesen Vec.flip(); 66cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Inv == Vec); 67cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Inv != Vec); 68cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 69cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman // Add some "interesting" data to Vec. 70cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(23, true); 71cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(25, false); 72cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(26, true); 73cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(29, false); 74cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(33, true); 753f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman Vec.resize(57, false); 76cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman unsigned Count = 0; 77cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) { 78cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman ++Count; 79cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[i]); 80cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.test(i)); 81cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman } 82cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, Vec.count()); 83cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, 23u); 84cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[0]); 85cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[32]); 863f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman EXPECT_FALSE(Vec[56]); 873f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman Vec.resize(61, false); 88cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 89904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam Copy = Vec; 90904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam Alt(3, false); 91cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Alt.resize(6, true); 92cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman std::swap(Alt, Vec); 93cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Copy == Alt); 94cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.size() == 6); 95cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.count() == 3); 96cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.find_first() == 3); 97cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman std::swap(Copy, Vec); 98cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 99cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman // Add some more "interesting" data. 100cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(68, true); 101cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(78, false); 102cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(89, true); 103cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(90, false); 104cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(91, true); 105cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.resize(130, false); 106cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Count = 0; 107cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) { 108cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman ++Count; 109cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[i]); 110cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.test(i)); 111cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman } 112cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, Vec.count()); 113cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, 42u); 114cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[0]); 115cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[32]); 116cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[60]); 117cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[129]); 118cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 119cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.flip(60); 120cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[60]); 121cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count + 1, Vec.count()); 122cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.flip(60); 123cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[60]); 124cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, Vec.count()); 125cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 126cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.reset(32); 127cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec[32]); 128cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count - 1, Vec.count()); 129cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.set(32); 130cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec[32]); 131cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Count, Vec.count()); 132cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 133cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.flip(); 134cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(Vec.size() - Count, Vec.count()); 135cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 136cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.reset(); 137cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Vec.count()); 138cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(130U, Vec.size()); 139cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.any()); 140fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_FALSE(Vec.all()); 141cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.none()); 142cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.empty()); 143cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 144597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer Vec.flip(); 145597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_EQ(130U, Vec.count()); 146597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_EQ(130U, Vec.size()); 147597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_TRUE(Vec.any()); 148597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_TRUE(Vec.all()); 149597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_FALSE(Vec.none()); 150597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer EXPECT_FALSE(Vec.empty()); 151597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer 152a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer Vec.resize(64); 153a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_EQ(64U, Vec.count()); 154a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_EQ(64U, Vec.size()); 155a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_TRUE(Vec.any()); 156a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_TRUE(Vec.all()); 157a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_FALSE(Vec.none()); 158a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_FALSE(Vec.empty()); 159a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer 160a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer Vec.flip(); 161a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_EQ(0U, Vec.count()); 162a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_EQ(64U, Vec.size()); 163a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_FALSE(Vec.any()); 164a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_FALSE(Vec.all()); 165a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_TRUE(Vec.none()); 166a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer EXPECT_FALSE(Vec.empty()); 167a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer 168904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer Inv = TypeParam().flip(); 169cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Inv.count()); 170cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Inv.size()); 171cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Inv.any()); 172fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_TRUE(Inv.all()); 173cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Inv.none()); 174cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Inv.empty()); 175cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 176cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman Vec.clear(); 177cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Vec.count()); 178cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_EQ(0U, Vec.size()); 179cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_FALSE(Vec.any()); 180fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman EXPECT_TRUE(Vec.all()); 181cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.none()); 182cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman EXPECT_TRUE(Vec.empty()); 183cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman} 184cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman 185904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, CompoundAssignment) { 186904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam A; 187e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A.resize(10); 188e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A.set(4); 189e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A.set(7); 190e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 191904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam B; 192e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.resize(50); 193e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.set(5); 194e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.set(18); 195e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 196e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A |= B; 197e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(4)); 198e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(5)); 199e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(7)); 200e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(18)); 201c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(4U, A.count()); 202c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(50U, A.size()); 203e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 204e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.resize(10); 205e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.set(); 206e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.reset(2); 207e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.reset(7); 208e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A &= B; 209e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_FALSE(A.test(2)); 210e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_FALSE(A.test(7)); 211c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(2U, A.count()); 212c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(50U, A.size()); 213e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 214e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.resize(100); 215e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman B.set(); 216e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 217e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman A ^= B; 218e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(2)); 219e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman EXPECT_TRUE(A.test(7)); 220c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(98U, A.count()); 221c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer EXPECT_EQ(100U, A.size()); 222cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman} 223e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 224904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, ProxyIndex) { 225904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam Vec(3); 2263f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman EXPECT_TRUE(Vec.none()); 2273f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman Vec[0] = Vec[1] = Vec[2] = true; 2283f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman EXPECT_EQ(Vec.size(), Vec.count()); 2293f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman Vec[2] = Vec[1] = Vec[0] = false; 2303f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman EXPECT_TRUE(Vec.none()); 2313f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman} 2323f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman 233904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, PortableBitMask) { 234904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam A; 235ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen const uint32_t Mask1[] = { 0x80000000, 6, 5 }; 236ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 237ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(10); 238ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 3); 239ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(10u, A.size()); 240ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_FALSE(A.test(0)); 241ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 242ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(32); 243ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 3); 244ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_FALSE(A.test(0)); 245ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_TRUE(A.test(31)); 246ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(1u, A.count()); 247ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 248ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(33); 249ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 1); 250ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(1u, A.count()); 251ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 2); 252ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(1u, A.count()); 253ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 254ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(34); 255ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 2); 256ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(2u, A.count()); 257ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 258ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(65); 259ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsInMask(Mask1, 3); 260ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(4u, A.count()); 261ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 262ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsNotInMask(Mask1, 1); 263ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(32u+3u, A.count()); 264ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 265ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsNotInMask(Mask1, 3); 266ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(65u, A.count()); 267ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 268ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(96); 269ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(65u, A.count()); 270ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 271ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.clear(); 272ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.resize(128); 273ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.setBitsNotInMask(Mask1, 3); 274ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(96u-5u, A.count()); 275ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen 276ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen A.clearBitsNotInMask(Mask1, 1); 277ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen EXPECT_EQ(64-4u, A.count()); 278ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen} 279e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman 280904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, BinOps) { 281904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam A; 282904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer TypeParam B; 28303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen 28403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen A.resize(65); 28503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B)); 28603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(B)); 28703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen 28803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen B.resize(64); 28903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen A.set(64); 29003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B)); 29103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A)); 29203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen 29303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen B.set(63); 29403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B)); 29503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A)); 29603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen 29703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen A.set(63); 29803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_TRUE(A.anyCommon(B)); 29903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_TRUE(B.anyCommon(A)); 30003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen 30103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen B.resize(70); 30203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen B.set(64); 30303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen B.reset(63); 30403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen A.resize(64); 30503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B)); 30603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A)); 30703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen} 3083a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3093a1c35afbd02b012690c35ec827424c27792ec3fOwen AndersonTYPED_TEST(BitVectorTest, RangeOps) { 3103a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson TypeParam A; 3113a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson A.resize(256); 3123a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson A.reset(); 3133a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson A.set(1, 255); 3143a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3153a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(A.test(0)); 3163a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( A.test(1)); 3173a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( A.test(23)); 3183a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( A.test(254)); 3193a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(A.test(255)); 3203a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3213a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson TypeParam B; 3223a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson B.resize(256); 3233a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson B.set(); 3243a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson B.reset(1, 255); 3253a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3263a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( B.test(0)); 3273a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(B.test(1)); 3283a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(B.test(23)); 3293a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(B.test(254)); 3303a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( B.test(255)); 3313a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3323a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson TypeParam C; 3333a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson C.resize(3); 3343a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson C.reset(); 3353a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson C.set(0, 1); 3363a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3373a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE(C.test(0)); 3383a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE( C.test(1)); 3393a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE( C.test(2)); 3403a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3413a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson TypeParam D; 3423a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson D.resize(3); 3433a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson D.set(); 3443a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson D.reset(0, 1); 3453a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson 3463a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_FALSE(D.test(0)); 3473a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( D.test(1)); 3483a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson EXPECT_TRUE( D.test(2)); 349e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson 350e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson TypeParam E; 351e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson E.resize(128); 352e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson E.reset(); 353e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson E.set(1, 33); 354e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson 355e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson EXPECT_FALSE(E.test(0)); 356e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson EXPECT_TRUE( E.test(1)); 357e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson EXPECT_TRUE( E.test(32)); 358e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson EXPECT_FALSE(E.test(33)); 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TypeParam BufferOverrun; 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned size = sizeof(unsigned long) * 8; 36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BufferOverrun.resize(size); 36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BufferOverrun.reset(0, size); 36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BufferOverrun.set(0, size); 3653a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson} 366459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer 367459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin KramerTYPED_TEST(BitVectorTest, CompoundTestReset) { 368459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer TypeParam A(50, true); 369459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer TypeParam B(50, false); 370459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer 371459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer TypeParam C(100, true); 372459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer TypeParam D(100, false); 373459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer 374459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(A.test(A)); 375459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(A.test(B)); 376459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(A.test(C)); 377459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(A.test(D)); 378459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(B.test(A)); 379459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(B.test(B)); 380459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(B.test(C)); 381459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(B.test(D)); 382459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(C.test(A)); 383459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(C.test(B)); 384459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_FALSE(C.test(C)); 385459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(C.test(D)); 386459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer 387459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.reset(B); 388459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.reset(D); 389459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(A.all()); 390459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.reset(A); 391459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(A.none()); 392459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.set(); 393459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.reset(C); 394459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(A.none()); 395459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer A.set(); 396459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer 397459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer C.reset(A); 398459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_EQ(50, C.find_first()); 399459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer C.reset(C); 400459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer EXPECT_TRUE(C.none()); 401459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer} 40203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen} 403ce97b75c1d507808abcb67635cfcdce2f48e53c9Dale Johannesen#endif 404