diff options
Diffstat (limited to 'chilbert/BigBitVec.hpp')
-rw-r--r-- | chilbert/BigBitVec.hpp | 62 |
1 files changed, 10 insertions, 52 deletions
diff --git a/chilbert/BigBitVec.hpp b/chilbert/BigBitVec.hpp index 7fe260e..7038662 100644 --- a/chilbert/BigBitVec.hpp +++ b/chilbert/BigBitVec.hpp @@ -19,6 +19,7 @@ #ifndef CHILBERT_BIGBITVEC_HPP #define CHILBERT_BIGBITVEC_HPP +#include "chilbert/BitVecMask.hpp" #include "chilbert/Operations.hpp" #include <algorithm> @@ -36,53 +37,10 @@ class CBigBitVec { public: using Rack = uintptr_t; + using Mask = BitVecMask<Rack>; static constexpr size_t bits_per_rack = sizeof(Rack) * CHAR_BIT; - /** Mask for a bit that can be incremented like an index. - * - * This enables fast iteration while setting or resetting bits since it is - * internally stored as a mask which avoids repeated index math. - */ - class Mask - { - public: - void operator++() - { - if ((m_mask <<= 1) == 0) { - m_mask = 1; - ++m_rack; - } - } - - void operator--() - { - if ((m_mask >>= 1) == 0) { - m_mask = Rack{1} << (bits_per_rack - 1); - --m_rack; - } - } - - bool operator==(const Mask& mask) const - { - return m_rack == mask.m_rack && m_mask == mask.m_mask; - } - - bool operator!=(const Mask& mask) const { return !operator==(mask); } - - private: - friend class CBigBitVec; - - Mask(const size_t index) - : m_rack{index / bits_per_rack} - , m_mask{Rack{1} << (index - m_rack * bits_per_rack)} - { - } - - size_t m_rack; - Rack m_mask; - }; - explicit CBigBitVec(const size_t bits) : m_pcRacks{make_racks(num_racks(bits))} , m_size{bits} @@ -136,9 +94,9 @@ public: { const Mask m = mask(bits); - m_pcRacks[m.m_rack] &= (m.m_mask - 1); + m_pcRacks[m.rack] &= (m.mask - 1); - for (size_t i = m.m_rack + 1; i < rackCount(); ++i) { + for (size_t i = m.rack + 1; i < rackCount(); ++i) { m_pcRacks[i] = 0; } @@ -193,7 +151,7 @@ public: /// Return the value of the bit covered by `mask` bool test(const Mask mask) const { - return m_pcRacks[mask.m_rack] & mask.m_mask; + return m_pcRacks[mask.rack] & mask.mask; } /// Return the value of the `index`th bit @@ -202,7 +160,7 @@ public: /// Set the bit covered by `mask` to 1 CBigBitVec& set(const Mask mask) { - m_pcRacks[mask.m_rack] |= mask.m_mask; + m_pcRacks[mask.rack] |= mask.mask; return *this; } @@ -212,7 +170,7 @@ public: /// Reset the bit covered by `mask` to 0 CBigBitVec& reset(const Mask mask) { - m_pcRacks[mask.m_rack] &= ~mask.m_mask; + m_pcRacks[mask.rack] &= ~mask.mask; return *this; } @@ -222,8 +180,8 @@ public: /// Set the bit covered by `mask` to `value` CBigBitVec& set(const Mask mask, const bool value) { - auto& rack = m_pcRacks[mask.m_rack]; - rack ^= (-Rack{value} ^ rack) & mask.m_mask; + auto& rack = m_pcRacks[mask.rack]; + rack ^= (-Rack{value} ^ rack) & mask.mask; return *this; } @@ -236,7 +194,7 @@ public: /// Flip the value of the bit covered by `mask` CBigBitVec& flip(const Mask mask) { - m_pcRacks[mask.m_rack] ^= mask.m_mask; + m_pcRacks[mask.rack] ^= mask.mask; return *this; } |