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