1#ifndef TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_CONTAINER_H
2#define TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_CONTAINER_H
12template <floating_point_range... Dimensions>
13requires(
sizeof...(Dimensions) > 1)
14class rectilinear_grid;
19template <
typename... Dimensions>
27 static constexpr auto num_dimensions() -> std::size_t {
return sizeof...(Dimensions); }
37 static_assert(
sizeof...(is) == num_dimensions());
46 static_assert(
sizeof...(is) == num_dimensions());
52 template <std::size_t... Is>
53 constexpr auto begin(std::index_sequence<Is...> )
const {
55 handle{std::array{((void)Is, std::size_t(0))...}, 0}};
62 template <std::size_t... Is>
63 constexpr auto end(std::index_sequence<Is...> )
const {
65 &m_grid,
handle{std::array{((void)Is, std::size_t(0))...},
size()}};
66 it->indices()[num_dimensions() - 1] =
67 m_grid.template
size<num_dimensions() - 1>();
75 template <std::size_t... Is>
76 constexpr auto size(std::index_sequence<Is...> )
const {
77 return (m_grid.template size<Is>() * ...);
90 std::index_sequence<Ds...>)
const ->
decltype(
auto) {
92 std::forward<Iteration>(iteration), exec,
93 static_cast<std::size_t
>(m_grid.template size<Ds>())...);
103 return iterate_indices(std::forward<Iteration>(iteration), exec,
104 std::make_index_sequence<num_dimensions()>{});
111 return iterate_indices(std::forward<Iteration>(iteration),
112 execution_policy::sequential,
113 std::make_index_sequence<num_dimensions()>{});
116 template <invocable<pos_type> Iteration>
118 return iterate_indices(
119 [
this, iteration = std::forward<Iteration>(iteration)](
120 auto const... is) { iteration(this->at(is...)); },
121 execution_policy::sequential,
122 std::make_index_sequence<num_dimensions()>{});
125 template <invocable<pos_type> Iteration>
129 return iterate_indices(
130 [
this, iteration = std::forward<Iteration>(iteration)](
131 auto const... is) { iteration(this->at(is...)); },
132 exec, std::make_index_sequence<num_dimensions()>{});
136template <dimension... Dimensions>
141template <dimension... Dimensions>
146template <dimension... Dimensions>
Definition: rectilinear_grid.h:38
auto vertex_at(std::index_sequence< DIs... >, std::array< Int, num_dimensions()> const &is) const -> vec< real_type, num_dimensions()>
Definition: rectilinear_grid.h:640
std::make_index_sequence< num_dimensions()> sequence_type
Definition: rectilinear_grid.h:49
Definition: concepts.h:21
Definition: concepts.h:121
Definition: vtp_writer.h:3
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 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
Definition: vertex_container.h:20
auto iterate_positions(Iteration &&iteration) const -> decltype(auto)
Definition: vertex_container.h:117
auto at(handle const &h) const
Definition: vertex_container.h:41
constexpr auto size(std::index_sequence< Is... >) const
Definition: vertex_container.h:76
grid_type const & m_grid
Definition: vertex_container.h:30
auto iterate_indices(Iteration &&iteration, execution_policy_tag auto const exec) const -> decltype(auto)
Definition: vertex_container.h:100
auto operator()(integral auto const ... is) const
Definition: vertex_container.h:45
typename grid_type::sequence_type sequence_type
Definition: vertex_container.h:26
static constexpr auto num_dimensions() -> std::size_t
Definition: vertex_container.h:27
auto operator[](handle const &h) const
Definition: vertex_container.h:43
auto iterate_positions(Iteration &&iteration, execution_policy_tag auto const exec) const -> decltype(auto)
Definition: vertex_container.h:126
constexpr auto end(std::index_sequence< Is... >) const
Definition: vertex_container.h:63
auto iterate_indices(Iteration &&iteration) const -> decltype(auto)
Definition: vertex_container.h:110
auto at(integral auto const ... is) const
Definition: vertex_container.h:36
constexpr auto begin(std::index_sequence< Is... >) const
Definition: vertex_container.h:53
constexpr auto end() const
Definition: vertex_container.h:72
typename grid_type::vertex_handle handle
Definition: vertex_container.h:24
constexpr auto size() const
Definition: vertex_container.h:81
auto iterate_indices(Iteration &&iteration, execution_policy_tag auto const exec, std::index_sequence< Ds... >) const -> decltype(auto)
Definition: vertex_container.h:88
constexpr auto begin() const
Definition: vertex_container.h:59
typename grid_type::pos_type pos_type
Definition: vertex_container.h:25
vertex_container(grid_type const &g)
Definition: vertex_container.h:33
Definition: vertex_handle.h:10
Definition: vertex_iterator.h:27