Tatooine
vertex_container.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_CONTAINER_H
2#define TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_CONTAINER_H
3//==============================================================================
4#include <tatooine/concepts.h>
7#include <tatooine/for_loop.h>
9//==============================================================================
10namespace tatooine {
11//==============================================================================
12template <floating_point_range... Dimensions>
13requires(sizeof...(Dimensions) > 1)
14class rectilinear_grid;
15//==============================================================================
16} // namespace tatooine
17//==============================================================================
18namespace tatooine::detail::rectilinear_grid {
19template <typename... Dimensions>
21 using grid_type = tatooine::rectilinear_grid<Dimensions...>;
22 using iterator = vertex_iterator<Dimensions...>;
25 using pos_type = typename grid_type::pos_type;
27 static constexpr auto num_dimensions() -> std::size_t { return sizeof...(Dimensions); }
28 //----------------------------------------------------------------------------
29 private:
31 //----------------------------------------------------------------------------
32 public:
33 vertex_container(grid_type const& g) : m_grid{g} {}
34 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
35 public:
36 auto at(integral auto const... is) const {
37 static_assert(sizeof...(is) == num_dimensions());
38 return m_grid.vertex_at(is...);
39 }
40 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
41 auto at(handle const& h) const { return m_grid.vertex_at(h); }
42 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43 auto operator[](handle const& h) const { return m_grid.vertex_at(h); }
44 //----------------------------------------------------------------------------
45 auto operator()(integral auto const... is) const {
46 static_assert(sizeof...(is) == num_dimensions());
47 return at(is...);
48 }
49
50 //----------------------------------------------------------------------------
51 private:
52 template <std::size_t... Is>
53 constexpr auto begin(std::index_sequence<Is...> /*seq*/) const {
54 return iterator{&m_grid,
55 handle{std::array{((void)Is, std::size_t(0))...}, 0}};
56 }
57 //----------------------------------------------------------------------------
58 public:
59 constexpr auto begin() const { return begin(sequence_type{}); }
60 //----------------------------------------------------------------------------
61 private:
62 template <std::size_t... Is>
63 constexpr auto end(std::index_sequence<Is...> /*seq*/) const {
64 auto it = iterator{
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>();
68 return it;
69 }
70 //----------------------------------------------------------------------------
71 public:
72 constexpr auto end() const { return end(sequence_type{}); }
73 //----------------------------------------------------------------------------
74 private:
75 template <std::size_t... Is>
76 constexpr auto size(std::index_sequence<Is...> /*seq*/) const {
77 return (m_grid.template size<Is>() * ...);
78 }
79 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
80 public:
81 constexpr auto size() const { return size(sequence_type{}); }
82 //----------------------------------------------------------------------------
83 private:
84 template <
86 Iteration,
87 std::size_t... Ds>
88 auto iterate_indices(Iteration&& iteration,
89 execution_policy_tag auto const exec,
90 std::index_sequence<Ds...>) const -> decltype(auto) {
91 return tatooine::for_loop(
92 std::forward<Iteration>(iteration), exec,
93 static_cast<std::size_t>(m_grid.template size<Ds>())...);
94 }
95 //----------------------------------------------------------------------------
96 public:
97 template <
99 Iteration>
100 auto iterate_indices(Iteration&& iteration,
101 execution_policy_tag auto const exec) const
102 -> decltype(auto) {
103 return iterate_indices(std::forward<Iteration>(iteration), exec,
104 std::make_index_sequence<num_dimensions()>{});
105 }
106 //------------------------------------------------------------------------------
107 template <
109 Iteration>
110 auto iterate_indices(Iteration&& iteration) const -> decltype(auto) {
111 return iterate_indices(std::forward<Iteration>(iteration),
112 execution_policy::sequential,
113 std::make_index_sequence<num_dimensions()>{});
114 }
115 //------------------------------------------------------------------------------
116 template <invocable<pos_type> Iteration>
117 auto iterate_positions(Iteration&& iteration) const -> decltype(auto) {
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()>{});
123 }
124 //------------------------------------------------------------------------------
125 template <invocable<pos_type> Iteration>
126 auto iterate_positions(Iteration&& iteration,
127 execution_policy_tag auto const exec) const
128 -> decltype(auto) {
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()>{});
133 }
134};
135//------------------------------------------------------------------------------
136template <dimension... Dimensions>
138 return c.begin();
139}
140//------------------------------------------------------------------------------
141template <dimension... Dimensions>
143 return c.end();
144}
145//------------------------------------------------------------------------------
146template <dimension... Dimensions>
148 return c.size();
149}
150//==============================================================================
151} // namespace tatooine::detail::rectilinear_grid
152//==============================================================================
153#endif
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: tags.h:72
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
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