1
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2
// vi: set et ts=4 sw=2 sts=2:
1
3
#ifndef ALU2DGRID_ENTITYKEY_HH
2
4
#define ALU2DGRID_ENTITYKEY_HH
7
template<int cd, class GridImp>
8
class ALU2dGridEntitySeed ;
10
//**********************************************************************
12
// --ALU2dGridEntitySeed
14
//**********************************************************************
15
template< int codim, class GridImp >
16
class ALU2dGridEntitySeedBase
19
typedef ALU2dGridEntitySeedBase< codim, GridImp > ThisType;
20
enum { dim = GridImp::dimension };
21
enum { dimworld = GridImp::dimensionworld };
24
friend class ALU2dGridEntity<codim,dim,GridImp>;
25
friend class ALU2dGridEntity< 0,dim,GridImp>;
26
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
28
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
29
typedef typename ImplTraits::template Codim<codim>::InterfaceType ImplementationType;
30
typedef ImplementationType HElementType;
31
typedef ImplementationType KeyType;
34
static const int defaultValue = -1 ;
36
enum { codimension = codim };
39
typedef typename GridImp::template Codim<codimension>::Entity Entity;
40
//! underlying EntityImplementation
41
typedef MakeableInterfaceObject<Entity> EntityObject;
42
typedef typename EntityObject :: ImplementationType EntityImp;
44
//! typedef of my type
45
typedef ThisType ALU2dGridEntitySeedType;
47
//! make type of entity pointer implementation available in derived classes
48
typedef ALU2dGridEntitySeed<codimension,GridImp> EntitySeedImp;
51
~ALU2dGridEntitySeedBase()
9
template<int cd, class GridImp>
10
class ALU2dGridEntitySeed ;
12
//**********************************************************************
14
// --ALU2dGridEntitySeed
16
//**********************************************************************
17
template< int codim, class GridImp >
18
class ALU2dGridEntitySeedBase
21
typedef ALU2dGridEntitySeedBase< codim, GridImp > ThisType;
22
enum { dim = GridImp::dimension };
23
enum { dimworld = GridImp::dimensionworld };
26
friend class ALU2dGridEntity<codim,dim,GridImp>;
27
friend class ALU2dGridEntity< 0,dim,GridImp>;
28
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
30
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
31
typedef typename ImplTraits::template Codim<codim>::InterfaceType ImplementationType;
32
typedef ImplementationType HElementType;
33
typedef ImplementationType KeyType;
36
static const int defaultValue = -1 ;
38
enum { codimension = codim };
41
typedef typename GridImp::template Codim<codimension>::Entity Entity;
42
//! underlying EntityImplementation
43
typedef MakeableInterfaceObject<Entity> EntityObject;
44
typedef typename EntityObject :: ImplementationType EntityImp;
46
//! typedef of my type
47
typedef ThisType ALU2dGridEntitySeedType;
49
//! make type of entity pointer implementation available in derived classes
50
typedef ALU2dGridEntitySeed<codimension,GridImp> EntitySeedImp;
53
~ALU2dGridEntitySeedBase()
59
//! Constructor for EntitySeed that points to an element
60
ALU2dGridEntitySeedBase();
62
//! Constructor for EntitySeed that points to an element
63
ALU2dGridEntitySeedBase(const HElementType& item);
65
/////////////////////////////////////////////////////////////
69
/////////////////////////////////////////////////////////////
71
ALU2dGridEntitySeedBase(const ALU2dGridEntitySeedType & org);
74
bool operator == (const ALU2dGridEntitySeedType& i) const
79
//! inequality operator
80
bool operator != (const ALU2dGridEntitySeedType& i) const
85
//! assignment operator
86
ThisType & operator = (const ThisType & org);
88
//////////////////////////////////////////////////////
90
// non-interface methods
92
//////////////////////////////////////////////////////
94
bool equals (const ALU2dGridEntitySeedType& i) const;
102
//! get item from key
103
HElementType* item() const { return item_; }
105
KeyType* toKey(const HElementType* item)
107
return static_cast< KeyType* > (const_cast< ImplementationType* > (static_cast<const ImplementationType* > (item)));
110
void set(const HElementType& item, const int level = -1 , const int face = -1 )
112
item_ = toKey( &item );
115
int level () const { return ( item_ ) ? item_->level() : defaultValue; }
116
int face () const { return defaultValue; }
120
mutable KeyType* item_;
123
template<int cd, class GridImp>
124
class ALU2dGridEntitySeed :
125
public ALU2dGridEntitySeedBase<cd,GridImp>
127
typedef ALU2dGridEntitySeedBase<cd,GridImp> BaseType;
129
typedef ALU2dGridEntitySeed <cd,GridImp> ThisType;
130
enum { dim = GridImp::dimension };
131
enum { dimworld = GridImp::dimensionworld };
133
friend class ALU2dGridEntity<cd,dim,GridImp>;
134
friend class ALU2dGridEntity< 0,dim,GridImp>;
135
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
137
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
138
typedef typename ImplTraits::template Codim<cd>::InterfaceType ImplementationType;
139
typedef ImplementationType HElementType;
141
typedef ALU2dGridEntity<cd,dim,GridImp> ALU2dGridEntityType;
144
using BaseType :: defaultValue ;
147
typedef typename GridImp::template Codim<cd>::Entity Entity;
149
//! typedef of my type
150
typedef ALU2dGridEntitySeed<cd,GridImp> ALU2dGridEntitySeedType;
152
//! Constructor for EntitySeed that points to an element
153
ALU2dGridEntitySeed(const ImplementationType & item)
155
// this constructor should only be called by codim=0 entity keys
160
//! Constructor for EntitySeed that points to an element
161
ALU2dGridEntitySeed(const HElementType & item,
163
const int duneFace = defaultValue
166
//! Constructor for EntitySeed that points to an element
167
ALU2dGridEntitySeed()
168
: BaseType(), level_(defaultValue), face_(defaultValue) {}
170
//! Constructor for EntitySeed that points to given entity
171
ALU2dGridEntitySeed(const ALU2dGridEntityType& entity)
172
: ALU2dGridEntitySeedBase<cd,GridImp> (entity.getItem()),
173
level_(entity.level()), face_(defaultValue)
177
ALU2dGridEntitySeed(const ALU2dGridEntitySeedType & org);
179
//! assignment operator
180
ThisType & operator = (const ThisType & org);
182
//! clear the key data structure
185
//! set element and level
186
void set(const HElementType & item, const int level, const int duneFace )
188
BaseType :: set( item );
194
int level () const { return level_ ; }
196
int face () const { return face_ ; }
198
using BaseType :: set ;
200
bool operator == (const ALU2dGridEntitySeedType& i) const
205
bool operator != (const ALU2dGridEntitySeedType& i) const
207
return ! equals( i );
210
//! equality, calls BaseType equals
211
bool equals (const ALU2dGridEntitySeedType& key) const
213
// only compare the item pointer, this is the real key
214
return BaseType :: equals( key ) && (level() == key.level());
220
// face number, for codim 1 only
224
//! ALUGridEntitySeed points to an entity
225
//! this class is the specialisation for codim 0,
226
//! it has exactly the same functionality as the ALU2dGridEntitySeedBase
227
template<class GridImp>
228
class ALU2dGridEntitySeed<0,GridImp> :
229
public ALU2dGridEntitySeedBase<0,GridImp>
232
typedef ALU2dGridEntitySeedBase<0,GridImp> BaseType;
235
typedef ALU2dGridEntitySeed <cd,GridImp> ThisType;
236
enum { dim = GridImp::dimension };
237
enum { dimworld = GridImp::dimensionworld };
239
friend class ALU2dGridEntity<cd,dim,GridImp>;
240
friend class ALU2dGridEntity< 0,dim,GridImp>;
241
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
243
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
244
typedef typename ImplTraits::template Codim<cd>::InterfaceType ImplementationType;
245
typedef ImplementationType HElementType;
247
typedef ALU2dGridEntity< 0,dim,GridImp> ALU2dGridEntityType ;
250
using BaseType :: defaultValue ;
253
typedef typename GridImp::template Codim<cd>::Entity Entity;
255
//! typedef of my type
256
typedef ThisType ALU2dGridEntitySeedType;
258
//! Constructor for EntitySeed that points to an element
259
ALU2dGridEntitySeed() : BaseType() {}
261
//! Constructor for EntitySeed that points to an interior element
262
ALU2dGridEntitySeed(const HElementType& item)
263
: ALU2dGridEntitySeedBase<cd,GridImp> (item) {}
265
//! Constructor for EntitySeed that points to an interior element
266
ALU2dGridEntitySeed(const HElementType& item, int , int )
267
: ALU2dGridEntitySeedBase<cd,GridImp> (item) {}
61
//! Constructor for EntitySeed that points to an element
62
ALU2dGridEntitySeedBase();
64
//! Constructor for EntitySeed that points to an element
65
ALU2dGridEntitySeedBase(const HElementType& item);
67
/////////////////////////////////////////////////////////////
71
/////////////////////////////////////////////////////////////
73
ALU2dGridEntitySeedBase(const ALU2dGridEntitySeedType & org);
76
bool operator == (const ALU2dGridEntitySeedType& i) const
81
//! inequality operator
82
bool operator != (const ALU2dGridEntitySeedType& i) const
87
//! assignment operator
88
ThisType & operator = (const ThisType & org);
90
//! check for valid seed
96
//////////////////////////////////////////////////////
98
// non-interface methods
100
//////////////////////////////////////////////////////
102
bool equals (const ALU2dGridEntitySeedType& i) const;
110
//! get item from key
111
HElementType* item() const { return item_; }
113
KeyType* toKey(const HElementType* item)
115
return static_cast< KeyType* > (const_cast< ImplementationType* > (static_cast<const ImplementationType* > (item)));
118
void set(const HElementType& item, const int level = -1 , const int face = -1 )
120
item_ = toKey( &item );
123
int level () const { return ( item_ ) ? item_->level() : defaultValue; }
124
int face () const { return defaultValue; }
128
mutable KeyType* item_;
131
template<int cd, class GridImp>
132
class ALU2dGridEntitySeed :
133
public ALU2dGridEntitySeedBase<cd,GridImp>
135
typedef ALU2dGridEntitySeedBase<cd,GridImp> BaseType;
137
typedef ALU2dGridEntitySeed <cd,GridImp> ThisType;
138
enum { dim = GridImp::dimension };
139
enum { dimworld = GridImp::dimensionworld };
141
friend class ALU2dGridEntity<cd,dim,GridImp>;
142
friend class ALU2dGridEntity< 0,dim,GridImp>;
143
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
145
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
146
typedef typename ImplTraits::template Codim<cd>::InterfaceType ImplementationType;
147
typedef ImplementationType HElementType;
149
typedef ALU2dGridEntity<cd,dim,GridImp> ALU2dGridEntityType;
152
using BaseType :: defaultValue ;
155
typedef typename GridImp::template Codim<cd>::Entity Entity;
157
//! typedef of my type
158
typedef ALU2dGridEntitySeed<cd,GridImp> ALU2dGridEntitySeedType;
160
//! Constructor for EntitySeed that points to an element
161
ALU2dGridEntitySeed(const ImplementationType & item)
163
// this constructor should only be called by codim=0 entity keys
168
//! Constructor for EntitySeed that points to an element
169
ALU2dGridEntitySeed(const HElementType & item,
171
const int duneFace = defaultValue
174
//! Constructor for EntitySeed that points to an element
175
ALU2dGridEntitySeed()
176
: BaseType(), level_(defaultValue), face_(defaultValue) {}
178
//! Constructor for EntitySeed that points to given entity
179
ALU2dGridEntitySeed(const ALU2dGridEntityType& entity)
180
: ALU2dGridEntitySeedBase<cd,GridImp> (entity.getItem()),
181
level_(entity.level()), face_(defaultValue)
185
ALU2dGridEntitySeed(const ALU2dGridEntitySeedType & org);
187
//! assignment operator
188
ThisType & operator = (const ThisType & org);
190
//! clear the key data structure
193
//! set element and level
194
void set(const HElementType & item, const int level, const int duneFace )
196
BaseType :: set( item );
202
int level () const { return level_ ; }
204
int face () const { return face_ ; }
206
using BaseType :: set ;
208
bool operator == (const ALU2dGridEntitySeedType& i) const
213
bool operator != (const ALU2dGridEntitySeedType& i) const
215
return ! equals( i );
218
//! equality, calls BaseType equals
219
bool equals (const ALU2dGridEntitySeedType& key) const
221
// only compare the item pointer, this is the real key
222
return BaseType :: equals( key ) && (level() == key.level());
228
// face number, for codim 1 only
232
//! ALUGridEntitySeed points to an entity
233
//! this class is the specialisation for codim 0,
234
//! it has exactly the same functionality as the ALU2dGridEntitySeedBase
235
template<class GridImp>
236
class ALU2dGridEntitySeed<0,GridImp> :
237
public ALU2dGridEntitySeedBase<0,GridImp>
240
typedef ALU2dGridEntitySeedBase<0,GridImp> BaseType;
243
typedef ALU2dGridEntitySeed <cd,GridImp> ThisType;
244
enum { dim = GridImp::dimension };
245
enum { dimworld = GridImp::dimensionworld };
247
friend class ALU2dGridEntity<cd,dim,GridImp>;
248
friend class ALU2dGridEntity< 0,dim,GridImp>;
249
friend class ALU2dGrid <GridImp :: dimension, GridImp::dimensionworld, GridImp::elementType >;
251
typedef ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType > ImplTraits;
252
typedef typename ImplTraits::template Codim<cd>::InterfaceType ImplementationType;
253
typedef ImplementationType HElementType;
255
typedef ALU2dGridEntity< 0,dim,GridImp> ALU2dGridEntityType ;
258
using BaseType :: defaultValue ;
261
typedef typename GridImp::template Codim<cd>::Entity Entity;
263
//! typedef of my type
264
typedef ThisType ALU2dGridEntitySeedType;
266
//! Constructor for EntitySeed that points to an element
267
ALU2dGridEntitySeed() : BaseType() {}
269
//! Constructor for EntitySeed that points to an interior element
270
ALU2dGridEntitySeed(const HElementType& item)
271
: ALU2dGridEntitySeedBase<cd,GridImp> (item) {}
273
//! Constructor for EntitySeed that points to an interior element
274
ALU2dGridEntitySeed(const HElementType& item, int , int )
275
: ALU2dGridEntitySeedBase<cd,GridImp> (item) {}
278
ALU2dGridEntitySeed(const ALU2dGridEntitySeedType & org)
279
: ALU2dGridEntitySeedBase<cd,GridImp> (org)
284
//! print alugrid entity key to std::stream
285
template <int cd, class GridImp>
286
inline std :: ostream &operator<< ( std :: ostream &out,
287
const ALU2dGridEntitySeed<cd,GridImp>& key)
289
out << key.item() << " " << key.level() << " " << key.face();
294
//*******************************************************************
298
//*******************************************************************
299
template<int codim, class GridImp >
300
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
301
ALU2dGridEntitySeedBase()
305
template<int codim, class GridImp >
306
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
307
ALU2dGridEntitySeedBase(const HElementType &item)
308
: item_( toKey(&item) )
311
template<int codim, class GridImp >
312
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
313
ALU2dGridEntitySeedBase(const ALU2dGridEntitySeedType & org)
317
template<int codim, class GridImp >
318
inline ALU2dGridEntitySeedBase<codim,GridImp> &
319
ALU2dGridEntitySeedBase<codim,GridImp> ::
320
operator = (const ALU2dGridEntitySeedType & org)
326
template<int codim, class GridImp >
327
inline bool ALU2dGridEntitySeedBase<codim,GridImp>::
328
equals (const ALU2dGridEntitySeedBase<codim,GridImp>& i) const
330
// check equality of underlying items
331
return (item_ == i.item_);
334
///////////////////////////////////////////////////////////////////
336
// specialisation for higher codims
338
///////////////////////////////////////////////////////////////////
340
template<int codim, class GridImp >
341
inline ALU2dGridEntitySeed<codim,GridImp> ::
342
ALU2dGridEntitySeed(const HElementType &item,
345
: ALU2dGridEntitySeedBase<codim,GridImp> (item)
349
assert( (codim == 1) ? (face_ >= 0) : 1 );
352
template<int codim, class GridImp >
353
inline ALU2dGridEntitySeed<codim,GridImp> ::
270
354
ALU2dGridEntitySeed(const ALU2dGridEntitySeedType & org)
271
: ALU2dGridEntitySeedBase<cd,GridImp> (org)
277
//! print alugrid entity key to std::stream
278
template <int cd, class GridImp>
279
inline std :: ostream &operator<< ( std :: ostream &out,
280
const ALU2dGridEntitySeed<cd,GridImp>& key)
282
out << key.item() << " " << key.level() << " " << key.face();
287
//*******************************************************************
291
//*******************************************************************
292
template<int codim, class GridImp >
293
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
294
ALU2dGridEntitySeedBase()
299
template<int codim, class GridImp >
300
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
301
ALU2dGridEntitySeedBase(const HElementType &item)
302
: item_( toKey(&item) )
306
template<int codim, class GridImp >
307
inline ALU2dGridEntitySeedBase<codim,GridImp> ::
308
ALU2dGridEntitySeedBase(const ALU2dGridEntitySeedType & org)
313
template<int codim, class GridImp >
314
inline ALU2dGridEntitySeedBase<codim,GridImp> &
315
ALU2dGridEntitySeedBase<codim,GridImp> ::
316
operator = (const ALU2dGridEntitySeedType & org)
322
template<int codim, class GridImp >
323
inline bool ALU2dGridEntitySeedBase<codim,GridImp>::
324
equals (const ALU2dGridEntitySeedBase<codim,GridImp>& i) const
326
// check equality of underlying items
327
return (item_ == i.item_);
330
///////////////////////////////////////////////////////////////////
332
// specialisation for higher codims
334
///////////////////////////////////////////////////////////////////
336
template<int codim, class GridImp >
337
inline ALU2dGridEntitySeed<codim,GridImp> ::
338
ALU2dGridEntitySeed(const HElementType &item,
341
: ALU2dGridEntitySeedBase<codim,GridImp> (item)
345
assert( (codim == 1) ? (face_ >= 0) : 1 );
348
template<int codim, class GridImp >
349
inline ALU2dGridEntitySeed<codim,GridImp> ::
350
ALU2dGridEntitySeed(const ALU2dGridEntitySeedType & org)
351
: ALU2dGridEntitySeedBase<codim,GridImp>(org)
357
template<int codim, class GridImp >
358
inline ALU2dGridEntitySeed<codim,GridImp> &
359
ALU2dGridEntitySeed<codim,GridImp>::
360
operator = (const ALU2dGridEntitySeedType & org)
363
BaseType :: operator = ( org );
371
template<int codim, class GridImp >
373
ALU2dGridEntitySeed<codim,GridImp>::clear ()
376
level_ = defaultValue ;
377
face_ = defaultValue ;
380
} // end namespace Dune
355
: ALU2dGridEntitySeedBase<codim,GridImp>(org)
360
template<int codim, class GridImp >
361
inline ALU2dGridEntitySeed<codim,GridImp> &
362
ALU2dGridEntitySeed<codim,GridImp>::
363
operator = (const ALU2dGridEntitySeedType & org)
366
BaseType :: operator = ( org );
374
template<int codim, class GridImp >
376
ALU2dGridEntitySeed<codim,GridImp>::clear ()
379
level_ = defaultValue ;
380
face_ = defaultValue ;
383
} // end namespace Dune