5#include <unordered_map>
6#include <unordered_set>
9#include "grid_vertex.h"
15template <rectilinear_grid_dimension... IndexableSpaces>
17template <
typename Real,
size_t N>
19template <
typename Real,
size_t N>
21template <
typename Real,
size_t N>
23 :
public std::pair<grid_vertex<Real, N>, grid_vertex<Real, N>> {
40 return std::pair{*this->first, *this->second};
46 return (this->first == other.second && this->second == other.first) ||
47 (this->first == other.first && this->second == other.second);
55 for (
size_t i = 0; i < N; ++i) {
56 if (this->first.iterators[i].i() < other.first.iterators[i].i()) {
59 if (this->first.iterators[i].i() > other.first.iterators[i].i()) {
63 for (
size_t i = 0; i < N; ++i) {
64 if (this->second.iterators[i].i() < other.second.iterators[i].i()) {
67 if (this->second.iterators[i].i() > other.second.iterators[i].i()) {
79 for (
size_t i = 0; i < N; ++i) {
80 if (this->first.iterators[i].i > other.first.iterators[i].i) {
83 if (this->first.iterators[i].i < other.first.iterators[i].i) {
87 for (
size_t i = 0; i < N; ++i) {
88 if (this->second.iterators[i].i > other.second.iterators[i].i) {
91 if (this->second.iterators[i].i < other.second.iterators[i].i) {
103 return this->first.to_string() +
' ' + this->second.to_string();
107template <
typename Real,
size_t N>
110 out << e.first <<
" - " << e.second;
114template <
typename Real,
size_t N>
116 template <
size_t... Is>
118 std::index_sequence<Is...> ) {
119 return (
ipow(3, Is) + ...);
126 template <
size_t... Is>
132 if (((is != 1) || ...)) {
134 for (
size_t j = 0; j < N / 2; ++j) {
135 tat_swap(dirs[i](j), dirs[i][N - j - 1]);
152 auto base_it =
begin(bs);
154 for (
size_t i = 0; i < N; ++i) {
155 if (dir(i) < 0) { base_it->at(i) = 1; }
169 grid_vertex_iterator<Real, N>
m_vit;
174 grid_vertex_iterator<Real, N>&& vit,
188 return m_grid == other.m_grid &&
m_vit == other.m_vit &&
192 return m_grid != other.m_grid ||
m_vit != other.m_vit ||
196 if (
m_vit < other.m_vit) {
return true; }
197 if (
m_vit > other.m_vit) {
return false; }
202 for (
size_t i = 0; i < N; ++i) { v0.index(i) +=
bases[
m_edge_idx](i); }
205 return grid_edge{std::move(v0), std::move(v1)};
210 for (
size_t i = 0; i < N; ++i) {
212 if (v0.index(i) != 0) {
217 if (v0.index(i) !=
m_grid->dimension(i).size()) {
223 if (is_end &&
m_edge_idx == 0) {
return true; }
225 for (
size_t i = 0; i < N; ++i) { v0.index(i) +=
bases[
m_edge_idx](i); }
229 for (
size_t i = 0; i < N; ++i) {
230 if (v0.index(i) >=
m_grid->dimension(i).size()) {
return false; }
232 for (
size_t i = 0; i < N; ++i) {
233 if (v1.index(i) >=
m_grid->dimension(i).size()) {
return false; }
239template <
typename Real,
size_t N>
Definition: grid_edge.h:240
grid< Real, N > const * m_grid
Definition: grid_edge.h:241
auto begin() const
Definition: grid_edge.h:245
grid_edge_container(grid< Real, N >const *g)
Definition: grid_edge.h:244
auto end() const
Definition: grid_edge.h:248
Definition: grid_edge.h:115
auto operator<(const grid_edge_iterator< Real, N > &other) const -> bool
Definition: grid_edge.h:195
auto operator==(const grid_edge_iterator< Real, N > &other) const -> bool
Definition: grid_edge.h:187
static constexpr size_t calc_max_num_edges_per_cell()
Definition: grid_edge.h:122
auto is_valid() const -> bool
Definition: grid_edge.h:207
auto operator!=(const grid_edge_iterator< Real, N > &other) const -> bool
Definition: grid_edge.h:191
grid_vertex_iterator< Real, N > m_vit
Definition: grid_edge.h:169
auto operator++() -> auto &
Definition: grid_edge.h:177
static constexpr auto max_num_edges_per_cell
Definition: grid_edge.h:163
static constexpr auto calc_edge_dirs()
Definition: grid_edge.h:145
static constexpr size_t calc_max_num_edges_per_cell(std::index_sequence< Is... >)
Definition: grid_edge.h:117
grid< Real, N > const * m_grid
Definition: grid_edge.h:168
static constexpr auto calc_bases()
Definition: grid_edge.h:149
size_t m_edge_idx
Definition: grid_edge.h:170
static constexpr auto calc_edge_dirs(std::index_sequence< Is... >)
Definition: grid_edge.h:127
static constexpr auto bases
Definition: grid_edge.h:165
static constexpr auto edge_dirs
Definition: grid_edge.h:164
grid_edge_iterator(grid< Real, N >const *g, grid_vertex_iterator< Real, N > &&vit, size_t edge_idx)
Definition: grid_edge.h:173
auto operator*() const -> grid_edge< Real, N >
Definition: grid_edge.h:200
Definition: grid_edge.h:16
Definition: algorithm.h:6
auto operator<<(std::ostream &out, linspace< Real > const &l) -> auto &
Definition: linspace.h:165
auto begin(Range &&range)
Definition: iterator_facade.h:318
constexpr void tat_swap(T &t0, T &t1)
Definition: utility.h:81
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
constexpr auto ipow(integral auto const base, integral auto const exp)
Definition: math.h:97
constexpr auto min(A &&a, B &&b)
Definition: math.h:15
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
Definition: grid_edge.h:23
auto operator<=(const grid_edge &other) const -> bool
Definition: grid_edge.h:74
auto operator<(const grid_edge &other) const -> bool
Definition: grid_edge.h:54
grid_edge(const vertex_t &v0, const vertex_t &v1)
Definition: grid_edge.h:27
grid_edge(const grid_edge &e)
Definition: grid_edge.h:30
auto operator!=(const grid_edge &other) const -> bool
Definition: grid_edge.h:50
auto operator==(const grid_edge &other) const -> bool
Definition: grid_edge.h:45
auto operator=(grid_edge &&e) noexcept -> grid_edge &=default
auto operator*() const
Definition: grid_edge.h:43
auto operator=(const grid_edge &e) -> grid_edge &=default
grid_edge(grid_edge &&e) noexcept
Definition: grid_edge.h:32
auto to_string()
Definition: grid_edge.h:102
auto operator>(const grid_edge &other) const -> bool
Definition: grid_edge.h:78
std::pair< vertex_t, vertex_t > parent_type
Definition: grid_edge.h:25
auto operator>=(const grid_edge &other) const -> bool
Definition: grid_edge.h:98
auto as_position_pair() const
Definition: grid_edge.h:39
grid_vertex< Real, N > vertex_t
Definition: grid_edge.h:24
static auto constexpr zeros()
Definition: vec.h:26