1#ifndef TATOOINE_INDEX_ORDER_H
2#define TATOOINE_INDEX_ORDER_H
9#include <boost/range/adaptor/reversed.hpp>
18 template <std::forward_iterator Iterator>
21 using int_t =
typename std::iterator_traits<Iterator>::value_type;
22 auto multiplier = int_t(1);
24 auto it = [&](int_t
const i) {
25 idx += i * multiplier;
26 multiplier *= *(resolution_it++);
28 for_each(it,
static_cast<int_t
>(is)...);
32 template <std::forward_iterator Iterator>
35 using int_t =
typename std::iterator_traits<Iterator>::value_type;
36 auto multiplier = int_t(1);
38 for (
auto const i : is) {
39 idx +=
static_cast<int_t
>(i) * multiplier;
40 multiplier *= *(resolution_it++);
52 assert(resolution.size() == indices.size());
56 template <
integral_range Resolution>
59 using int_t = std::ranges::range_value_t<Resolution>;
60 auto is = std::vector<int_t>(resolution.size());
61 auto multiplier = std::accumulate(std::ranges::begin(resolution), std::ranges::prev(
end(resolution)),
62 int_t(1), std::multiplies<int_t>{});
64 auto resolution_it = std::ranges::prev(
end(resolution), 2);
65 for (std::size_t j = 0; j < resolution.size(); ++j, --resolution_it) {
66 auto i = resolution.size() - 1 - j;
69 if (resolution_it >=
begin(resolution)) {
70 multiplier /= *resolution_it;
82 std::forward_iterator
auto resolution_it,
range auto const& is)
84 auto multiplier = std::size_t(1);
85 auto idx = std::size_t(0);
87 for (
auto i : is | boost::adaptors::reversed) {
88 idx += i * multiplier;
89 multiplier *= *(resolution_it--);
97 std::array is{p_is...};
99 std::size_t multiplier = 1;
102 for (std::size_t i = 0; i <
size(is); ++i) {
103 idx += is[is.size() - 1 - i] * multiplier;
105 multiplier *= resolution[is.size() - 1 - i];
113 integral auto const... is) -> std::size_t {
114 assert(
sizeof...(is) == resolution.size());
120 assert(is.size() == resolution.size());
125 auto is = std::vector<std::size_t> (resolution.size());
126 std::size_t multiplier = 1;
128 auto resolution_it =
prev(
end(resolution));
130 for (; resolution_it !=
begin(resolution); --resolution_it, --is_it) {
133 multiplier *= *resolution_it;
139concept index_order = std::same_as<T, x_fastest> || std::same_as<T, x_slowest>;
Definition: index_order.h:139
Definition: concepts.h:91
Definition: concepts.h:21
Definition: concepts.h:84
Definition: algorithm.h:6
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr void for_each(F &&f, Ts &&... ts)
Definition: utility.h:39
auto prev(Iter iter)
Definition: iterator_facade.h:343
Definition: index_order.h:17
static auto multi_index(Resolution const &resolution, integral auto plain_index)
Definition: index_order.h:57
static constexpr auto plain_index(integral_range auto const &resolution, integral_range auto const &indices)
Definition: index_order.h:50
static constexpr auto plain_index(Iterator resolution_it, integral auto const ... is)
Definition: index_order.h:19
static constexpr auto plain_index(Iterator resolution_it, integral_range auto const &is)
Definition: index_order.h:33
static constexpr auto plain_index(integral_range auto const &resolution, integral auto const ... is)
Definition: index_order.h:45
Definition: index_order.h:79
static auto multi_index(range auto const &resolution, std::size_t plain_index)
Definition: index_order.h:124
static constexpr auto internal_plain_index(std::forward_iterator auto resolution_it, range auto const &is) -> std::size_t
Definition: index_order.h:81
static constexpr auto plain_index(range auto const &resolution, integral auto const ... is) -> std::size_t
Definition: index_order.h:112
static auto plain_index(range auto const &resolution, range auto const &is) -> std::size_t
Definition: index_order.h:118
static constexpr auto internal_plain_index(range auto const &resolution, integral auto const ... p_is) -> std::size_t
Definition: index_order.h:94