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 entity_.impl().equals( other.entity_.impl() );
66 Entity &dereference ()
const
74 return entity_.impl().level();
79 const GridImp &grid ()
const
81 return entity_.impl().grid();
85 void increment ( ElementInfo elementInfo );
87 mutable Entity entity_;
97 template<
class Gr
idImp >
98 inline AlbertaGridHierarchicIterator< GridImp >
99 ::AlbertaGridHierarchicIterator(
const GridImp &grid,
int actLevel,
int maxLevel )
100 : entity_( EntityImp( grid ) ),
101 startLevel_( actLevel ),
102 maxlevel_( maxLevel )
106 template<
class Gr
idImp >
107 inline AlbertaGridHierarchicIterator< GridImp >
108 ::AlbertaGridHierarchicIterator (
const GridImp &grid,
109 const ElementInfo &elementInfo,
111 : entity_( EntityImp( grid ) ),
112 startLevel_( elementInfo.level() ),
113 maxlevel_( maxLevel )
115 increment( elementInfo );
119 template<
class Gr
idImp >
120 inline AlbertaGridHierarchicIterator< GridImp >
121 ::AlbertaGridHierarchicIterator(
const This &other )
122 : entity_( other.entity_ ),
123 startLevel_( other.startLevel_ ),
124 maxlevel_( other.maxlevel_ )
128 template<
class Gr
idImp >
129 inline typename AlbertaGridHierarchicIterator< GridImp >::This &
130 AlbertaGridHierarchicIterator< GridImp >::operator= (
const This &other )
132 entity_ = other.entity_;
133 startLevel_ = other.startLevel_;
134 maxlevel_ = other.maxlevel_;
139 template<
class Gr
idImp >
140 inline void AlbertaGridHierarchicIterator< GridImp >::increment ()
142 increment( entity_.impl().elementInfo() );
145 template<
class Gr
idImp >
146 inline void AlbertaGridHierarchicIterator< GridImp >
147 ::increment ( ElementInfo elementInfo )
149 assert( !elementInfo ==
false );
150 if( (elementInfo.level() >= maxlevel_) || elementInfo.isLeaf() )
152 while( (elementInfo.level() > startLevel_) && (elementInfo.indexInFather() == 1) )
153 elementInfo = elementInfo.father();
154 if( elementInfo.level() > startLevel_ )
155 entity_.impl().setElement( elementInfo.father().child( 1 ), 0 );
157 entity_.impl().clearElement();
160 entity_.impl().setElement( elementInfo.child( 0 ), 0 );
165 #endif // #if HAVE_ALBERTA
167 #endif // #ifndef DUNE_ALBERTA_HIERARCHICITERATOR_HH