1 #ifndef DUNE_MULTISPGRID_ENTITYPOINTER_HH 2 #define DUNE_MULTISPGRID_ENTITYPOINTER_HH 3 4 #include <dune/common/typetraits.hh> 5 6 #include <dune/grid/common/entity.hh> 7 #include <dune/grid/common/entitypointer.hh> 8 9 namespace Dune 10 { 11 12 // Forward declarations 13 // -------------------- 14 15 template< int, int, class > 16 class MultiSPEntity; 17 18 19 20 // MultiSPEntityPointerTraits 21 // -------------------------- 22 23 template< int codim, class GridImp > 24 class MultiSPEntityPointerTraits 25 { 26 // this type 27 typedef MultiSPEntityPointerTraits< codim, GridImp > This; 28 // grid traits 29 typedef typename std::remove_const< GridImp >::type::Traits Traits; 30 31 public: 32 //! \brief base traits 33 typedef This BaseTraits; 34 35 //! \brief codimension 36 static const int codimension = codim; 37 //! \brief grid dimension 38 static const int dimension = Traits::dimension; 39 40 //! \brief grid type 41 typedef typename std::remove_const< GridImp >::type Grid; 42 43 //! \brief type of entity implementation 44 typedef MultiSPEntity< codimension, dimension, const Grid > EntityImp; 45 //! \brief type of entity 46 typedef Dune::Entity< codimension, dimension, const Grid, MultiSPEntity > Entity; 47 48 //! \brief host itereator type 49 typedef typename Traits::HostGrid::template Codim< codim >::EntityPointer HostIterator; 50 }; 51 52 53 54 // MultiSPEntityPointer 55 // -------------------- 56 57 /** \brief Entity pointer 58 * 59 * \ingroup EntityPointer 60 */ 61 62 template< class Traits > 63 class MultiSPEntityPointer 64 { 65 // this type 66 typedef MultiSPEntityPointer< Traits > This; 67 68 public: 69 //! \brief codimension 70 static const int codimension = Traits::codimension; 71 //! \brief grid dimension 72 static const int dimension = Traits::dimension; 73 74 //! \brief grid type 75 typedef typename Traits::Grid Grid; 76 77 //! \brief entity type 78 typedef typename Traits::Entity Entity; 79 //! \brief type of entity implementation 80 typedef typename Traits::EntityImp EntityImp; 81 82 //! \brief type of host iterator 83 typedef typename Traits::HostIterator HostIterator; 84 85 //! \brief type of entity pointer implementation 86 typedef MultiSPEntityPointer< typename Traits::BaseTraits > EntityPointerImp; 87 88 private: 89 friend class MultiSPEntityPointer< typename Traits::BaseTraits >; 90 91 public: 92 //! \brief constructor MultiSPEntityPointer(const HostIterator & hostIterator,const int node,const Grid & grid)93 explicit MultiSPEntityPointer ( const HostIterator &hostIterator, const int node, const Grid &grid ) 94 : entity_( EntityImp( grid ) ), 95 node_( node ), 96 hostIterator_( hostIterator ) 97 {} 98 99 //! \brief constructor MultiSPEntityPointer(const EntityImp & entity)100 explicit MultiSPEntityPointer ( const EntityImp &entity ) 101 : entity_( EntityImp( entity.grid() ) ), 102 node_( entity.node() ), 103 hostIterator_( entity.hostEntity() ) 104 {} 105 106 // warning: copying the entity copies the wrong pointer to the host entity! 107 //! \brief copy constructor MultiSPEntityPointer(const This & other)108 MultiSPEntityPointer ( const This &other ) 109 : entity_( EntityImp( other.grid() ) ), 110 node_( other.node_ ), 111 hostIterator_( other.hostIterator() ) 112 {} 113 114 // warning: copying the entity copies the wrong pointer to the host entity! 115 //! \brief copy constructor 116 template< class T > MultiSPEntityPointer(const MultiSPEntityPointer<T> & other)117 MultiSPEntityPointer ( const MultiSPEntityPointer< T > &other ) 118 : entity_( EntityImp( other.grid() ) ), 119 node_( other.node_ ), 120 hostIterator_( other.hostIterator() ) 121 {} 122 123 // warning: copying the entity copies the wrong pointer to the host entity! 124 //! \brief assignment operator operator =(const This & other)125 This &operator= ( const This &other ) 126 { 127 entityImp() = EntityImp( other.grid() ); 128 node_ = other.node_; 129 hostIterator_ = other.hostIterator_; 130 return *this; 131 } 132 133 // warning: copying the entity copies the wrong pointer to the host entity! 134 //! \brief assignment operator 135 template< class T > operator =(const MultiSPEntityPointer<T> & other)136 This &operator= ( const MultiSPEntityPointer< T > &other ) 137 { 138 entityImp() = EntityImp( other.grid() ); 139 node_ = other.node_; 140 hostIterator_ = other.hostIterator_; 141 return *this; 142 } 143 144 //! \brief dereference entity dereference() const145 Entity &dereference () const 146 { 147 if( !entityImp() ) 148 entityImp() = EntityImp( *hostIterator(), node(), grid() ); 149 return entity_; 150 } 151 152 //! \brief check for equality 153 template< class T > equals(const MultiSPEntityPointer<T> & other) const154 bool equals ( const MultiSPEntityPointer< T > &other ) const 155 { 156 return ( node() == other.node() && hostIterator() == other.hostIterator() ); 157 } 158 159 //! \brief return level level() const160 int level () const 161 { 162 return hostIterator().level(); 163 } 164 165 //! \brief return host iterator hostIterator() const166 const HostIterator &hostIterator () const 167 { 168 return hostIterator_; 169 } 170 171 //! \brief return node node() const172 int node () const 173 { 174 return node_; 175 } 176 177 //! \brief return grid grid() const178 const Grid &grid () const 179 { 180 return entityImp().grid(); 181 } 182 183 protected: 184 //! \brief release entity releaseEntity()185 void releaseEntity () 186 { 187 entityImp() = EntityImp( grid() ); 188 assert( !entityImp() ); 189 } 190 191 private: 192 // return as imp entityImp() const193 EntityImp &entityImp () const 194 { 195 return entity_.impl(); 196 } 197 198 mutable Entity entity_; 199 200 protected: 201 int node_; 202 HostIterator hostIterator_; 203 }; 204 205 } // namespace Dune 206 207 #endif // #ifndef DUNE_MULTISPGRID_ENTITYPOINTER_HH 208