Dune-Fufem 2.11-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#if DUNE_VERSION_GTE(DUNE_FUNCTIONS, 2, 11)
20#endif
21
22
23
24namespace Dune::Fufem {
25
26
27
54template <class IS>
56 : public Dune::IteratorFacade<IntersectionSetIterator<IS>, std::forward_iterator_tag, const typename IS::GridView::Intersection>
57{
58 using IntersectionSet = IS;
59 using Facade = Dune::IteratorFacade<IntersectionSetIterator<IS>, std::forward_iterator_tag, const typename IS::GridView::Intersection>;
60
61 using GridView = typename IntersectionSet::GridView;
62 using Element = typename GridView::template Codim<0>::Entity;
63 using ElementIterator = typename GridView::template Codim<0>::Iterator;
64 using IntersectionIterator = typename GridView::IntersectionIterator;
65 using Intersection = typename GridView::Intersection;
66
67 // A grid implementations iteratrs may return elements and intersection by value or by reference.
68 // Since we need the same dereferenced element and intersection multiple types, they
69 // are cached internally in case the grid returns them by value.
70 static constexpr bool cacheElement = not std::is_lvalue_reference_v<decltype(std::declval<ElementIterator>().operator*())>;
71 static constexpr bool cacheIntersection = not std::is_lvalue_reference_v<decltype(std::declval<IntersectionIterator>().operator*())>;
72
75
76 // Get current element by accessing the cache or dereferencing the iterator
77 const Element& element () const
78 {
79 if constexpr (cacheElement)
80 return *element_;
81 else
82 return *elementIt_;
83 }
84
85 void updateElement ()
86 {
87 if constexpr (cacheElement)
88 element_ = *elementIt_;
89 }
90
91 // Get current intersection by accessing the cache or dereferencing the iterator
92 const Intersection& intersection () const
93 {
94 if constexpr (cacheIntersection)
95 return *intersection_;
96 else
97 return **iIt_;
98 }
99
100 void updateIntersection ()
101 {
102 if constexpr (cacheIntersection)
103 intersection_ = **iIt_;
104 }
105
106public:
107
111 using reference = const Intersection&;
112
119 {};
120
125
133 IntersectionSetIterator (const IntersectionSet& intersectionSet, ElementIterator elementBegin, ElementIterator elementEnd)
134 : intersectionSet_(&intersectionSet)
135 , elementIt_(std::move(elementBegin))
136 , elementEnd_(std::move(elementEnd))
137 {
138 if (elementIt_ != elementEnd_)
139 {
140 updateElement();
141 iIt_ = intersectionSet_->gridView().ibegin(element());
142 updateIntersection();
143 if (not intersectionSet_->contains(intersection()))
144 ++(*this);
145 }
146 }
147
159 IntersectionSetIterator (const IntersectionSet& intersectionSet, ElementIterator elementBegin)
160 : IntersectionSetIterator(intersectionSet, elementBegin, intersectionSet.gridView().template end<0>())
161 {}
162
171 IntersectionSetIterator (const IntersectionSet& intersectionSet)
172 : IntersectionSetIterator(intersectionSet, intersectionSet.gridView().template begin<0>())
173 {}
174
179 {
180 return intersection();
181 }
182
187 {
188 while (true)
189 {
190 ++(*iIt_);
191 if (*iIt_ == intersectionSet_->gridView().iend(element()))
192 {
193 while (true)
194 {
195 ++elementIt_;
196 if (elementIt_ == elementEnd_)
197 return *this;
198 updateElement();
199 if (intersectionSet_->containsFaceOf(element()))
200 break;
201 }
202 iIt_ = intersectionSet_->gridView().ibegin(element());
203 }
204 updateIntersection();
205 if (intersectionSet_->contains(intersection()))
206 return *this;
207 }
208 return *this;
209 }
210
215 {
216 // If both iterators point to different elements, we can exit immediately.
217 // Hence we return after one comparison, when comparing against an end
218 // iterator during iteration.
219 if (it1.elementIt_ != it2.elementIt_)
220 return false;
221 // If the iterators point to the same element and the latter is the element
222 // end iterator, then both are end iterators and thus equal. Hence we return
223 // after two comparisons when reaching the end.
224 if (it1.elementIt_ == it1.elementEnd_)
225 return true;
226 // The comparison of the intersection iterators is left to the less frequent
227 // case of comparing two non-end iterators.
228 return (*(it1.iIt_) == *(it2.iIt_));
229 }
230
234 friend bool operator== (const IntersectionSetIterator& it1, const SentinelIterator& it2)
235 {
236 return it1.elementIt_ == it1.elementEnd_;
237 }
238
239private:
240 const IntersectionSet* intersectionSet_ = nullptr;
241 ElementIterator elementIt_;
242 ElementIterator elementEnd_;
244#if DUNE_VERSION_GTE(DUNE_FUNCTIONS, 2, 11)
245 DUNE_NO_UNIQUE_ADDRESS ElementStorage element_;
246 DUNE_NO_UNIQUE_ADDRESS IntersectionStorage intersection_;
247#else
248 ElementStorage element_;
249 IntersectionStorage intersection_;
250#endif
251};
252
253
254
255} // namespace Dune::Fufem
256
257
258
259#endif // DUNE_FUFEM_DOMAINS_INTERSECTIONSETITERATOR_HH
#define DUNE_NO_UNIQUE_ADDRESS
iterator end()
iterator begin()
STL namespace.
Definition dunefunctionsboundaryfunctionalassembler.hh:29
An iterator iterating over all intersections of an intersection set.
Definition intersectionsetiterator.hh:57
IntersectionSetIterator(const IntersectionSet &intersectionSet, ElementIterator elementBegin, ElementIterator elementEnd)
Construct for given intersection set, element iterator and element end iterator.
Definition intersectionsetiterator.hh:133
IntersectionSetIterator(const IntersectionSet &intersectionSet)
Construct for given intersection set and element iterator.
Definition intersectionsetiterator.hh:171
friend bool operator==(const IntersectionSetIterator &it1, const IntersectionSetIterator &it2)
Equality comparison between two iterators.
Definition intersectionsetiterator.hh:214
IntersectionSetIterator(const IntersectionSet &intersectionSet, ElementIterator elementBegin)
Construct for given intersection set and element iterator.
Definition intersectionsetiterator.hh:159
IntersectionSetIterator()=default
Default constructor.
IntersectionSetIterator & operator++()
Increment the iterator.
Definition intersectionsetiterator.hh:186
reference operator*() const
Dereference the iterator and obtain current reference.
Definition intersectionsetiterator.hh:178
const Intersection & reference
Type returned when dereferencing.
Definition intersectionsetiterator.hh:111
Empty sentinel type.
Definition intersectionsetiterator.hh:119
T forward(T... args)