common/entitypointer.hh

Go to the documentation of this file.
00001 #ifndef DUNE_GRID_ENTITYPOINTER_HH
00002 #define DUNE_GRID_ENTITYPOINTER_HH
00003 
00004 #include <dune/common/iteratorfacades.hh>
00005 #include <dune/grid/common/grid.hh>
00006 
00011 namespace Dune
00012 {
00013 
00099 template<class GridImp, class IteratorImp>
00100 class EntityPointer
00101 {
00102   // we must be able to initialize a GenericLeafIterator.realIterator from
00103   // EntityPointer.realIterator
00104   friend class Dune::GenericLeafIterator<GridImp>;
00105 
00106   // need to make copy constructor of EntityPointer work for any iterator
00107   friend class EntityPointer<GridImp,typename IteratorImp::EntityPointerImp>;
00108 
00109 protected:
00110   IteratorImp realIterator;
00111 
00113   typedef typename
00114   Dune::EnableIfInterOperable<typename IteratorImp::EntityPointerImp,IteratorImp,
00115                               typename IteratorImp::EntityPointerImp>::type base;
00116 
00117 public:
00119   enum { codimension = IteratorImp::codimension };
00120   
00122   typedef IteratorImp ImplementationType;
00123   
00125   typedef typename IteratorImp::Entity Entity;
00126 
00127   enum { 
00129         codim = IteratorImp::codimension 
00130   };
00131 
00132   //===========================================================
00136   //===========================================================
00137 
00144   template<class ItImp>
00145   EntityPointer(const EntityPointer<GridImp,ItImp> & ep) :
00146     realIterator(ep.realIterator) {}
00147 
00154   EntityPointer(const Entity& entity) :
00155     realIterator( entity.getRealImp() ) {}
00156 
00161   operator EntityPointer<GridImp,base>&()
00162     {
00163       return reinterpret_cast<EntityPointer<GridImp,base>&>(*this);
00164     };
00165 
00170   operator const EntityPointer<GridImp,base>&() const
00171     {
00172       return reinterpret_cast<const EntityPointer<GridImp,base>&>(*this);
00173     };
00174 
00178   void compactify () 
00179     {
00180       realIterator.compactify();
00181     }
00182   
00184 
00185   //===========================================================
00189   //===========================================================
00190 
00192   Entity & operator*() const
00193     {
00194       return realIterator.dereference();
00195     }
00196 
00198   Entity * operator->() const
00199     {
00200       return & realIterator.dereference();
00201     }
00203 
00204   //===========================================================
00208   //===========================================================
00209 
00215   bool operator==(const EntityPointer<GridImp,base>& rhs) const
00216     {
00217       return rhs.equals(*this);
00218     }
00219 
00225   bool operator!=(const EntityPointer<GridImp,base>& rhs) const
00226     {
00227       return ! rhs.equals(*this);
00228     }
00230 
00231 
00232   //===========================================================
00236   //===========================================================
00237 
00243   int level () const
00244     {
00245       return realIterator.level();
00246     }
00247 
00249   
00250 
00251   //===========================================================
00255   //===========================================================
00256 
00257 
00263   EntityPointer(const IteratorImp & i) :
00264     realIterator(i) {};
00265 
00267   bool equals(const EntityPointer& rhs) const
00268     {
00269       return this->realIterator.equals(rhs.realIterator);
00270     }
00272 
00273 protected:
00274 
00275   // give the GridDefaultImplementation class access to the realImp 
00276   friend class GridDefaultImplementation<
00277             GridImp::dimension, GridImp::dimensionworld,
00278             typename GridImp::ctype,
00279             typename GridImp::GridFamily> ;
00280 
00282   ImplementationType & getRealImp() { return realIterator; }
00284   const ImplementationType & getRealImp() const { return realIterator; }
00285   
00286 };
00287 
00288 //**********************************************************************
00289 //
00290 //  --EntityPointerDefault
00291 //
00293 //**********************************************************************
00294 template<int codim, class GridImp, class IteratorImp>
00295 class EntityPointerDefaultImplementation
00296 {
00297 public:
00300   typedef IteratorImp EntityPointerImp;
00301  
00303   enum { codimension = codim };
00304   
00306   EntityPointerDefaultImplementation() DUNE_DEPRECATED {}
00307 
00308 private:
00310   IteratorImp& asImp () {
00311     return static_cast<IteratorImp&>(*this);
00312   }
00313   const IteratorImp& asImp () const {
00314     return static_cast<const IteratorImp&>(*this);
00315   }
00316 } DUNE_DEPRECATED; // end EntityPointerDefaultImplementation
00317 
00318 }
00319 
00320 #endif // DUNE_GRID_ENTITYPOINTER_HH

Generated on Tue Jul 28 22:28:16 2009 for dune-grid by  doxygen 1.5.6