dune-grid  2.2.0
pointiterator.hh
Go to the documentation of this file.
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