- Home
- About DUNE
- Download
- Documentation
- Community
- Development
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/grid/common/genericreferenceelements.hh> 00013 #include <dune/grid/io/file/vtk/corner.hh> 00014 00015 namespace Dune 00016 { 00019 00020 namespace VTK { 00021 00023 00027 template<typename CellIterator> 00028 class CornerIterator 00029 : public ForwardIteratorFacade 00030 < CornerIterator<CellIterator>, 00031 const Corner<typename remove_const<typename std::iterator_traits< 00032 CellIterator>::value_type>::type>, 00033 const Corner<typename remove_const<typename std::iterator_traits< 00034 CellIterator>::value_type>::type>&, 00035 typename std::iterator_traits<CellIterator>::difference_type> 00036 { 00037 public: 00038 // reiterate the facades typedefs here 00039 typedef CornerIterator<CellIterator> DerivedType; 00040 typedef VTK::Corner<typename remove_const<typename std::iterator_traits< 00041 CellIterator>::value_type>::type> Corner; 00042 typedef const Corner Value; 00043 typedef Value& Reference; 00044 typedef typename std::iterator_traits<CellIterator>::difference_type 00045 DifferenceType; 00046 00047 typedef typename std::iterator_traits<CellIterator>::value_type::ctype 00048 ctype; 00049 static const unsigned dim = std::iterator_traits<CellIterator>:: 00050 value_type::mydimension; 00051 typedef GenericReferenceElements<ctype, dim> Refelems; 00052 00053 private: 00054 typedef ForwardIteratorFacade<DerivedType, Value, Reference, 00055 DifferenceType> Facade; 00056 00057 CellIterator cellit; 00058 CellIterator cellend; 00059 Corner corner; 00060 00061 public: 00062 Reference dereference() const { 00063 return corner; 00064 } 00065 00066 bool isDereferencable() const { 00067 return cellit != cellend; 00068 } 00069 00070 bool equals(const DerivedType& other) const { 00071 bool mePassedTheEnd = !isDereferencable(); 00072 bool otherPassedTheEnd = !other.isDereferencable(); 00073 // both are passed the end => return true 00074 if(mePassedTheEnd && otherPassedTheEnd) return true; 00075 // one is passed the end => return false 00076 if(mePassedTheEnd || otherPassedTheEnd) return false; 00077 // none is passed the end, do their iterators and indices match? 00078 return cellit == other.cellit && 00079 corner.duneIndex() == other.corner.duneIndex(); 00080 } 00081 00082 void increment() { 00083 int index = corner.vtkIndex(); 00084 ++index; 00085 if(index == Refelems::general(cellit->type()).size(dim)) { 00086 ++cellit; 00087 if(cellit != cellend) { 00088 corner.cell(*cellit); 00089 corner.vtkIndex(0); 00090 } 00091 } 00092 else 00093 corner.vtkIndex(index); 00094 } 00095 00097 00102 CornerIterator(const CellIterator& cellit_, const CellIterator& cellend_, 00103 unsigned vtkIndex = 0) 00104 : cellit(cellit_), cellend(cellend_) 00105 { 00106 if(cellit != cellend) { 00107 corner.cell(*cellit); 00108 corner.vtkIndex(vtkIndex); 00109 } 00110 } 00112 00115 CornerIterator(const CellIterator& cellend_) 00116 : cellit(cellend_), cellend(cellend_) 00117 { } 00118 }; 00119 00120 } // namespace VTK 00121 00123 00124 } // namespace Dune 00125 00126 #endif // DUNE_GRID_IO_FILE_VTK_CORNERITERATOR_HH
Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].