45template <
class I,
class Rank>
void rsort (I first, I last, Rank
rank) {
46 typedef typename iterator_traits<I>::value_type T;
47 typedef typename Rank::Type R;
50 const size_t n = last - first;
55 const size_t w = (1 << l);
57 const unsigned mask = w - 1;
64#ifdef CADICAL_RADIX_BUCKETS_ON_THE_HEAP
65 size_t *count =
new size_t[w];
70 I a = first, b = last, c = a;
71 bool initialized =
false;
74 R upper = 0, lower = ~upper;
78 R masked_lower = 0, masked_upper = mask;
80 for (
size_t i = 0; i < 8 *
sizeof (
rank (*first));
81 i += l, shifted <<= l) {
83 if (bounded && (lower & shifted) == (upper & shifted))
86 memset (count + masked_lower, 0,
87 (masked_upper - masked_lower + 1) *
sizeof *count);
93 for (I
p = c;
p != end;
p++) {
94 const auto r =
rank (*
p);
96 lower &= r, upper |= r;
97 const auto s = r >> i;
98 const auto m = s & mask;
99 if (sorted && last > m)
106 masked_lower = (lower >> i) & mask;
107 masked_upper = (upper >> i) & mask;
111 if ((lower & shifted) == (upper & shifted))
119 for (R j = masked_lower; j <= masked_upper; j++) {
120 const size_t delta = count[j];
132 I d = (&*c == &*a) ? b : a;
134 for (I
p = c;
p != end;
p++) {
135 const auto r =
rank (*
p);
136 const auto s = r >> i;
137 const auto m = s & mask;
144 for (
size_t i = 0; i < n; i++)
148#ifdef CADICAL_RADIX_BUCKETS_ON_THE_HEAP
152#ifndef CADICAL_NDEBUG
153 for (I
p = first;
p + 1 != last;
p++)