From 58e219362b2e9a7d7b9b9b526760c392cd50e878 Mon Sep 17 00:00:00 2001 From: Aina Niemetz Date: Fri, 19 Mar 2021 10:28:14 -0700 Subject: BitVector: Change setBit to set the bit in place. (#6176) Creating BitVectors (and deleting them) is in general expensive because of the underlying multi-precision Integer. If possible, unnecessary constructions and desctructions of BitVectors should be avoided. The most common use case for `setBit` is that for an existing BitVector, a given bit should be set to a certain value. Not doing this in place generates unnecessary constructions and destructions of BitVectors. --- test/unit/util/bitvector_black.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'test/unit/util') diff --git a/test/unit/util/bitvector_black.cpp b/test/unit/util/bitvector_black.cpp index c544913a7..3de70cfec 100644 --- a/test/unit/util/bitvector_black.cpp +++ b/test/unit/util/bitvector_black.cpp @@ -28,7 +28,7 @@ class TestUtilBlackBitVector : public TestInternal void SetUp() override { d_zero = BitVector(4); - d_one = d_zero.setBit(0, true); + d_one = BitVector::mkOne(4); d_two = BitVector("0010", 2); d_neg_one = BitVector(4, Integer(-1)); d_ones = BitVector::mkOnes(4); @@ -83,12 +83,19 @@ TEST_F(TestUtilBlackBitVector, conversions) TEST_F(TestUtilBlackBitVector, setBit_getBit) { - ASSERT_EQ(d_one.setBit(1, true).setBit(2, true).setBit(3, true), d_ones); - ASSERT_EQ(d_ones.setBit(0, false).setBit(1, false).setBit(2, false).setBit( - 3, false), - d_zero); - ASSERT_EQ(d_ones.setBit(0, false).setBit(0, true), d_ones); - ASSERT_EQ(d_ones.setBit(0, false), ~BitVector::mkOne(d_one.getSize())); + BitVector ones(d_one); + ASSERT_EQ(ones.setBit(1, true).setBit(2, true).setBit(3, true), d_ones); + + BitVector zero(d_ones); + ASSERT_EQ( + zero.setBit(0, false).setBit(1, false).setBit(2, false).setBit(3, false), + d_zero); + + ones = d_ones; + ASSERT_EQ(ones.setBit(0, false).setBit(0, true), d_ones); + + BitVector not_one(d_ones); + ASSERT_EQ(not_one.setBit(0, false), ~BitVector::mkOne(d_one.getSize())); ASSERT_TRUE(d_ones.isBitSet(3)); ASSERT_FALSE(d_two.isBitSet(3)); -- cgit v1.2.3