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 };
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 };
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 };
00272
00273 }
00274 #endif