Tatooine
reorder.h
Go to the documentation of this file.
1#ifndef TATOOINE_UTILITY_REORDER_H
2#define TATOOINE_UTILITY_REORDER_H
3//==============================================================================
4#include <cassert>
5#include <ranges>
6//==============================================================================
7namespace tatooine {
8//==============================================================================
10auto reorder(std::ranges::range auto& data, std::ranges::range auto& order)
11 -> void requires integral<std::ranges::range_value_t<decltype(order)>> {
12 assert(std::ranges::size(data) == std::ranges::size(order));
13
14 for (std::size_t vv = 0; vv < size(data) - 1; ++vv) {
15 if (order[vv] == vv) {
16 continue;
17 }
18 auto oo = std::size_t{};
19 for (oo = vv + 1; oo < order.size(); ++oo) {
20 if (order[oo] == vv) {
21 break;
22 }
23 }
24 std::swap(data[vv], data[order[vv]]);
25 std::swap(order[vv], order[oo]);
26 }
27}
28//==============================================================================
29} // namespace tatooine
30//==============================================================================
31#endif
Definition: concepts.h:21
Definition: algorithm.h:6
auto reorder(std::ranges::range auto &data, std::ranges::range auto &order) -> void
reorders a range data with another range order
Definition: reorder.h:10
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148