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
00103
00104 friend class Dune::GenericLeafIterator<GridImp>;
00105
00106
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
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
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;
00317
00318 }
00319
00320 #endif // DUNE_GRID_ENTITYPOINTER_HH