dune-grid  2.1.1
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/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