dune-grid
2.2.0
|
00001 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 // vi: set et ts=8 sw=2 sts=2: 00003 00004 #ifndef DUNE_GRID_IO_FILE_VTK_CORNERITERATOR_HH 00005 #define DUNE_GRID_IO_FILE_VTK_CORNERITERATOR_HH 00006 00007 #include <iterator> 00008 00009 #include <dune/common/iteratorfacades.hh> 00010 #include <dune/common/typetraits.hh> 00011 00012 #include <dune/geometry/referenceelements.hh> 00013 00014 #include <dune/grid/io/file/vtk/corner.hh> 00015 00016 namespace Dune 00017 { 00020 00021 namespace VTK { 00022 00024 00028 template<typename CellIterator> 00029 class CornerIterator 00030 : public ForwardIteratorFacade 00031 < CornerIterator<CellIterator>, 00032 const Corner<typename remove_const<typename std::iterator_traits< 00033 CellIterator>::value_type>::type>, 00034 const Corner<typename remove_const<typename std::iterator_traits< 00035 CellIterator>::value_type>::type>&, 00036 typename std::iterator_traits<CellIterator>::difference_type> 00037 { 00038 public: 00039 // reiterate the facades typedefs here 00040 typedef CornerIterator<CellIterator> DerivedType; 00041 typedef VTK::Corner<typename remove_const<typename std::iterator_traits< 00042 CellIterator>::value_type>::type> Corner; 00043 typedef const Corner Value; 00044 typedef Value& Reference; 00045 typedef typename std::iterator_traits<CellIterator>::difference_type 00046 DifferenceType; 00047 00048 typedef typename std::iterator_traits<CellIterator>::value_type::ctype 00049 ctype; 00050 static const unsigned dim = std::iterator_traits<CellIterator>:: 00051 value_type::mydimension; 00052 typedef GenericReferenceElements<ctype, dim> Refelems; 00053 00054 private: 00055 typedef ForwardIteratorFacade<DerivedType, Value, Reference, 00056 DifferenceType> Facade; 00057 00058 CellIterator cellit; 00059 CellIterator cellend; 00060 Corner corner; 00061 00062 public: 00063 Reference dereference() const { 00064 return corner; 00065 } 00066 00067 bool isDereferencable() const { 00068 return cellit != cellend; 00069 } 00070 00071 bool equals(const DerivedType& other) const { 00072 bool mePassedTheEnd = !isDereferencable(); 00073 bool otherPassedTheEnd = !other.isDereferencable(); 00074 // both are passed the end => return true 00075 if(mePassedTheEnd && otherPassedTheEnd) return true; 00076 // one is passed the end => return false 00077 if(mePassedTheEnd || otherPassedTheEnd) return false; 00078 // none is passed the end, do their iterators and indices match? 00079 return cellit == other.cellit && 00080 corner.duneIndex() == other.corner.duneIndex(); 00081 } 00082 00083 void increment() { 00084 int index = corner.vtkIndex(); 00085 ++index; 00086 if(index == Refelems::general(cellit->type()).size(dim)) { 00087 ++cellit; 00088 if(cellit != cellend) { 00089 corner.cell(*cellit); 00090 corner.vtkIndex(0); 00091 } 00092 } 00093 else 00094 corner.vtkIndex(index); 00095 } 00096 00098 00103 CornerIterator(const CellIterator& cellit_, const CellIterator& cellend_, 00104 unsigned vtkIndex = 0) 00105 : cellit(cellit_), cellend(cellend_) 00106 { 00107 if(cellit != cellend) { 00108 corner.cell(*cellit); 00109 corner.vtkIndex(vtkIndex); 00110 } 00111 } 00113 00116 CornerIterator(const CellIterator& cellend_) 00117 : cellit(cellend_), cellend(cellend_) 00118 { } 00119 }; 00120 00121 } // namespace VTK 00122 00124 00125 } // namespace Dune 00126 00127 #endif // DUNE_GRID_IO_FILE_VTK_CORNERITERATOR_HH