dune-grid
2.1.1
|
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_POINTITERATOR_HH 00005 #define DUNE_GRID_IO_FILE_VTK_POINTITERATOR_HH 00006 00007 #include <iterator> 00008 #include <vector> 00009 00010 #include <dune/common/iteratorfacades.hh> 00011 #include <dune/common/typetraits.hh> 00012 00013 #include <dune/grid/io/file/vtk/corner.hh> 00014 #include <dune/grid/io/file/vtk/corneriterator.hh> 00015 00016 namespace Dune 00017 { 00020 00021 namespace VTK { 00022 00024 00047 template<typename CellIterator, typename IS> 00048 class PointIterator 00049 : public ForwardIteratorFacade 00050 < PointIterator<CellIterator, IS>, 00051 const Corner<typename remove_const<typename std::iterator_traits< 00052 CellIterator>::value_type>::type>, 00053 const Corner<typename remove_const<typename std::iterator_traits< 00054 CellIterator>::value_type>::type>&, 00055 typename std::iterator_traits<CellIterator>::difference_type> 00056 { 00057 public: 00058 typedef VTK::Corner<typename remove_const<typename std::iterator_traits< 00059 CellIterator>::value_type>::type> Corner; 00060 00061 // reiterate the facades typedefs here 00062 typedef PointIterator<CellIterator, IS> DerivedType; 00063 typedef const Corner Value; 00064 typedef Value& Reference; 00065 typedef typename std::iterator_traits<CellIterator>::difference_type 00066 DifferenceType; 00067 00068 static const unsigned mydim = std::iterator_traits<CellIterator>:: 00069 value_type::mydimension; 00070 00071 private: 00072 typedef ForwardIteratorFacade<DerivedType, Value, Reference, 00073 DifferenceType> Facade; 00074 00075 CornerIterator<CellIterator> cornerit; 00076 const IS* is; 00077 std::vector<bool> seen; 00078 00079 public: 00080 Reference dereference() const { 00081 return *cornerit; 00082 } 00083 00084 bool isDereferencable() const { 00085 return cornerit.isDereferencable(); 00086 } 00087 00088 bool equals(const DerivedType& other) const { 00089 return cornerit == other.cornerit; 00090 } 00091 00092 void increment() { 00093 for(++cornerit; isDereferencable(); ++cornerit) { 00094 typename IS::IndexType index = 00095 is->subIndex(cornerit->cell(), cornerit->duneIndex(), mydim); 00096 00097 if(!seen[index]) { 00098 seen[index] = true; 00099 break; 00100 } 00101 } 00102 } 00103 00105 00110 PointIterator(const CellIterator& cellit, const CellIterator& cellend, 00111 const IS& is_) 00112 : cornerit(cellit, cellend), is(&is_), seen(is->size(mydim), false) 00113 { } 00115 00118 PointIterator(const CellIterator& cellend_) 00119 : cornerit(cellend_), is(0) 00120 { } 00121 }; 00122 00123 } // namespace VTK 00124 00126 00127 } // namespace Dune 00128 00129 #endif // DUNE_GRID_IO_FILE_VTK_POINTITERATOR_HH