1#ifndef TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_ITERATOR_H
2#define TATOOINE_DETAIL_RECTILINEAR_GRID_VERTEX_ITERATOR_H
7#include <boost/iterator/iterator_facade.hpp>
15template <floating_point_range... Dimensions>
16requires(
sizeof...(Dimensions) > 1)
17class rectilinear_grid;
23template <
typename... Dimensions>
25 : boost::iterator_facade<vertex_iterator<Dimensions...>,
26 vertex_handle<sizeof...(Dimensions)>,
27 boost::bidirectional_traversal_tag> {
29 return sizeof...(Dimensions);
37 friend class boost::iterator_core_access;
46 : m_grid{g}, m_handle{h} {}
56 return m_handle == other.m_handle;
59 constexpr auto dereference() const -> auto& {
return m_handle; }
63 if (!stop && m_handle.
indices()[I] == 0) {
64 m_handle.
indices()[I] = m_grid->template size<I>() - 1;
71 template <
size_t... Is>
72 constexpr auto decrement(std::index_sequence<Is...> ) {
75 (decrement_check<Is>(stop), ...);
80 return decrement(std::make_index_sequence<num_dimensions() - 1>{});
85 if (!stop && m_handle.
indices()[I] == m_grid->template size<I>()) {
93 template <
size_t... Is>
94 constexpr auto increment(std::index_sequence<Is...> ) {
98 (increment_check<Is>(stop), ...);
103 return increment(std::make_index_sequence<num_dimensions() - 1>{});
109 return m_handle < other.m_handle;
113 return m_handle <= other.m_handle;
117 return m_handle > other.m_handle;
121 return m_handle >= other.m_handle;
125template <dimension... Dimensions>
127 for (
size_t i = 0; i < num; ++i) {
Definition: rectilinear_grid.h:38
Definition: vtp_writer.h:3
Definition: algorithm.h:6
auto next(Iter iter)
Definition: iterator_facade.h:325
constexpr auto plain_index() const -> auto const &
Definition: vertex_handle.h:37
constexpr auto indices() const -> auto const &
Definition: vertex_handle.h:31
Definition: vertex_iterator.h:27
constexpr auto operator<(vertex_iterator const &other) const -> bool
Definition: vertex_iterator.h:108
constexpr auto increment()
Definition: vertex_iterator.h:102
constexpr auto dereference() const -> auto &
Definition: vertex_iterator.h:59
constexpr auto operator>(vertex_iterator const &other) const -> bool
Definition: vertex_iterator.h:116
constexpr auto increment_check(bool &stop)
Definition: vertex_iterator.h:84
vertex_iterator(vertex_iterator &&) noexcept=default
constexpr auto decrement()
Definition: vertex_iterator.h:79
std::bidirectional_iterator_tag iterator_category
Definition: vertex_iterator.h:36
grid_t const *const m_grid
Definition: vertex_iterator.h:40
vertex_handle< num_dimensions()> m_handle
Definition: vertex_iterator.h:41
constexpr auto operator>=(vertex_iterator const &other) const -> bool
Definition: vertex_iterator.h:120
vertex_iterator(grid_t const *const g, vertex_handle< num_dimensions()> const &h)
Definition: vertex_iterator.h:44
size_t difference_type
Definition: vertex_iterator.h:31
constexpr auto decrement_check(bool &stop)
Definition: vertex_iterator.h:62
vertex_iterator(vertex_iterator const &)=default
constexpr auto decrement(std::index_sequence< Is... >)
Definition: vertex_iterator.h:72
static constexpr auto num_dimensions() -> std::size_t
Definition: vertex_iterator.h:28
constexpr auto increment(std::index_sequence< Is... >)
Definition: vertex_iterator.h:94
constexpr auto operator<=(vertex_iterator const &other) const -> bool
Definition: vertex_iterator.h:112