aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-08-11 19:36:41 +0200
committerDavid Robillard <d@drobilla.net>2018-09-29 14:46:21 +0200
commit26b80e46866fe90bdf41ee966499af9d49123f92 (patch)
tree9d79802e1c28bd0b3b09ed65fb521692cd1ac18e /chilbert
parent16ec07372eaa92e361f66687d6da2d7e5541c0aa (diff)
downloadchilbert-26b80e46866fe90bdf41ee966499af9d49123f92.tar.gz
chilbert-26b80e46866fe90bdf41ee966499af9d49123f92.tar.bz2
chilbert-26b80e46866fe90bdf41ee966499af9d49123f92.zip
Replace BBV_MODSPLIT macro with Ref utility struct
Diffstat (limited to 'chilbert')
-rw-r--r--chilbert/BigBitVec.hpp94
1 files changed, 50 insertions, 44 deletions
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)
{