intersectioniteratorwrapper.hh

Go to the documentation of this file.
00001 #ifndef DUNE_INTERSECTIONITERATORWRAPPER_HH
00002 #define DUNE_INTERSECTIONITERATORWRAPPER_HH
00003 
00004 #include "intersectioniterator.hh"
00005 
00011 namespace Dune {
00012 
00015 template <class GridImp, class IntersectionIteratorImpl>
00016 class IntersectionIteratorWrapper 
00017 {
00018   enum { dim = GridImp :: dimension };
00019   enum { dimworld = GridImp :: dimensionworld };
00020 
00021   typedef IntersectionIteratorWrapper<GridImp,IntersectionIteratorImpl> ThisType;
00022 
00023   typedef IntersectionIteratorImpl IntersectionIteratorImp;
00024   
00025   typedef typename IntersectionIteratorImp :: StorageType IntersectionIteratorProviderType;
00026 
00027 public:   
00029   enum { dimension      = dim };
00031   enum { dimensionworld = dimworld };
00032 
00034   typedef typename GridImp :: ctype ctype;
00035 
00037   typedef typename GridImp::template Codim<0>::Entity Entity;
00039   typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
00040 
00042   typedef typename GridImp::template Codim<1>::Geometry Geometry;
00044   typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
00045 
00047   typedef FieldVector<ctype , dimworld> NormalType;
00048 
00050   template <class EntityImp>
00051   IntersectionIteratorWrapper(const GridImp & grid , const EntityImp & en, int wLevel , bool end ,
00052                               IntersectionIteratorProviderType & storage) 
00053     : storage_(storage) 
00054     , it_(*(storage_.getObject(grid,wLevel))) 
00055   {
00056     if(end) 
00057       it().done();
00058     else 
00059       it().first(en,wLevel);
00060   } 
00061 
00063   IntersectionIteratorWrapper(const ThisType & org)
00064     : storage_(org.storage_) , it_(*(storage_.getObjectCopy(org.it_)))   
00065   {
00066     it().assign(org.it_);
00067   }
00068 
00070   ThisType & operator = (const ThisType & org)
00071   {
00072     it().assign(org.it_);
00073     return *this;
00074   }
00075 
00077   ~IntersectionIteratorWrapper()
00078   {
00079     storage_.freeObject( &it_ ); 
00080   }
00081 
00083   bool equals (const ThisType & i) const { return it().equals(i.it()); }
00084 
00086   void increment () { it().increment(); }
00087 
00089   EntityPointer outside() const { return it().outside(); }
00090 
00092   EntityPointer inside() const { return it().inside(); }
00093 
00096   bool boundary () const { return it().boundary(); }
00097 
00099   bool neighbor () const { return it().neighbor(); }
00100 
00102   int boundaryId () const { return it().boundaryId(); }
00103 
00108   const LocalGeometry & intersectionSelfLocal () const { return it().intersectionSelfLocal(); }
00109 
00114   const Geometry & intersectionGlobal () const { return it().intersectionGlobal(); }
00115 
00118   int numberInSelf () const { return it().numberInSelf(); }
00119 
00123   const LocalGeometry & intersectionNeighborLocal () const { return it().intersectionNeighborLocal(); }
00124 
00127   int numberInNeighbor () const { return it().numberInNeighbor(); }
00128 
00130   int twistInSelf() const { return it().twistInSelf(); }
00131 
00133   int twistInNeighbor() const { return it().twistInNeighbor(); }
00134 
00137   const NormalType & unitOuterNormal (const FieldVector<ctype, dim-1>& local) const 
00138   {
00139     return it().unitOuterNormal(local); 
00140   }
00141 
00144   const NormalType & outerNormal (const FieldVector<ctype, dim-1>& local) const
00145   {
00146     return it().outerNormal(local); 
00147   }
00148 
00151   const NormalType & integrationOuterNormal (const FieldVector<ctype, dim-1>& local) const
00152   {
00153     return it().integrationOuterNormal(local); 
00154   }
00155 
00157   int level () const { return it().level(); }
00158 
00160   bool conforming () const { return it().conforming(); }
00161 
00162 private: 
00164   IntersectionIteratorImp & it() { return it_; }
00165   const IntersectionIteratorImp & it() const { return it_; }
00166  
00167   IntersectionIteratorProviderType & storage_;
00168   IntersectionIteratorImp & it_;
00169 }; // end class IntersectionIteratorWrapper 
00170 
00173 template <class GridImp>
00174 class LeafIntersectionIteratorWrapper 
00175 : public IntersectionIteratorWrapper<GridImp,typename GridImp::LeafIntersectionIteratorImp> 
00176 {
00177   typedef LeafIntersectionIteratorWrapper<GridImp> ThisType;
00178   typedef IntersectionIteratorWrapper<GridImp,typename GridImp::LeafIntersectionIteratorImp> BaseType;
00179 public:   
00181   enum { dimension      = GridImp :: dimension  };
00183   enum { dimensionworld = GridImp :: dimensionworld };
00184 
00186   typedef typename GridImp :: ctype ctype;
00187 
00189   typedef typename GridImp::template Codim<0>::Entity Entity;
00191   typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
00192 
00194   typedef typename GridImp::template Codim<1>::Geometry Geometry;
00196   typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
00197 
00199   typedef FieldVector<ctype , dimensionworld> NormalType;
00200 
00202   template <class EntityImp>
00203   LeafIntersectionIteratorWrapper(const GridImp & grid , const EntityImp & en, int wLevel , bool end ) 
00204     : BaseType(grid,en,wLevel,end,grid.leafIntersetionIteratorProvider()) 
00205   {
00206   } 
00207 
00209   LeafIntersectionIteratorWrapper(const ThisType & org)
00210     : BaseType(org)
00211   {
00212   }
00213 
00215   ThisType & operator = (const ThisType & org)
00216   {
00217     BaseType::operator = (org);
00218     return *this;
00219   }
00220 }; // end class IntersectionIteratorWrapper 
00221 
00224 template <class GridImp>
00225 class LevelIntersectionIteratorWrapper 
00226 : public IntersectionIteratorWrapper<GridImp,typename GridImp::LevelIntersectionIteratorImp> 
00227 {
00228   typedef LevelIntersectionIteratorWrapper<GridImp> ThisType;
00229   typedef IntersectionIteratorWrapper<GridImp,typename GridImp::LevelIntersectionIteratorImp> BaseType;
00230 public:   
00232   enum { dimension      = GridImp :: dimension  };
00234   enum { dimensionworld = GridImp :: dimensionworld };
00235 
00237   typedef typename GridImp :: ctype ctype;
00238 
00240   typedef typename GridImp::template Codim<0>::Entity Entity;
00242   typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
00243 
00245   typedef typename GridImp::template Codim<1>::Geometry Geometry;
00247   typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
00248 
00250   typedef FieldVector<ctype , dimensionworld> NormalType;
00251 
00253   template <class EntityImp>
00254   LevelIntersectionIteratorWrapper(const GridImp & grid , const EntityImp & en, int wLevel , bool end ) 
00255     : BaseType(grid,en,wLevel,end,grid.levelIntersetionIteratorProvider()) 
00256   {
00257   } 
00258 
00260   LevelIntersectionIteratorWrapper(const ThisType & org)
00261     : BaseType(org)
00262   {
00263   }
00264 
00266   ThisType & operator = (const ThisType & org)
00267   {
00268     BaseType::operator = (org);
00269     return *this;
00270   }
00271 }; // end class IntersectionIteratorWrapper 
00272 
00273 } // end namespace Dune 
00274 #endif

Generated on 12 Dec 2007 with Doxygen (ver 1.5.1)