From 26b80e46866fe90bdf41ee966499af9d49123f92 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 11 Aug 2018 19:36:41 +0200 Subject: Replace BBV_MODSPLIT macro with Ref utility struct --- chilbert/BigBitVec.hpp | 94 +++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 44 deletions(-) (limited to 'chilbert') diff --git a/chilbert/BigBitVec.hpp b/chilbert/BigBitVec.hpp index aa8e7e1..79c8151 100644 --- a/chilbert/BigBitVec.hpp +++ b/chilbert/BigBitVec.hpp @@ -86,18 +86,15 @@ public: CBigBitVec& truncate(const int bits) { assert(bits >= 0 && bits <= size()); - int r, b; - - BBV_MODSPLIT(r, b, bits); - - if (r >= m_iRacks) { + const Ref ref(bits); + if (ref.rack >= m_iRacks) { return *this; } // Truncate rack that contains the split point - m_pcRacks[r] &= FBVN1S(bits); + m_pcRacks[ref.rack] &= FBVN1S(ref.bit); - for (int i = r + 1; i < m_iRacks; ++i) { + for (int i = ref.rack + 1; i < m_iRacks; ++i) { m_pcRacks[i] = 0; } @@ -164,18 +161,16 @@ public: bool test(const int index) const { assert(index >= 0 && index < size()); - int r, b; - BBV_MODSPLIT(r, b, index); - return testBit(m_pcRacks[r], b); + const Ref ref(index); + return testBit(m_pcRacks[ref.rack], ref.bit); } /// Set the `index`th bit to 1 CBigBitVec& set(const int index) { assert(index >= 0 && index < size()); - int r, b; - BBV_MODSPLIT(r, b, index); - setBit(m_pcRacks[r], b); + const Ref ref(index); + setBit(m_pcRacks[ref.rack], ref.bit); return *this; } @@ -183,9 +178,8 @@ public: CBigBitVec& reset(const int index) { assert(index >= 0 && index < size()); - int r, b; - BBV_MODSPLIT(r, b, index); - m_pcRacks[r] &= ~((FBV_UINT)1 << b); + const Ref ref(index); + m_pcRacks[ref.rack] &= ~((FBV_UINT)1 << ref.bit); return *this; } @@ -193,9 +187,8 @@ public: CBigBitVec& set(const int index, const bool value) { assert(index >= 0 && index < size()); - int r, b; - BBV_MODSPLIT(r, b, index); - setBit(m_pcRacks[r], b, value); + const Ref ref(index); + setBit(m_pcRacks[ref.rack], ref.bit, value); return *this; } @@ -203,9 +196,8 @@ public: CBigBitVec& flip(const int index) { assert(index >= 0 && index < size()); - int r, b; - BBV_MODSPLIT(r, b, index); - m_pcRacks[r] ^= (FBV1 << index); + const Ref ref(index); + m_pcRacks[ref.rack] ^= (FBV1 << ref.bit); return *this; } @@ -263,25 +255,25 @@ public: CBigBitVec& operator<<=(const int bits) { assert(bits >= 0); - int r, b, i; // No shift? if (bits == 0) { return *this; } - BBV_MODSPLIT(r, b, bits); + const Ref ref(bits); // All racks? - if (r >= m_iRacks) { + if (ref.rack >= m_iRacks) { reset(); return *this; } // Do rack shifts. - if (r > 0) { - for (i = m_iRacks - 1; i >= r; --i) { - m_pcRacks[i] = m_pcRacks[i - r]; + if (ref.rack > 0) { + int i; + for (i = m_iRacks - 1; i >= ref.rack; --i) { + m_pcRacks[i] = m_pcRacks[i - ref.rack]; } for (; i >= 0; --i) { m_pcRacks[i] = 0; @@ -289,13 +281,14 @@ public: } // Do bit shifts. - if (b > 0) { - int bi = FBV_BITS - b; - for (i = m_iRacks - 1; i >= r + 1; --i) { - m_pcRacks[i] <<= b; + if (ref.bit > 0) { + int bi = FBV_BITS - ref.bit; + int i; + for (i = m_iRacks - 1; i >= ref.rack + 1; --i) { + m_pcRacks[i] <<= ref.bit; m_pcRacks[i] |= m_pcRacks[i - 1] >> bi; } - m_pcRacks[i] <<= b; + m_pcRacks[i] <<= ref.bit; } return *this; @@ -311,25 +304,25 @@ public: CBigBitVec& operator>>=(const int bits) { assert(bits >= 0); - int r, b, i; // No shift? if (bits == 0) { return *this; } - BBV_MODSPLIT(r, b, bits); + const Ref ref(bits); // All racks? - if (r >= m_iRacks) { + if (ref.rack >= m_iRacks) { reset(); return *this; } // Do rack shifts. - if (r > 0) { - for (i = 0; i < m_iRacks - r; ++i) { - m_pcRacks[i] = m_pcRacks[i + r]; + if (ref.rack > 0) { + int i; + for (i = 0; i < m_iRacks - ref.rack; ++i) { + m_pcRacks[i] = m_pcRacks[i + ref.rack]; } for (; i < m_iRacks; ++i) { m_pcRacks[i] = 0; @@ -337,13 +330,14 @@ public: } // Do bit shifts. - if (b > 0) { - int bi = FBV_BITS - b; - for (i = 0; i < m_iRacks - r - 1; ++i) { - m_pcRacks[i] >>= b; + if (ref.bit > 0) { + int bi = FBV_BITS - ref.bit; + int i; + for (i = 0; i < m_iRacks - ref.rack - 1; ++i) { + m_pcRacks[i] >>= ref.bit; m_pcRacks[i] |= m_pcRacks[i + 1] << bi; } - m_pcRacks[i] >>= b; + m_pcRacks[i] >>= ref.bit; } return *this; @@ -458,6 +452,18 @@ public: int rackCount() const { return m_iRacks; } private: + struct Ref + { + Ref(const int bits) + : rack{bits / FBV_BITS} + , bit{bits - rack * FBV_BITS} + { + } + + int rack; + int bit; + }; + // Right rotates entire racks (in place). void rackRotr(int k) { -- cgit v1.2.1