26 using Logic =
typename Counter::Logic;
27 using CEltW =
typename Counter::CEltW;
30 explicit Scan(
const Counter& ctr) : ctr_(ctr) {}
44 void add(
size_t n, CEltW B[],
const BitW S[],
const CEltW A[],
46 const Counter& CTR = ctr_;
47 std::vector<BitW> S1(n);
48 for (
size_t i = 0; i < n; ++i) {
50 B[i] = CTR.mux(&S[i], &A[i], ds[i]);
52 scan_add(0, n, S1.data(), B);
56 void add(
size_t n, CEltW B[],
const CEltW ds[]) {
57 for (
size_t i = 0; i < n; ++i) {
66 void scan_add(
size_t i0,
size_t i1, BitW S[], CEltW B[]) {
68 const Counter& CTR = ctr_;
69 const Logic& L = CTR.logic();
70 size_t im = i0 + (i1 - i0) / 2;
71 scan_add(i0, im, S, B);
72 scan_add(im, i1, S, B);
75 for (
size_t i = im; i < i1; ++i) {
78 BitW ns = L.lnot(S[i]);
79 CEltW ns_bj = CTR.ite0(&ns, B[j]);
80 B[i] = CTR.add(&B[i], ns_bj);
81 S[i] = L.lor(&S[i], S[j]);
87 void scan_add(
size_t i0,
size_t i1, CEltW B[]) {
89 const Counter& CTR = ctr_;
91 size_t im = i0 + (i1 - i0) / 2;
96 for (
size_t i = im; i < i1; ++i) {
97 B[i] = CTR.add(&B[j], B[i]);