Tatooine
simplex_container.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_SIMPLEX_CONTAINER_H
2#define TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_SIMPLEX_CONTAINER_H
3//==============================================================================
5//==============================================================================
7//==============================================================================
8template <floating_point Real, std::size_t NumDimensions,
9 std::size_t SimplexDim>
11 using grid_type =
14 //----------------------------------------------------------------------------
15 struct iterator : iterator_facade<iterator> {
16 struct sentinel_type {};
17 iterator() = default;
18 iterator(handle_type const ch, grid_type const* ps) : m_ch{ch}, m_ps{ps} {}
19 iterator(iterator const& other) : m_ch{other.m_ch}, m_ps{other.m_ps} {}
20
21 private:
23 grid_type const* m_ps = nullptr;
24
25 public:
26 constexpr auto increment() {
27 do {
28 ++m_ch;
29 } while (!m_ps->is_valid(m_ch));
30 }
31 constexpr auto decrement() {
32 do {
33 --m_ch;
34 } while (!m_ps->is_valid(m_ch));
35 }
36
37 [[nodiscard]] constexpr auto equal(iterator const& other) const {
38 return m_ch == other.m_ch;
39 }
40 [[nodiscard]] auto dereference() const { return m_ch; }
41
42 constexpr auto at_end() const {
43 return m_ch.index() == m_ps->simplex_index_data().size();
44 }
45 };
46 //--------------------------------------------------------------------------
48 //--------------------------------------------------------------------------
49 auto begin() const {
51 if (!m_grid->is_valid(*vi)) {
52 ++vi;
53 }
54 return vi;
55 }
56 //--------------------------------------------------------------------------
57 auto end() const { return iterator{handle_type{size()}, m_grid}; }
58 //--------------------------------------------------------------------------
59 auto size() const {
60 return m_grid->simplex_index_data().size() /
62 m_grid->invalid_simplices().size();
63 }
64 auto data_container() const -> auto const& {
65 return m_grid->simplex_index_data();
66 }
67 auto data() const { return m_grid->simplex_index_data().data(); }
68 auto operator[](std::size_t const i) const { return m_grid->at(handle_type{i}); }
69 auto operator[](std::size_t const i) { return m_grid->at(handle_type{i}); }
70 auto operator[](handle_type const i) const { return m_grid->at(i); }
71 auto operator[](handle_type const i) { return m_grid->at(i); }
72 auto at(std::size_t const i) const { return m_grid->at(handle_type{i}); }
73 auto at(std::size_t const i) { return m_grid->at(handle_type{i}); }
74 auto at(handle_type const i) const { return m_grid->at(i); }
75 auto at(handle_type const i) { return m_grid->at(i); }
76};
77//------------------------------------------------------------------------------
78template <floating_point Real, size_t NumDimensions, std::size_t SimplexDim>
80 return simplices.begin();
81}
82//------------------------------------------------------------------------------
83template <floating_point Real, size_t NumDimensions, std::size_t SimplexDim>
85 return simplices.end();
86}
87//------------------------------------------------------------------------------
88template <floating_point Real, size_t NumDimensions, std::size_t SimplexDim>
90 return simplices.size();
91}
92//==============================================================================
93} // namespace tatooine::detail::unstructured_simplicial_grid
94//==============================================================================
95template <tatooine::floating_point Real, std::size_t NumDimensions,
96 std::size_t SimplexDim>
97inline constexpr bool std::ranges::enable_borrowed_range<
99 Real, NumDimensions, SimplexDim>> = true;
100//==============================================================================
101#endif
C++20 implementation of an iterator facade.
Definition: iterator_facade.h:154
Definition: concepts.h:30
Definition: edge_vtp_writer.h:12
auto size(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:89
auto begin(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:79
auto end(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:84
iterator(iterator const &other)
Definition: simplex_container.h:19
constexpr auto increment()
Definition: simplex_container.h:26
constexpr auto at_end() const
Definition: simplex_container.h:42
iterator(handle_type const ch, grid_type const *ps)
Definition: simplex_container.h:18
constexpr auto decrement()
Definition: simplex_container.h:31
grid_type const * m_ps
Definition: simplex_container.h:23
constexpr auto equal(iterator const &other) const
Definition: simplex_container.h:37
auto at(handle_type const i)
Definition: simplex_container.h:75
auto operator[](std::size_t const i)
Definition: simplex_container.h:69
auto at(std::size_t const i) const
Definition: simplex_container.h:72
auto data_container() const -> auto const &
Definition: simplex_container.h:64
typename grid_type::simplex_handle handle_type
Definition: simplex_container.h:13
auto end() const
Definition: simplex_container.h:57
auto at(std::size_t const i)
Definition: simplex_container.h:73
auto operator[](std::size_t const i) const
Definition: simplex_container.h:68
auto operator[](handle_type const i)
Definition: simplex_container.h:71
auto data() const
Definition: simplex_container.h:67
grid_type const * m_grid
Definition: simplex_container.h:47
auto at(handle_type const i) const
Definition: simplex_container.h:74
auto size() const
Definition: simplex_container.h:59
auto operator[](handle_type const i) const
Definition: simplex_container.h:70
auto begin() const
Definition: simplex_container.h:49
Definition: unstructured_simplicial_grid.h:87
Definition: unstructured_simplicial_grid.h:52
constexpr auto is_valid(simplex_handle t) const
Definition: unstructured_simplicial_grid.h:1181
static constexpr auto num_vertices_per_simplex()
Definition: unstructured_simplicial_grid.h:84
auto simplex_index_data() const -> auto const &
Definition: unstructured_simplicial_grid.h:112
auto at(simplex_handle t) const -> auto
Definition: unstructured_simplicial_grid.h:300
auto invalid_simplices() const -> auto const &
Definition: unstructured_simplicial_grid.h:115