| 188 | // num_bucket must be less than or equal to 2^bits |
| 189 | template <typename SeqIn, typename IterOut, typename Get_Key> |
| 190 | sequence<size_t> integer_sort_(SeqIn const &In, range<IterOut> Out, |
| 191 | range<IterOut> Tmp, Get_Key const &g, |
| 192 | size_t bits, size_t num_buckets, bool inplace) { |
| 193 | if (slice_eq(In.slice(), Out)) { |
| 194 | std::cout << "in integer_sort : input and output must be different locations" << std::endl; |
| 195 | exit(-1); |
| 196 | } |
| 197 | if (bits == 0) { |
| 198 | auto get_key = [&](size_t i) { return g(In[i]); }; |
| 199 | auto keys = delayed_seq<size_t>(In.size(), get_key); |
| 200 | num_buckets = reduce(keys, maxm<size_t>()) + 1; |
| 201 | bits = log2_up(num_buckets); |
| 202 | } |
| 203 | return integer_sort_r(In, Out, Tmp, g, bits, num_buckets, inplace); |
| 204 | } |
| 205 | |
| 206 | template <typename T, typename Get_Key> |
| 207 | void integer_sort_inplace(range<T *> In, Get_Key const &g, |
no test coverage detected