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