aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert/BigBitVec.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'chilbert/BigBitVec.hpp')
-rw-r--r--chilbert/BigBitVec.hpp62
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;
}