Tatooine
subgrid.h
Go to the documentation of this file.
1#ifndef TATOOINE_SUBGRID_H
2#define TATOOINE_SUBGRID_H
3
4#include <cstddef>
5#include <functional>
6
7#include "grid_vertex.h"
8
9//==============================================================================
10namespace tatooine {
11//==============================================================================
12
13template <typename Real, size_t N>
14struct subgrid {
15 subgrid(const grid_vertex<Real, N>& begin, const grid_vertex<Real, N>& end)
17
18 //------------------------------------------------------------------------
19
20 grid_vertex<Real, N> m_begin_vertex, m_end_vertex;
21
22 //------------------------------------------------------------------------
23
24 struct vertex_iterator;
25
26 //----------------------------------------------------------------------------
27
28 auto begin() { return vertex_iterator{m_begin_vertex, this}; }
29
30 //----------------------------------------------------------------------------
31
32 auto end() {
33 auto actual_end_vertex = m_begin_vertex;
34 actual_end_vertex.iterators.back() = m_end_vertex.iterators.back();
35 return vertex_iterator{actual_end_vertex, this};
36 }
37};
38
39//==============================================================================
40
41template <typename Real, size_t N>
42struct subgrid<Real, N>::vertex_iterator {
43 grid_vertex<Real, N> v;
45 //----------------------------------------------------------------------------
46 auto operator++() -> auto& {
47 ++v.iterators.front();
48 for (size_t i = 0; i < N - 1; ++i) {
49 if (v.iterators[i] == m_subgrid->m_end_vertex.iterators[i]) {
50 v.iterators[i] = m_subgrid->m_begin_vertex.iterators[i];
51 ++v.iterators[i + 1];
52 }
53 }
54 return *this;
55 }
56 //----------------------------------------------------------------------------
57 auto operator--() -> auto& {
58 for (size_t i = 0; i < N; ++i) {
59 if (v.iterators[i] == m_subgrid->begin_vertex.iterators[i]) {
60 v.iterators[i] = m_subgrid->end_vertex.iterators[i];
61 --v.iterators[i];
62 } else {
63 --v.iterators[i];
64 break;
65 }
66 }
67 return *this;
68 }
69 //----------------------------------------------------------------------------
70 auto operator*() { return v; }
71 auto operator==(const vertex_iterator& other) { return v == other.v; }
72 auto operator!=(const vertex_iterator& other) { return v != other.v; }
73};
74
75//==============================================================================
76} // namespace tatooine
77//==============================================================================
78#endif
Definition: algorithm.h:6
Definition: subgrid.h:42
auto operator==(const vertex_iterator &other)
Definition: subgrid.h:71
auto operator*()
Definition: subgrid.h:70
auto operator!=(const vertex_iterator &other)
Definition: subgrid.h:72
grid_vertex< Real, N > v
Definition: subgrid.h:43
auto operator--() -> auto &
Definition: subgrid.h:57
subgrid< Real, N > * m_subgrid
Definition: subgrid.h:44
auto operator++() -> auto &
Definition: subgrid.h:46
Definition: subgrid.h:14
grid_vertex< Real, N > m_begin_vertex
Definition: subgrid.h:20
subgrid(const grid_vertex< Real, N > &begin, const grid_vertex< Real, N > &end)
Definition: subgrid.h:15
auto end()
Definition: subgrid.h:32
grid_vertex< Real, N > m_end_vertex
Definition: subgrid.h:20
auto begin()
Definition: subgrid.h:28