dune-grid  2.2.0
corneriterator.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_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