Loading [MathJax]/extensions/tex2jax.js
Tatooine
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages Concepts
static_multidim_size.h
Go to the documentation of this file.
1#ifndef TATOOINE_STATIC_MULTIDIM_SIZE_H
2#define TATOOINE_STATIC_MULTIDIM_SIZE_H
3//==============================================================================
4#include <tatooine/concepts.h>
6
7#include <array>
8//==============================================================================
9namespace tatooine {
10//==============================================================================
11template <std::size_t... Resolution>
13 static std::size_t constexpr num_dimensions() { return sizeof...(Resolution); }
14 using array_type = std::array<std::size_t, num_dimensions()>;
15 //----------------------------------------------------------------------------
16 private:
18 static constexpr array_type resolution = array_type{Resolution...};
19 //----------------------------------------------------------------------------
20 public:
21 static constexpr auto begin() {
22 return static_multidim_iterator{std::array{((void)Resolution, std::size_t{})...}};
23 }
24 //----------------------------------------------------------------------------
25 static constexpr auto end() {
26 auto e = begin();
27 e.m_status.back() = resolution.back();
28 return e;
29 }
30
31 private:
32 constexpr static_multidim_iterator(array_type const& status)
33 : m_status{status} {}
34
35 public:
36 //----------------------------------------------------------------------------
38 default;
40 static_multidim_iterator&& other) noexcept = default;
41 //----------------------------------------------------------------------------
42 constexpr auto operator=(static_multidim_iterator const& other)
43 -> static_multidim_iterator& = default;
44 constexpr auto operator=(static_multidim_iterator&& other) noexcept
45 -> static_multidim_iterator& = default;
46 //----------------------------------------------------------------------------
48 //----------------------------------------------------------------------------
49 constexpr auto operator++() {
50 ++m_status.front();
51 auto status_it = std::begin(m_status);
52 auto end_it = std::begin(resolution);
53 for (; end_it != std::prev(std::end(resolution)); ++status_it, ++end_it) {
54 auto & i = *status_it;
55 auto & j = *std::next(status_it);
56 auto const& end = *end_it;
57 if (i >= end) {
58 i = 0;
59 ++j;
60 }
61 }
62 }
63 //----------------------------------------------------------------------------
64 constexpr auto operator==(static_multidim_iterator const& other) const {
65 for (std::size_t i = 0; i < num_dimensions(); ++i) {
66 if (m_status[i] != other.m_status[i]) {
67 return false;
68 }
69 }
70 return true;
71 }
72 //----------------------------------------------------------------------------
73 constexpr auto operator!=(static_multidim_iterator const& other) const {
74 return !operator==(other);
75 }
76 //----------------------------------------------------------------------------
77 constexpr auto operator*() const { return m_status; }
78};
79//==============================================================================
80template <typename IndexOrder, std::size_t... Resolution>
82 static auto constexpr num_dimensions() { return sizeof...(Resolution); }
83 static auto constexpr num_components() { return (Resolution * ...); }
84 //----------------------------------------------------------------------------
85 static auto constexpr size() { return std::array{Resolution...}; }
86 //----------------------------------------------------------------------------
87 static auto constexpr size(std::size_t const i) { return size()[i]; }
88 //----------------------------------------------------------------------------
89 static auto constexpr in_range(integral auto const... indices)
90 requires(sizeof...(indices) == num_dimensions()) {
91 return ((indices >= 0) && ...) &&
92 ((static_cast<std::size_t>(indices) < Resolution) && ...);
93 }
94 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
95 static auto constexpr in_range(integral_range auto const& indices) {
96 for (std::size_t i = 0; i < indices.size(); ++i) {
97 if (indices[i] >= size(i)) {
98 return false;
99 }
100 }
101 return true;
102 }
103 //----------------------------------------------------------------------------
104 static auto constexpr plain_index(integral auto const... indices) requires(
105 sizeof...(indices) == num_dimensions()) {
106 return IndexOrder::plain_index(size(), indices...);
107 }
108 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
109 static auto plain_index(integral_range auto const& indices) {
110 return IndexOrder::plain_index(size(), indices);
111 }
112 //----------------------------------------------------------------------------
113 auto constexpr operator()(integral auto const... indices) const
114 requires(sizeof...(indices) == num_dimensions()) {
115 return plain_index(indices...);
116 }
117 //----------------------------------------------------------------------------
120};
121//==============================================================================
122} // namespace tatooine
123//==============================================================================
124#endif
Definition: concepts.h:91
Definition: concepts.h:21
Definition: algorithm.h:6
Definition: static_multidim_size.h:12
array_type m_status
Definition: static_multidim_size.h:17
constexpr auto operator*() const
Definition: static_multidim_size.h:77
static constexpr auto end()
Definition: static_multidim_size.h:25
constexpr auto operator==(static_multidim_iterator const &other) const
Definition: static_multidim_size.h:64
constexpr auto operator++()
Definition: static_multidim_size.h:49
constexpr auto operator!=(static_multidim_iterator const &other) const
Definition: static_multidim_size.h:73
constexpr static_multidim_iterator(static_multidim_iterator const &other)=default
std::array< std::size_t, num_dimensions()> array_type
Definition: static_multidim_size.h:14
static constexpr auto begin()
Definition: static_multidim_size.h:21
constexpr static_multidim_iterator(static_multidim_iterator &&other) noexcept=default
constexpr auto operator=(static_multidim_iterator const &other) -> static_multidim_iterator &=default
constexpr static_multidim_iterator(array_type const &status)
Definition: static_multidim_size.h:32
constexpr auto operator=(static_multidim_iterator &&other) noexcept -> static_multidim_iterator &=default
static std::size_t constexpr num_dimensions()
Definition: static_multidim_size.h:13
static constexpr array_type resolution
Definition: static_multidim_size.h:18
Definition: static_multidim_size.h:81
static auto constexpr in_range(integral auto const ... indices)
Definition: static_multidim_size.h:89
auto constexpr operator()(integral auto const ... indices) const
Definition: static_multidim_size.h:113
static auto constexpr num_dimensions()
Definition: static_multidim_size.h:82
static auto constexpr in_range(integral_range auto const &indices)
Definition: static_multidim_size.h:95
auto begin()
Definition: static_multidim_size.h:118
auto end()
Definition: static_multidim_size.h:119
static auto plain_index(integral_range auto const &indices)
Definition: static_multidim_size.h:109
static auto constexpr size()
Definition: static_multidim_size.h:85
static auto constexpr num_components()
Definition: static_multidim_size.h:83
static auto constexpr plain_index(integral auto const ... indices)
Definition: static_multidim_size.h:104
static auto constexpr size(std::size_t const i)
Definition: static_multidim_size.h:87