Dune-Fufem 2.12-git
Loading...
Searching...
No Matches
intersectionsetiterator.hh
Go to the documentation of this file.
1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set ts=8 sw=2 et sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUFEM_DOMAINS_INTERSECTIONSETITERATOR_HH
8#define DUNE_FUFEM_DOMAINS_INTERSECTIONSETITERATOR_HH
9
10#include <iterator>
11#include <optional>
12#include <type_traits>
13#include <utility>
14#include <variant>
15
18
19
20
21namespace Dune::Fufem {
22
23
24
51template <class IS>
53 : public Dune::IteratorFacade<IntersectionSetIterator<IS>, std::forward_iterator_tag, const typename IS::GridView::Intersection>
54{
55 using IntersectionSet = IS;
56 using Facade = Dune::IteratorFacade<IntersectionSetIterator<IS>, std::forward_iterator_tag, const typename IS::GridView::Intersection>;
57
58 using GridView = typename IntersectionSet::GridView;
59 using Element = typename GridView::template Codim<0>::Entity;
60 using ElementIterator = typename GridView::template Codim<0>::Iterator;
61 using IntersectionIterator = typename GridView::IntersectionIterator;
62 using Intersection = typename GridView::Intersection;
63
64 // A grid implementations iteratrs may return elements and intersection by value or by reference.
65 // Since we need the same dereferenced element and intersection multiple types, they
66 // are cached internally in case the grid returns them by value.
67 static constexpr bool cacheElement = not std::is_lvalue_reference_v<decltype(std::declval<ElementIterator>().operator*())>;
68 static constexpr bool cacheIntersection = not std::is_lvalue_reference_v<decltype(std::declval<IntersectionIterator>().operator*())>;
69
72
73 // Get current element by accessing the cache or dereferencing the iterator
74 const Element& element () const
75 {
76 if constexpr (cacheElement)
77 return *element_;
78 else
79 return *elementIt_;
80 }
81
82 void updateElement ()
83 {
84 if constexpr (cacheElement)
85 element_ = *elementIt_;
86 }
87
88 // Get current intersection by accessing the cache or dereferencing the iterator
89 const Intersection& intersection () const
90 {
91 if constexpr (cacheIntersection)
92 return *intersection_;
93 else
94 return **iIt_;
95 }
96
97 void updateIntersection ()
98 {
99 if constexpr (cacheIntersection)
100 intersection_ = **iIt_;
101 }
102
103public:
104
108 using reference = const Intersection&;
109
116 {};
117
122
130 IntersectionSetIterator (const IntersectionSet& intersectionSet, ElementIterator elementBegin, ElementIterator elementEnd)
131 : intersectionSet_(&intersectionSet)
132 , elementIt_(std::move(elementBegin))
133 , elementEnd_(std::move(elementEnd))
134 {
135 if (elementIt_ != elementEnd_)
136 {
137 updateElement();
138 iIt_ = intersectionSet_->gridView().ibegin(element());
139 updateIntersection();
140 if (not intersectionSet_->contains(intersection()))
141 ++(*this);
142 }
143 }
144
156 IntersectionSetIterator (const IntersectionSet& intersectionSet, ElementIterator elementBegin)
157 : IntersectionSetIterator(intersectionSet, elementBegin, intersectionSet.gridView().template end<0>())
158 {}
159
168 IntersectionSetIterator (const IntersectionSet& intersectionSet)
169 : IntersectionSetIterator(intersectionSet, intersectionSet.gridView().template begin<0>())
170 {}
171
176 {
177 return intersection();
178 }
179
184 {
185 while (true)
186 {
187 ++(*iIt_);
188 if (*iIt_ == intersectionSet_->gridView().iend(element()))
189 {
190 while (true)
191 {
192 ++elementIt_;
193 if (elementIt_ == elementEnd_)
194 return *this;
195 updateElement();
196 if (intersectionSet_->containsFaceOf(element()))
197 break;
198 }
199 iIt_ = intersectionSet_->gridView().ibegin(element());
200 }
201 updateIntersection();
202 if (intersectionSet_->contains(intersection()))
203 return *this;
204 }
205 return *this;
206 }
207
212 {
213 // If both iterators point to different elements, we can exit immediately.
214 // Hence we return after one comparison, when comparing against an end
215 // iterator during iteration.
216 if (it1.elementIt_ != it2.elementIt_)
217 return false;
218 // If the iterators point to the same element and the latter is the element
219 // end iterator, then both are end iterators and thus equal. Hence we return
220 // after two comparisons when reaching the end.
221 if (it1.elementIt_ == it1.elementEnd_)
222 return true;
223 // The comparison of the intersection iterators is left to the less frequent
224 // case of comparing two non-end iterators.
225 return (*(it1.iIt_) == *(it2.iIt_));
226 }
227
231 friend bool operator== (const IntersectionSetIterator& it1, const SentinelIterator& it2)
232 {
233 return it1.elementIt_ == it1.elementEnd_;
234 }
235
236private:
237 const IntersectionSet* intersectionSet_ = nullptr;
238 ElementIterator elementIt_;
239 ElementIterator elementEnd_;
241 DUNE_NO_UNIQUE_ADDRESS ElementStorage element_;
242 DUNE_NO_UNIQUE_ADDRESS IntersectionStorage intersection_;
243};
244
245
246
247} // namespace Dune::Fufem
248
249
250
251#endif // DUNE_FUFEM_DOMAINS_INTERSECTIONSETITERATOR_HH
#define DUNE_NO_UNIQUE_ADDRESS
iterator end()
iterator begin()
Empty sentinel type.
Definition intersectionsetiterator.hh:116
An iterator iterating over all intersections of an intersection set.
Definition intersectionsetiterator.hh:54
IntersectionSetIterator(const IntersectionSet &intersectionSet, ElementIterator elementBegin, ElementIterator elementEnd)
Construct for given intersection set, element iterator and element end iterator.
Definition intersectionsetiterator.hh:130
IntersectionSetIterator(const IntersectionSet &intersectionSet)
Construct for given intersection set and element iterator.
Definition intersectionsetiterator.hh:168
friend bool operator==(const IntersectionSetIterator &it1, const IntersectionSetIterator &it2)
Equality comparison between two iterators.
Definition intersectionsetiterator.hh:211
IntersectionSetIterator(const IntersectionSet &intersectionSet, ElementIterator elementBegin)
Construct for given intersection set and element iterator.
Definition intersectionsetiterator.hh:156
IntersectionSetIterator()=default
Default constructor.
IntersectionSetIterator & operator++()
Increment the iterator.
Definition intersectionsetiterator.hh:183
reference operator*() const
Dereference the iterator and obtain current reference.
Definition intersectionsetiterator.hh:175
const Intersection & reference
Type returned when dereferencing.
Definition intersectionsetiterator.hh:108
T forward(T... args)
Definition dunefunctionsboundaryfunctionalassembler.hh:29
STL namespace.