dune-grid  2.9.0
pointiterator.hh
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
2 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4 // vi: set et ts=4 sw=2 sts=2:
5 
6 #ifndef DUNE_GRID_IO_FILE_VTK_POINTITERATOR_HH
7 #define DUNE_GRID_IO_FILE_VTK_POINTITERATOR_HH
8 
9 #include <iterator>
10 #include <vector>
11 
12 #include <dune/common/iteratorfacades.hh>
13 #include <dune/common/typetraits.hh>
14 
17 
18 namespace Dune
19 {
22 
23  namespace VTK {
24 
26 
49  template<typename CellIterator, typename IS>
51  : public ForwardIteratorFacade
52  < PointIterator<CellIterator, IS>,
53  const Corner<typename std::remove_const<typename std::iterator_traits<
54  CellIterator>::value_type>::type>,
55  const Corner<typename std::remove_const<typename std::iterator_traits<
56  CellIterator>::value_type>::type>&,
57  typename std::iterator_traits<CellIterator>::difference_type>
58  {
59  public:
60  typedef VTK::Corner<typename std::remove_const<typename std::iterator_traits<
61  CellIterator>::value_type>::type> Corner;
62 
63  // reiterate the facades typedefs here
65  typedef const Corner Value;
66  typedef Value& Reference;
67  typedef typename std::iterator_traits<CellIterator>::difference_type
69 
70  static const unsigned mydim = std::iterator_traits<CellIterator>::
71  value_type::mydimension;
72 
73  private:
74  typedef ForwardIteratorFacade<DerivedType, Value, Reference,
75  DifferenceType> Facade;
76 
78  const IS* is;
79  std::vector<bool> seen;
80 
81  public:
83  return *cornerit;
84  }
85 
86  bool isDereferencable() const {
87  return cornerit.isDereferencable();
88  }
89 
90  bool equals(const DerivedType& other) const {
91  return cornerit == other.cornerit;
92  }
93 
94  void increment() {
95  for(++cornerit; isDereferencable(); ++cornerit) {
96  typename IS::IndexType index =
97  is->subIndex(cornerit->cell(), cornerit->duneIndex(), mydim);
98 
99  if(!seen[index]) {
100  seen[index] = true;
101  break;
102  }
103  }
104  }
105 
107 
112  PointIterator(const CellIterator& cellit, const CellIterator& cellend,
113  const IS& is_)
114  : cornerit(cellit, cellend), is(&is_), seen(is->size(mydim), false)
115  { }
117 
120  PointIterator(const CellIterator& cellend_)
121  : cornerit(cellend_), is(0)
122  { }
123  };
124 
125  } // namespace VTK
126 
128 
129 } // namespace Dune
130 
131 #endif // DUNE_GRID_IO_FILE_VTK_POINTITERATOR_HH
Include standard header files.
Definition: agrid.hh:60
simple class representing a corner of a cell
Definition: corner.hh:25
iterate over the corners of some cell range
Definition: corneriterator.hh:39
bool isDereferencable() const
Definition: corneriterator.hh:69
iterate over the points of some corner range
Definition: pointiterator.hh:58
PointIterator(const CellIterator &cellit, const CellIterator &cellend, const IS &is_)
construct a CornerIterator
Definition: pointiterator.hh:112
void increment()
Definition: pointiterator.hh:94
VTK::Corner< typename std::remove_const< typename std::iterator_traits< CellIterator >::value_type >::type > Corner
Definition: pointiterator.hh:61
Reference dereference() const
Definition: pointiterator.hh:82
std::iterator_traits< CellIterator >::difference_type DifferenceType
Definition: pointiterator.hh:68
static const unsigned mydim
Definition: pointiterator.hh:70
PointIterator(const CellIterator &cellend_)
construct a CornerIterator
Definition: pointiterator.hh:120
bool equals(const DerivedType &other) const
Definition: pointiterator.hh:90
PointIterator< CellIterator, IS > DerivedType
Definition: pointiterator.hh:64
const Corner Value
Definition: pointiterator.hh:65
Value & Reference
Definition: pointiterator.hh:66
bool isDereferencable() const
Definition: pointiterator.hh:86