Tatooine
cell_container.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_RECTILINEAR_GRID_CELL_CONTAINER_H
2#define TATOOINE_DETAIL_RECTILINEAR_GRID_CELL_CONTAINER_H
3//==============================================================================
4#include <tatooine/concepts.h>
5#include <tatooine/for_loop.h>
8//==============================================================================
9namespace tatooine {
10template <floating_point_range... Dimensions>
11requires(sizeof...(Dimensions) > 1)
12class rectilinear_grid;
13}
14//==============================================================================
16//==============================================================================
17template <typename... Dimensions>
19 using grid_t = tatooine::rectilinear_grid<Dimensions...>;
20
21 private:
22 grid_t const& m_grid;
23
24 public:
25 //using iterator = cell_iterator<Dimensions...>;
26 //using const_iterator = iterator;
27 //using handle = cell_handle<Dimensions...>;
28 //using pos_type = typename grid_t::pos_type;
29 using seq_t = typename grid_t::seq_t;
30 static constexpr auto num_dimensions() -> std::size_t { return sizeof...(Dimensions); }
31 //----------------------------------------------------------------------------
32 explicit cell_container(grid_t const& g) : m_grid{g} {}
33 //----------------------------------------------------------------------------
34// template <size_t... DIs, integral Int>
35// auto at(std::index_sequence<DIs...>,
36// std::array<Int, num_dimensions()> const& is) const
37// -> vec<real_type, num_dimensions()> {
38// return pos_type{static_cast<real_type>(m_grid.template dimension<DIs>()[is[DIs]])...};
39// }
40// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
41// template <size_t... DIs, integral... Is>
42// auto at(std::index_sequence<DIs...>, Is const... is) const
43// -> vec<real_type, num_dimensions()> {
44// static_assert(sizeof...(DIs) == sizeof...(is));
45// static_assert(sizeof...(is) == num_dimensions());
46// return pos_type{static_cast<real_type>(m_grid.template dimension<DIs>()[is])...};
47// }
48// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
49// public:
50// template <integral... Is>
51// auto at(Is const... is) const {
52// static_assert(sizeof...(is) == num_dimensions());
53// return at(seq_t{}, is...);
54// }
55// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
56// template <integral Int>
57// auto at(std::array<Int, num_dimensions()> const& is) const {
58// return at(seq_t{}, is);
59// }
60// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
61// auto at(handle const& h) const {
62// return at(seq_t{}, h.indices());
63// }
64// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65// auto operator[](handle const& h) const {
66// return at(seq_t{}, h.indices());
67// }
68// //----------------------------------------------------------------------------
69// template <integral... Is>
70// auto operator()(Is const... is) const {
71// static_assert(sizeof...(is) == num_dimensions());
72// return at(is...);
73// }
74//
75// //----------------------------------------------------------------------------
76// private:
77// template <size_t... Is>
78// constexpr auto begin(std::index_sequence<Is...> [>seq<]) const {
79// return iterator{&m_grid, handle{std::array{((void)Is, size_t(0))...}, 0}};
80// }
81// //----------------------------------------------------------------------------
82// public:
83// constexpr auto begin() const { return begin(seq_t{}); }
84// //----------------------------------------------------------------------------
85// private:
86// template <size_t... Is>
87// constexpr auto end(std::index_sequence<Is...> [>seq<]) const {
88// auto it = iterator{
89// &m_grid, handle{std::array{((void)Is, size_t(0))...}, size()}};
90// it->indices()[num_dimensions() - 1] =
91// m_grid.template size<num_dimensions() - 1>();
92// return it;
93// }
94// //----------------------------------------------------------------------------
95// public:
96// constexpr auto end() const { return end(seq_t{}); }
97 //----------------------------------------------------------------------------
98 private:
99 template <size_t... Is>
100 constexpr auto size(std::index_sequence<Is...> /*seq*/) const {
101 return ((m_grid.template size<Is>() - 1) * ...);
102 }
103 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
104 public:
105 constexpr auto size() const { return size(seq_t{}); }
106 //----------------------------------------------------------------------------
107 private:
109 template <invocable<decltype(((void)std::declval<Dimensions>(), size_t{}))...>
110 Iteration,
111 size_t... Ds>
112 auto iterate_indices(Iteration&& iteration,
114 std::index_sequence<Ds...> /*seq*/) const
115 -> decltype(auto) {
116 return tatooine::for_loop(
117 std::forward<Iteration>(iteration), exec,
118 std::pair{size_t(0),
119 static_cast<size_t>(m_grid.template size<Ds>() - 1)}...);
120 }
121 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
122 public:
124 template <invocable<decltype(((void)std::declval<Dimensions>(), size_t{}))...>
125 Iteration>
126 auto iterate_indices(Iteration&& iteration, execution_policy::sequential_t exec) const
127 -> decltype(auto) {
128 return iterate_indices(std::forward<Iteration>(iteration), exec,
129 std::make_index_sequence<num_dimensions()>{});
130 }
131 //----------------------------------------------------------------------------
132 private:
134 template <invocable<decltype(((void)std::declval<Dimensions>(), size_t{}))...>
135 Iteration,
136 size_t... Ds>
137 auto iterate_indices(Iteration&& iteration, execution_policy::parallel_t exec,
138 std::index_sequence<Ds...> /*seq*/) const -> decltype(auto) {
139 return tatooine::for_loop(
140 std::forward<Iteration>(iteration), exec,
141 std::pair{size_t(0),
142 static_cast<size_t>(m_grid.template size<Ds>() - 1)}...);
143 }
144 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
145 public:
147 template <invocable<decltype(((void)std::declval<Dimensions>(), size_t{}))...>
148 Iteration>
149 auto iterate_indices(Iteration&& iteration, execution_policy::parallel_t exec) const
150 -> decltype(auto) {
151 return iterate_indices(std::forward<Iteration>(iteration), exec,
152 std::make_index_sequence<num_dimensions()>{});
153 }
154 //----------------------------------------------------------------------------
156 template <invocable<decltype(((void)std::declval<Dimensions>(), size_t{}))...>
157 Iteration>
158 auto iterate_indices(Iteration&& iteration) const -> decltype(auto) {
159 return iterate_indices(std::forward<Iteration>(iteration), execution_policy::sequential,
160 std::make_index_sequence<num_dimensions()>{});
161 }
162};
163//------------------------------------------------------------------------------
164//template <dimension... Dimensions>
165//auto begin(cell_container<Dimensions...> const& c) {
166// return c.begin();
167//}
169//template <dimension... Dimensions>
170//auto end(cell_container<Dimensions...> const& c) {
171// return c.end();
172//}
173//------------------------------------------------------------------------------
174template <dimension... Dimensions>
176 return c.size();
177}
178//==============================================================================
179} // namespace tatooine
180//==============================================================================
181#endif
Definition: rectilinear_grid.h:38
Definition: vtp_writer.h:3
Definition: algorithm.h:6
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto for_loop(Iteration &&iteration, execution_policy::sequential_t, Ranges(&&... ranges)[2]) -> void
Use this function for creating a sequential nested loop.
Definition: for_loop.h:336
auto iterate_indices(Iteration &&iteration, execution_policy::sequential_t exec, std::index_sequence< Ds... >) const -> decltype(auto)
Sequential iteration implementation.
Definition: cell_container.h:112
auto iterate_indices(Iteration &&iteration, execution_policy::parallel_t exec) const -> decltype(auto)
Parallel iteration.
Definition: cell_container.h:149
grid_t const & m_grid
Definition: cell_container.h:22
auto iterate_indices(Iteration &&iteration, execution_policy::sequential_t exec) const -> decltype(auto)
Sequential iteration.
Definition: cell_container.h:126
static constexpr auto num_dimensions() -> std::size_t
Definition: cell_container.h:30
auto iterate_indices(Iteration &&iteration) const -> decltype(auto)
Default iteration.
Definition: cell_container.h:158
auto iterate_indices(Iteration &&iteration, execution_policy::parallel_t exec, std::index_sequence< Ds... >) const -> decltype(auto)
Parallel iteration implementation.
Definition: cell_container.h:137
cell_container(grid_t const &g)
Definition: cell_container.h:32
constexpr auto size() const
Definition: cell_container.h:105
typename grid_t::seq_t seq_t
Definition: cell_container.h:29
constexpr auto size(std::index_sequence< Is... >) const
Definition: cell_container.h:100