3#ifndef DUNE_MMESH_GRID_MMESHLEAFITERATOR_HH
4#define DUNE_MMESH_GRID_MMESHLEAFITERATOR_HH
11#include <dune/grid/common/gridenums.hh>
19template <
int codim, PartitionIteratorType pitype,
class GridImp,
20 typename Enable =
void>
23template <
int codim, PartitionIteratorType pitype,
class Gr
idImp>
29template <PartitionIteratorType pitype,
class Gr
idImp>
31 std::enable_if_t<GridImp::dimension == 2>> {
35 typename GridImp::HostGridType::Finite_faces_iterator;
36 enum { codimension = 0 };
38 typedef typename GridImp::template Codim<0>::Entity Entity;
42 explicit MMeshLeafIteratorImp(
const GridImp* mMesh)
44 hostLeafIterator_(pitype == Interior_Partition
45 ? mMesh->partitionHelper().leafInteriorBegin()
46 : mMesh->getHostGrid().finite_faces_begin()) {
47 while (proceed()) increment();
56 hostLeafIterator_(pitype == Interior_Partition
57 ? mMesh->partitionHelper().leafInteriorEnd()
58 : mMesh->getHostGrid().finite_faces_end()) {}
68 Entity
dereference()
const {
return Entity{{mMesh_, hostLeafIterator_}}; }
72 return hostLeafIterator_ == i.hostLeafIterator_;
78 const auto endIterator = (pitype == Interior_Partition
79 ? mMesh_->partitionHelper().leafInteriorEnd()
80 : mMesh_->getHostGrid().finite_faces_end());
81 if (hostLeafIterator_ == endIterator)
return false;
82 return !mMesh_->partitionHelper().contains(
83 pitype, hostLeafIterator_->info().partition);
86 const GridImp* mMesh_;
87 HostGridLeafIterator hostLeafIterator_;
90template <PartitionIteratorType pitype,
class Gr
idImp>
91class MMeshLeafIteratorImp<1, pitype, GridImp,
92 std::enable_if_t<GridImp::dimension == 2>> {
95 using HostGridLeafIterator =
96 typename GridImp::HostGridType::Finite_edges_iterator;
99 enum { codimension = 1 };
101 typedef typename GridImp::template Codim<1>::Entity Entity;
103 explicit MMeshLeafIteratorImp(
const GridImp* mMesh)
105 hostLeafIterator_(mMesh->getHostGrid().finite_edges_begin()) {
106 while (proceed()) increment();
113 explicit MMeshLeafIteratorImp(
const GridImp* mMesh,
bool endDummy)
115 hostLeafIterator_(mMesh->getHostGrid().finite_edges_end()) {}
125 Entity dereference()
const {
return Entity{{mMesh_, *hostLeafIterator_}}; }
128 bool equals(
const MMeshLeafIteratorImp& i)
const {
129 return hostLeafIterator_ == i.hostLeafIterator_;
135 if (hostLeafIterator_ == mMesh_->getHostGrid().finite_edges_end())
137 return !mMesh_->partitionHelper().contains(pitype, dereference());
139 const GridImp* mMesh_;
141 HostGridLeafIterator hostLeafIterator_;
144template <PartitionIteratorType pitype,
class Gr
idImp>
145class MMeshLeafIteratorImp<2, pitype, GridImp,
146 std::enable_if_t<GridImp::dimension == 2>> {
149 using HostGridLeafIterator =
150 typename GridImp::HostGridType::Finite_vertices_iterator;
153 enum { codimension = GridImp::dimension };
155 typedef typename GridImp::template Codim<codimension>::Entity Entity;
157 explicit MMeshLeafIteratorImp(
const GridImp* mMesh)
159 hostLeafIterator_(mMesh->getHostGrid().finite_vertices_begin()) {
160 while (proceed()) increment();
167 explicit MMeshLeafIteratorImp(
const GridImp* mMesh,
bool endDummy)
169 hostLeafIterator_(mMesh->getHostGrid().finite_vertices_end()) {}
179 Entity dereference()
const {
return Entity{{mMesh_, hostLeafIterator_}}; }
182 bool equals(
const MMeshLeafIteratorImp& i)
const {
183 return hostLeafIterator_ == i.hostLeafIterator_;
189 if (hostLeafIterator_ == mMesh_->getHostGrid().finite_vertices_end())
191 return !mMesh_->partitionHelper().contains(
192 pitype, hostLeafIterator_->info().partition);
195 const GridImp* mMesh_;
196 HostGridLeafIterator hostLeafIterator_;
204template <PartitionIteratorType pitype,
class Gr
idImp>
206 std::enable_if_t<GridImp::dimension == 3>> {
210 typename GridImp::HostGridType::Finite_cells_iterator;
212 enum { codimension = 0 };
214 typedef typename GridImp::template Codim<0>::Entity Entity;
218 explicit MMeshLeafIteratorImp(
const GridImp* mMesh)
220 hostLeafIterator_(pitype == Interior_Partition
221 ? mMesh->partitionHelper().leafInteriorBegin()
222 : mMesh->getHostGrid().finite_cells_begin()) {
223 while (proceed()) increment();
232 hostLeafIterator_(pitype == Interior_Partition
233 ? mMesh->partitionHelper().leafInteriorEnd()
234 : mMesh->getHostGrid().finite_cells_end()) {}
244 Entity
dereference()
const {
return Entity{{mMesh_, hostLeafIterator_}}; }
248 return hostLeafIterator_ == i.hostLeafIterator_;
254 const auto endIterator = (pitype == Interior_Partition
255 ? mMesh_->partitionHelper().leafInteriorEnd()
256 : mMesh_->getHostGrid().finite_cells_end());
257 if (hostLeafIterator_ == endIterator)
return false;
258 return !mMesh_->partitionHelper().contains(
259 pitype, hostLeafIterator_->info().partition);
262 const GridImp* mMesh_;
263 HostGridLeafIterator hostLeafIterator_;
267template <PartitionIteratorType pitype,
class Gr
idImp>
269 std::enable_if_t<GridImp::dimension == 3>> {
272 using HostGridLeafIterator =
273 typename GridImp::HostGridType::Finite_facets_iterator;
276 enum { codimension = 1 };
278 typedef typename GridImp::template Codim<1>::Entity Entity;
282 hostLeafIterator_(mMesh->getHostGrid().finite_facets_begin()) {
283 while (proceed()) increment();
292 hostLeafIterator_(mMesh->getHostGrid().finite_facets_end()) {}
302 Entity
dereference()
const {
return Entity{{mMesh_, *hostLeafIterator_}}; }
306 return hostLeafIterator_ == i.hostLeafIterator_;
312 if (hostLeafIterator_ == mMesh_->getHostGrid().finite_facets_end())
314 return !mMesh_->partitionHelper().contains(pitype, dereference());
317 const GridImp* mMesh_;
318 HostGridLeafIterator hostLeafIterator_;
322template <PartitionIteratorType pitype,
class Gr
idImp>
324 std::enable_if_t<GridImp::dimension == 3>> {
327 using HostGridLeafIterator =
328 typename GridImp::HostGridType::Finite_edges_iterator;
331 enum { codimension = 2 };
333 typedef typename GridImp::template Codim<2>::Entity Entity;
337 hostLeafIterator_(mMesh->getHostGrid().finite_edges_begin()) {
338 while (proceed()) increment();
347 hostLeafIterator_(mMesh->getHostGrid().finite_edges_end()) {}
357 Entity
dereference()
const {
return Entity{{mMesh_, *hostLeafIterator_}}; }
361 return hostLeafIterator_ == i.hostLeafIterator_;
367 if (hostLeafIterator_ == mMesh_->getHostGrid().finite_edges_end())
369 return !mMesh_->partitionHelper().contains(pitype, dereference());
372 const GridImp* mMesh_;
373 HostGridLeafIterator hostLeafIterator_;
377template <PartitionIteratorType pitype,
class Gr
idImp>
379 std::enable_if_t<GridImp::dimension == 3>> {
382 typedef typename GridImp::HostGridType::Vertex_iterator HostGridLeafIterator;
385 enum { codimension = GridImp::dimension };
387 typedef typename GridImp::template Codim<codimension>::Entity Entity;
391 hostLeafIterator_(mMesh->getHostGrid().finite_vertices_begin()) {
392 while (proceed()) increment();
401 hostLeafIterator_(mMesh->getHostGrid().finite_vertices_end()) {}
411 Entity
dereference()
const {
return Entity{{mMesh_, hostLeafIterator_}}; }
415 return hostLeafIterator_ == i.hostLeafIterator_;
421 if (hostLeafIterator_ ==
422 HostGridLeafIterator(mMesh_->getHostGrid().finite_vertices_end()))
424 if (hostLeafIterator_ == mMesh_->getHostGrid().infinite_vertex())
426 return !mMesh_->partitionHelper().contains(
427 pitype, hostLeafIterator_->info().partition);
430 const GridImp* mMesh_;
431 HostGridLeafIterator hostLeafIterator_;
bool equals(const MMeshLeafIteratorImp &i) const
equality
Definition: leafiterator.hh:71
void increment()
prefix increment
Definition: leafiterator.hh:61
MMeshLeafIteratorImp(const GridImp *mMesh, bool endDummy)
Constructor which creates the end iterator.
Definition: leafiterator.hh:54
typename GridImp::HostGridType::Finite_faces_iterator HostGridLeafIterator
The type of the underlying entities.
Definition: leafiterator.hh:35
Entity dereference() const
dereferencing
Definition: leafiterator.hh:68
Entity dereference() const
dereferencing
Definition: leafiterator.hh:244
typename GridImp::HostGridType::Finite_cells_iterator HostGridLeafIterator
The type of the underlying entities.
Definition: leafiterator.hh:210
bool equals(const MMeshLeafIteratorImp &i) const
equality
Definition: leafiterator.hh:247
MMeshLeafIteratorImp(const GridImp *mMesh, bool endDummy)
Constructor which creates the end iterator.
Definition: leafiterator.hh:230
void increment()
prefix increment
Definition: leafiterator.hh:237
bool equals(const MMeshLeafIteratorImp &i) const
equality
Definition: leafiterator.hh:305
void increment()
prefix increment
Definition: leafiterator.hh:295
MMeshLeafIteratorImp(const GridImp *mMesh, bool endDummy)
Constructor which creates the end iterator.
Definition: leafiterator.hh:290
Entity dereference() const
dereferencing
Definition: leafiterator.hh:302
bool equals(const MMeshLeafIteratorImp &i) const
equality
Definition: leafiterator.hh:360
Entity dereference() const
dereferencing
Definition: leafiterator.hh:357
void increment()
prefix increment
Definition: leafiterator.hh:350
MMeshLeafIteratorImp(const GridImp *mMesh, bool endDummy)
Constructor which creates the end iterator.
Definition: leafiterator.hh:345
void increment()
prefix increment
Definition: leafiterator.hh:404
Entity dereference() const
dereferencing
Definition: leafiterator.hh:411
bool equals(const MMeshLeafIteratorImp &i) const
equality
Definition: leafiterator.hh:414
MMeshLeafIteratorImp(const GridImp *mMesh, bool endDummy)
Constructor which create the end iterator.
Definition: leafiterator.hh:399
Iterator over all entities of a given codimension and level of a grid (2D).
Definition: leafiterator.hh:21