3 #ifndef DUNE_ALBERTA_HIERARCHICITERATOR_HH
4 #define DUNE_ALBERTA_HIERARCHICITERATOR_HH
25 template<
class Gr
idImp >
26 class AlbertaGridHierarchicIterator
28 typedef AlbertaGridHierarchicIterator< GridImp > This;
31 typedef typename GridImp::template Codim<0>::Entity Entity;
32 typedef typename GridImp::ctype ctype;
34 typedef MakeableInterfaceObject< Entity > EntityObject;
35 typedef typename EntityObject::ImplementationType EntityImp;
37 typedef typename EntityImp::ElementInfo ElementInfo;
39 AlbertaGridHierarchicIterator ()
43 AlbertaGridHierarchicIterator (
const GridImp &grid,
44 const ElementInfo &elementInfo,
48 AlbertaGridHierarchicIterator (
const GridImp &grid,
int actLevel,
int maxLevel );
51 AlbertaGridHierarchicIterator (
const This &other );
54 This &operator= (
const This &other );
60 bool equals (
const This &other )
const
62 return entityImp().equals( other.entityImp() );
66 Entity &dereference ()
const
74 return entityImp().level();
79 EntityImp &entityImp ()
81 return GridImp::getRealImplementation( entity_ );
85 const EntityImp &entityImp ()
const
87 return GridImp::getRealImplementation( entity_ );
91 const GridImp &grid ()
const
93 return entityImp().grid();
97 void increment ( ElementInfo elementInfo );
99 mutable Entity entity_;
109 template<
class Gr
idImp >
110 inline AlbertaGridHierarchicIterator< GridImp >
111 ::AlbertaGridHierarchicIterator(
const GridImp &grid,
int actLevel,
int maxLevel )
112 : entity_( EntityImp( grid ) ),
113 startLevel_( actLevel ),
114 maxlevel_( maxLevel )
118 template<
class Gr
idImp >
119 inline AlbertaGridHierarchicIterator< GridImp >
120 ::AlbertaGridHierarchicIterator (
const GridImp &grid,
121 const ElementInfo &elementInfo,
123 : entity_( EntityImp( grid ) ),
124 startLevel_( elementInfo.level() ),
125 maxlevel_( maxLevel )
127 increment( elementInfo );
131 template<
class Gr
idImp >
132 inline AlbertaGridHierarchicIterator< GridImp >
133 ::AlbertaGridHierarchicIterator(
const This &other )
134 : entity_( other.entity_ ),
135 startLevel_( other.startLevel_ ),
136 maxlevel_( other.maxlevel_ )
140 template<
class Gr
idImp >
141 inline typename AlbertaGridHierarchicIterator< GridImp >::This &
142 AlbertaGridHierarchicIterator< GridImp >::operator= (
const This &other )
144 entity_ = other.entity_;
145 startLevel_ = other.startLevel_;
146 maxlevel_ = other.maxlevel_;
151 template<
class Gr
idImp >
152 inline void AlbertaGridHierarchicIterator< GridImp >::increment ()
154 increment( entityImp().elementInfo() );
157 template<
class Gr
idImp >
158 inline void AlbertaGridHierarchicIterator< GridImp >
159 ::increment ( ElementInfo elementInfo )
161 assert( !elementInfo ==
false );
162 if( (elementInfo.level() >= maxlevel_) || elementInfo.isLeaf() )
164 while( (elementInfo.level() > startLevel_) && (elementInfo.indexInFather() == 1) )
165 elementInfo = elementInfo.father();
166 if( elementInfo.level() > startLevel_ )
167 entityImp().setElement( elementInfo.father().child( 1 ), 0 );
169 entityImp().clearElement();
172 entityImp().setElement( elementInfo.child( 0 ), 0 );
177 #endif // #if HAVE_ALBERTA
179 #endif // #ifndef DUNE_ALBERTA_HIERARCHICITERATOR_HH