Tatooine
vertex_container.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_POINTSET_VERTEX_CONTAINER_H
2#define TATOOINE_DETAIL_POINTSET_VERTEX_CONTAINER_H
3//==============================================================================
4#include <tatooine/pointset.h>
5//==============================================================================
7//==============================================================================
8struct sentinel {};
9template <floating_point Real, std::size_t NumDimensions>
11 : iterator_facade<const_vertex_container_iterator<Real, NumDimensions>> {
17 pointset_type const* ps)
18 : m_vh{vh}, m_pointset{ps} {}
20 const_vertex_container_iterator const& other) = default;
22 const_vertex_container_iterator&& other) noexcept = default;
28
29 private : vertex_handle m_vh{};
30 pointset_type const* m_pointset = nullptr;
31
32 public:
33 constexpr auto increment() {
34 do {
35 ++m_vh;
36 } while (!m_pointset->is_valid(m_vh));
37 }
38 constexpr auto decrement() {
39 do {
40 --m_vh;
41 } while (!m_pointset->is_valid(m_vh));
42 }
43
44 [[nodiscard]] constexpr auto equal(
45 const_vertex_container_iterator const& other) const {
46 return m_vh == other.m_vh;
47 }
48 [[nodiscard]] constexpr auto equal(sentinel_type const /*other*/) const {
49 return at_end();
50 }
51 [[nodiscard]] constexpr auto distance_to(
52 const_vertex_container_iterator const& other) const -> std::ptrdiff_t {
53 return other.m_vh.index() - m_vh.index();
54 }
55 [[nodiscard]] constexpr auto distance_to(
56 sentinel_type const /*sentinel*/) const -> std::ptrdiff_t {
57 return m_pointset->vertex_position_data().size() - m_vh.index();
58 }
59 constexpr auto advance(std::ptrdiff_t const off) {
60 m_vh += off;
61 }
62 [[nodiscard]] auto dereference() const { return m_vh; }
63
64 constexpr auto at_end() const {
65 return m_vh.index() == m_pointset->vertex_position_data().size();
66 }
67};
68//==============================================================================
69static_assert(std::input_or_output_iterator<
70 const_vertex_container_iterator<real_number, 2>>);
71//==============================================================================
72template <floating_point Real, std::size_t NumDimensions>
78 //==========================================================================
79 private:
81
82 public:
83 explicit const_vertex_container(pointset_type const* ps) : m_pointset{ps} {}
86 auto operator=(const_vertex_container const&)
87 -> const_vertex_container& = default;
88 auto operator=(const_vertex_container&&) noexcept
89 -> const_vertex_container& = default;
91 //==========================================================================
92 auto begin() const {
93 auto vi = iterator{vertex_handle{0}, m_pointset};
94 while (!m_pointset->is_valid(*vi)) {
95 ++vi;
96 }
97 return vi;
98 }
99 auto cbegin() const { return begin(); }
100 //--------------------------------------------------------------------------
101 static constexpr auto end() { return typename iterator::sentinel_type{}; }
102 //--------------------------------------------------------------------------
103 static constexpr auto cend() { return end(); }
104 //--------------------------------------------------------------------------
105 auto size() const {
106 return m_pointset->num_vertices();
107 }
108 auto data_container() const -> auto const& {
110 }
111 auto data() const { return data_container().data(); }
112 auto operator[](std::size_t const i) const {
113 return m_pointset->at(vertex_handle{i});
114 }
115 auto operator[](std::size_t const i) {
116 return m_pointset->at(vertex_handle{i});
117 }
118 auto operator[](vertex_handle const i) const { return m_pointset->at(i); }
119 auto operator[](vertex_handle const i) { return m_pointset->at(i); }
120 auto at(std::size_t const i) const {
121 return m_pointset->at(vertex_handle{i});
122 }
123 auto at(std::size_t const i) { return m_pointset->at(vertex_handle{i}); }
124 auto at(vertex_handle const i) const { return m_pointset->at(i); }
125 auto at(vertex_handle const i) { return m_pointset->at(i); }
126};
127//==============================================================================
128static_assert(std::ranges::range<const_vertex_container<real_number, 2>>);
129//static_assert(std::input_iterator<std::ranges::iterator_t<const_vertex_container<real_number, 2>>>);
130//static_assert(std::ranges::forward_range<const_vertex_container<real_number, 2>>);
131//static_assert(std::ranges::forward_range<const_vertex_container<real_number, 3>>);
132//==============================================================================
133template <typename Real, std::size_t NumDimensions>
135 : iterator_facade<vertex_container_iterator<Real, NumDimensions>> {
141 : m_vh{vh}, m_pointset{ps} {}
144 default;
146 -> vertex_container_iterator& = default;
148 -> vertex_container_iterator& = default;
150
151 private:
154
155 public:
156 constexpr auto increment() {
157 do {
158 ++m_vh;
159 } while (!m_pointset->is_valid(m_vh));
160 }
161 constexpr auto decrement() {
162 do {
163 --m_vh;
164 } while (!m_pointset->is_valid(m_vh));
165 }
166
167 [[nodiscard]] constexpr auto distance_to(
168 vertex_container_iterator const& other) const -> std::ptrdiff_t {
169 return other.m_vh.index() - m_vh.index();
170 }
171 [[nodiscard]] constexpr auto distance_to(
172 sentinel_type const /*sentinel*/) const -> std::ptrdiff_t {
173 return m_pointset->vertex_position_data().size() - m_vh.index();
174 }
175 constexpr auto advance(std::ptrdiff_t const off)
177 m_vh += off;
178 return *this;
179 }
180 [[nodiscard]] constexpr auto equal(
181 vertex_container_iterator const& other) const {
182 return m_vh == other.m_vh;
183 }
184 [[nodiscard]] auto dereference() const { return m_vh; }
185
186 constexpr auto at_end() const {
187 return m_vh.index() == m_pointset->vertex_position_data().size();
188 }
189};
190//==============================================================================
191template <floating_point Real, std::size_t NumDimensions>
197 //============================================================================
198 private:
200
201 public:
204 vertex_container(vertex_container&&) noexcept = default;
205 auto operator=(vertex_container const&) -> vertex_container& = default;
206 auto operator=(vertex_container&&) noexcept -> vertex_container& = default;
207 ~vertex_container() = default;
208 //==========================================================================
209 auto begin() const {
210 auto vi = iterator{vertex_handle{0}, m_pointset};
211 if (!m_pointset->is_valid(*vi)) {
212 ++vi;
213 }
214 return vi;
215 }
216 //--------------------------------------------------------------------------
217 auto cbegin() const {
219 if (!m_pointset->is_valid(*vi)) {
220 ++vi;
221 }
222 return vi;
223 }
224 //--------------------------------------------------------------------------
225 static constexpr auto end() { return typename iterator::sentinel_type{}; }
226 //--------------------------------------------------------------------------
227 static constexpr auto cend() { return typename const_iterator::sentinel_type{}; }
228 //--------------------------------------------------------------------------
229 auto size() const {
230 return m_pointset->vertex_position_data().size() -
232 }
233 auto data_container() const -> auto const& {
235 }
236 auto data() const { return data_container().data(); }
237 auto operator[](std::size_t const i) const {
238 return m_pointset->at(vertex_handle{i});
239 }
240 auto operator[](std::size_t const i) {
241 return m_pointset->at(vertex_handle{i});
242 }
243 auto operator[](vertex_handle const i) const { return m_pointset->at(i); }
244 auto operator[](vertex_handle const i) { return m_pointset->at(i); }
245 auto at(std::size_t const i) const {
246 return m_pointset->at(vertex_handle{i});
247 }
248 auto at(std::size_t const i) { return m_pointset->at(vertex_handle{i}); }
249 auto at(vertex_handle const i) const { return m_pointset->at(i); }
250 auto at(vertex_handle const i) { return m_pointset->at(i); }
251 auto resize(std::size_t const n) {
253 for (auto& [key, prop] : m_pointset->vertex_properties()) {
254 prop->resize(n);
255 }
256 }
257 auto reserve(std::size_t const n) {
259 for (auto& [key, prop] : m_pointset->vertex_properties()) {
260 prop->reserve(n);
261 }
262 }
263};
264//==============================================================================
265static_assert(std::ranges::forward_range<vertex_container<real_number, 2>>);
266//static_assert(std::ranges::forward_range<vertex_container<real_number, 3>>);
267//==============================================================================
268template <typename Real, std::size_t NumDimensions>
270 return verts.size();
271}
272//==============================================================================
273} // namespace tatooine::detail::pointset
274//==============================================================================
275namespace tatooine {
276//==============================================================================
277template <typename Real, std::size_t NumDimensions>
279 return ps.vertices();
280}
281//==============================================================================
282} // namespace tatooine
283//==============================================================================
284template <typename Real, std::size_t NumDimensions>
285inline constexpr auto std::ranges::enable_borrowed_range<
287 NumDimensions>> =
288 true;
289#endif
C++20 implementation of an iterator facade.
Definition: iterator_facade.h:154
Definition: inverse_distance_weighting_sampler.h:4
auto size(vertex_container< Real, NumDimensions > verts)
Definition: vertex_container.h:269
Definition: algorithm.h:6
auto vertices(pointset< Real, NumDimensions > const &ps)
Definition: vertex_container.h:278
constexpr auto equal(const_vertex_container_iterator const &other) const
Definition: vertex_container.h:44
const_vertex_container_iterator(const_vertex_container_iterator &&other) noexcept=default
constexpr auto equal(sentinel_type const) const
Definition: vertex_container.h:48
const_vertex_container_iterator(const_vertex_container_iterator const &other)=default
constexpr auto decrement()
Definition: vertex_container.h:38
constexpr auto increment()
Definition: vertex_container.h:33
constexpr auto advance(std::ptrdiff_t const off)
Definition: vertex_container.h:59
const_vertex_container_iterator(vertex_handle const vh, pointset_type const *ps)
Definition: vertex_container.h:16
pointset_type const * m_pointset
Definition: vertex_container.h:30
vertex_handle m_vh
Definition: vertex_container.h:29
constexpr auto distance_to(const_vertex_container_iterator const &other) const -> std::ptrdiff_t
Definition: vertex_container.h:51
typename pointset_type::vertex_handle vertex_handle
Definition: vertex_container.h:13
auto operator=(const_vertex_container_iterator const &other) -> const_vertex_container_iterator &=default
auto operator=(const_vertex_container_iterator &&other) noexcept -> const_vertex_container_iterator &=default
auto dereference() const
Definition: vertex_container.h:62
constexpr auto distance_to(sentinel_type const) const -> std::ptrdiff_t
Definition: vertex_container.h:55
constexpr auto at_end() const
Definition: vertex_container.h:64
pointset_type const * m_pointset
Definition: vertex_container.h:80
auto data_container() const -> auto const &
Definition: vertex_container.h:108
auto operator[](std::size_t const i)
Definition: vertex_container.h:115
auto at(vertex_handle const i)
Definition: vertex_container.h:125
const_vertex_container(pointset_type const *ps)
Definition: vertex_container.h:83
auto cbegin() const
Definition: vertex_container.h:99
auto at(std::size_t const i) const
Definition: vertex_container.h:120
const_vertex_container(const_vertex_container const &)=default
auto data() const
Definition: vertex_container.h:111
static constexpr auto cend()
Definition: vertex_container.h:103
auto at(std::size_t const i)
Definition: vertex_container.h:123
auto operator[](vertex_handle const i) const
Definition: vertex_container.h:118
static constexpr auto end()
Definition: vertex_container.h:101
typename pointset_type::vertex_handle vertex_handle
Definition: vertex_container.h:75
auto operator[](vertex_handle const i)
Definition: vertex_container.h:119
auto operator[](std::size_t const i) const
Definition: vertex_container.h:112
auto begin() const
Definition: vertex_container.h:92
auto at(vertex_handle const i) const
Definition: vertex_container.h:124
const_vertex_container(const_vertex_container &&) noexcept=default
auto size() const
Definition: vertex_container.h:105
Definition: vertex_container.h:8
vertex_container_iterator(vertex_container_iterator const &other)=default
constexpr auto decrement()
Definition: vertex_container.h:161
auto dereference() const
Definition: vertex_container.h:184
vertex_container_iterator(vertex_container_iterator &&other) noexcept=default
constexpr auto distance_to(sentinel_type const) const -> std::ptrdiff_t
Definition: vertex_container.h:171
vertex_handle m_vh
Definition: vertex_container.h:152
constexpr auto advance(std::ptrdiff_t const off) -> vertex_container_iterator &
Definition: vertex_container.h:175
auto operator=(vertex_container_iterator &&other) noexcept -> vertex_container_iterator &=default
typename pointset_type::vertex_handle vertex_handle
Definition: vertex_container.h:137
constexpr auto equal(vertex_container_iterator const &other) const
Definition: vertex_container.h:180
auto operator=(vertex_container_iterator const &other) -> vertex_container_iterator &=default
constexpr auto distance_to(vertex_container_iterator const &other) const -> std::ptrdiff_t
Definition: vertex_container.h:167
constexpr auto at_end() const
Definition: vertex_container.h:186
constexpr auto increment()
Definition: vertex_container.h:156
vertex_container_iterator(vertex_handle const vh, pointset_type *ps)
Definition: vertex_container.h:140
pointset_type * m_pointset
Definition: vertex_container.h:153
Definition: vertex_container.h:192
vertex_container(vertex_container &&) noexcept=default
auto begin() const
Definition: vertex_container.h:209
auto operator[](vertex_handle const i)
Definition: vertex_container.h:244
auto at(vertex_handle const i)
Definition: vertex_container.h:250
auto size() const
Definition: vertex_container.h:229
static constexpr auto end()
Definition: vertex_container.h:225
auto operator[](std::size_t const i) const
Definition: vertex_container.h:237
auto operator[](std::size_t const i)
Definition: vertex_container.h:240
auto reserve(std::size_t const n)
Definition: vertex_container.h:257
auto cbegin() const
Definition: vertex_container.h:217
auto operator[](vertex_handle const i) const
Definition: vertex_container.h:243
auto data_container() const -> auto const &
Definition: vertex_container.h:233
vertex_container(pointset_type *ps)
Definition: vertex_container.h:202
auto at(std::size_t const i) const
Definition: vertex_container.h:245
static constexpr auto cend()
Definition: vertex_container.h:227
pointset_type * m_pointset
Definition: vertex_container.h:199
typename pointset_type::vertex_handle vertex_handle
Definition: vertex_container.h:194
auto data() const
Definition: vertex_container.h:236
auto at(std::size_t const i)
Definition: vertex_container.h:248
vertex_container(vertex_container const &)=default
auto resize(std::size_t const n)
Definition: vertex_container.h:251
auto at(vertex_handle const i) const
Definition: vertex_container.h:249
Definition: pointset.h:83
Definition: pointset.h:69
auto num_vertices() const
Definition: pointset.h:229
auto at(vertex_handle const v) -> auto &
Definition: pointset.h:198
auto vertex_position_data() const -> auto const &
Definition: pointset.h:235
auto invalid_vertices() const -> auto const &
Definition: pointset.h:239
auto vertices() const
Definition: pointset.h:226
constexpr auto is_valid(vertex_handle const v) const -> bool
Definition: pointset.h:347
std::vector< pos_type > m_vertex_position_data
Definition: pointset.h:115
auto vertex_properties() const -> auto const &
Definition: pointset.h:191