aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert/GrayCodeRank.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'chilbert/GrayCodeRank.hpp')
-rw-r--r--chilbert/GrayCodeRank.hpp114
1 files changed, 39 insertions, 75 deletions
diff --git a/chilbert/GrayCodeRank.hpp b/chilbert/GrayCodeRank.hpp
index 60e644a..adb953a 100644
--- a/chilbert/GrayCodeRank.hpp
+++ b/chilbert/GrayCodeRank.hpp
@@ -19,17 +19,8 @@
#ifndef CHILBERT_GRAYCODERANK_HPP
#define CHILBERT_GRAYCODERANK_HPP
-#include "chilbert/BigBitVec.hpp"
-#include "chilbert/FixBitVec.hpp"
-
#include <cassert>
-
-#define MODSPLIT(r, b, k) \
- { \
- b = (k); \
- r = b / FBV_BITS; \
- b -= r * FBV_BITS; \
- }
+#include <cstddef>
namespace chilbert {
@@ -48,8 +39,8 @@ compactIndex(const size_t* const ms,
{
resetBits(hc);
- size_t hi = 0;
- size_t hci = 0;
+ auto hm = h.mask(0);
+ auto hcm = hc.mask(0);
// Run through the levels of precision
for (size_t i = 0; i < m; i++) {
@@ -58,16 +49,16 @@ compactIndex(const size_t* const ms,
do {
// This dimension contributes a bit?
if (ms[j] > i) {
- if (testBit(h, hi)) {
- setBit(hc, hci);
+ if (h.test(hm)) {
+ hc.set(hcm);
}
- ++hci;
+ ++hcm;
}
if (++j == n) {
j = 0;
}
- ++hi;
+ ++hm;
} while (j != ds[i]);
}
}
@@ -78,26 +69,16 @@ grayCodeRank(const I& mask, const I& gi, const size_t n, I& r)
{
r.reset();
- int jr = 0;
- FBV_UINT jm = 1;
- int ir = 0;
- FBV_UINT im = 1;
- for (size_t i = 0; i < n; ++i) {
- if (mask.racks()[ir] & im) {
- if (gi.racks()[ir] & im) {
- r.racks()[jr] |= jm;
- }
- jm <<= 1;
- if (jm == 0) {
- jm = 1;
- ++jr;
- }
- }
+ auto mi = mask.begin();
+ auto gii = gi.begin();
+ auto ri = r.begin();
- im <<= 1;
- if (im == 0) {
- im = 1;
- ++ir;
+ for (size_t i = 0; i < n; ++i, ++mi, ++gii) {
+ if (*mi) {
+ if (*gii) {
+ ri.set();
+ }
+ ++ri;
}
}
}
@@ -115,54 +96,42 @@ grayCodeRankInv(const I& mask,
g.reset();
gi.reset();
- size_t ir, jr;
- FBV_UINT im, jm;
-
- intptr_t i = static_cast<intptr_t>(n - 1);
- MODSPLIT(ir, im, (n - 1));
- im = (FBV1 << im);
+ assert(ptrn.size() == mask.size());
+ assert(g.size() == mask.size());
+ assert(gi.size() == mask.size());
- size_t j = b - 1;
- MODSPLIT(jr, jm, j);
- jm = (FBV1 << jm);
+ auto m = mask.mask(n - 1);
+ auto ri = r.begin(b - 1);
- FBV_UINT gi0, gi1, g0;
- gi1 = gi0 = g0 = 0;
+ typename I::Rack gi0 = 0;
+ typename I::Rack gi1 = 0;
+ typename I::Rack g0 = 0;
- for (; i >= 0; --i) {
- // Unconstrained bit?
- if (mask.racks()[ir] & im) {
+ for (size_t i = 0; i < n; ++i) {
+ if (mask.test(m)) { // Unconstrained bit
gi1 = gi0;
- gi0 = (r.racks()[jr] & jm) > 0;
+ gi0 = *ri;
g0 = gi0 ^ gi1;
if (gi0) {
- gi.racks()[ir] |= im;
+ gi.set(m);
}
if (g0) {
- g.racks()[ir] |= im;
+ g.set(m);
}
- jm >>= 1;
- if (jm == 0) {
- jm = (FBV_UINT{1}) << (FBV_BITS - 1);
- --jr;
- }
- } else {
- g0 = (ptrn.racks()[ir] & im) > 0;
+ --ri;
+ } else { // Constrained bit
+ g0 = (ptrn.test(m) > 0);
gi1 = gi0;
gi0 = g0 ^ gi1;
if (gi0) {
- gi.racks()[ir] |= im;
+ gi.set(m);
}
if (g0) {
- g.racks()[ir] |= im;
+ g.set(m);
}
}
- im >>= 1;
- if (im == 0) {
- im = (FBV_UINT{1}) << (FBV_BITS - 1);
- --ir;
- }
+ --m;
}
}
@@ -180,20 +149,15 @@ extractMask(const size_t* const ms,
mask.reset();
b = 0;
- FBV_UINT jm = 1;
- size_t jr = 0;
- size_t j = d; // #D j = (d==n-1) ? 0 : d+1;
+ auto mi = mask.begin();
+ size_t j = d; // #D j = (d==n-1) ? 0 : d+1;
do {
if (ms[j] > i) {
- mask.racks()[jr] |= jm;
+ mi.set();
++b;
}
- jm <<= 1;
- if (jm == 0) {
- jm = 1;
- ++jr;
- }
+ ++mi;
if (++j == n) {
j = 0;
}