diff options
Diffstat (limited to 'chilbert/GrayCodeRank.hpp')
-rw-r--r-- | chilbert/GrayCodeRank.hpp | 114 |
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; } |