Skip to content
Snippets Groups Projects
Commit 553de7fe authored by Robert Klöfkorn's avatar Robert Klöfkorn
Browse files

implemented assignment of HierarchicIterators.

Assignment for Level- or LeafIterators not working.

[[Imported from SVN: r4467]]
parent feaf5b71
No related branches found
No related tags found
No related merge requests found
...@@ -404,6 +404,9 @@ namespace Dune { ...@@ -404,6 +404,9 @@ namespace Dune {
int level () const ; int level () const ;
protected: protected:
// clones object
void clone (const ALU3dGridEntityPointerType & org);
//! has to be called when iterator is finished //! has to be called when iterator is finished
void done (); void done ();
......
...@@ -734,6 +734,27 @@ namespace Dune { ...@@ -734,6 +734,27 @@ namespace Dune {
return *this; return *this;
} }
template<int codim, class GridImp >
inline void
ALU3dGridEntityPointerBase<codim,GridImp> ::
clone (const ALU3dGridEntityPointerType & org)
{
assert( &grid_ == &org.grid_ );
// set item
item_ = org.item_;
// if entity exists, just remove item pointer
if(entity_)
{
if(item_)
this->entityImp().setElement( *item_ );
else
this->entityImp().removeElement();
}
return ;
}
template<int codim, class GridImp > template<int codim, class GridImp >
inline ALU3dGridEntityPointerBase<codim,GridImp> :: inline ALU3dGridEntityPointerBase<codim,GridImp> ::
~ALU3dGridEntityPointerBase() ~ALU3dGridEntityPointerBase()
......
...@@ -1041,15 +1041,15 @@ namespace Dune { ...@@ -1041,15 +1041,15 @@ namespace Dune {
//! dereference Entity, faster then the entity pointersmethod //! dereference Entity, faster then the entity pointersmethod
Entity & dereference () const; Entity & dereference () const;
private:
//! the assignment operator //! the assignment operator
ThisType & operator = (const ALU3dGridHierarchicIterator<GridImp> &org); ThisType & operator = (const ALU3dGridHierarchicIterator<GridImp> &org);
private:
// go to next valid element // go to next valid element
ALU3DSPACE HElementType * goNextElement (ALU3DSPACE HElementType * oldEl); ALU3DSPACE HElementType * goNextElement (ALU3DSPACE HElementType * oldEl);
//! element from where we started //! element from where we started
const ALU3DSPACE HElementType & elem_; const ALU3DSPACE HElementType * elem_;
//! maximal level to go down //! maximal level to go down
int maxlevel_; int maxlevel_;
......
...@@ -763,13 +763,13 @@ namespace Dune { ...@@ -763,13 +763,13 @@ namespace Dune {
ALU3dGridHierarchicIterator(const GridImp & grid , ALU3dGridHierarchicIterator(const GridImp & grid ,
const ALU3DSPACE HElementType & elem, int maxlevel ,bool end) const ALU3DSPACE HElementType & elem, int maxlevel ,bool end)
: ALU3dGridEntityPointer<0,GridImp> ( grid, maxlevel ) : ALU3dGridEntityPointer<0,GridImp> ( grid, maxlevel )
, elem_(elem) , elem_(&elem)
, maxlevel_(maxlevel) , maxlevel_(maxlevel)
{ {
if (!end) if (!end)
{ {
ALU3DSPACE HElementType * item = ALU3DSPACE HElementType * item =
const_cast<ALU3DSPACE HElementType *> (elem_.down()); const_cast<ALU3DSPACE HElementType *> (elem.down());
if(item) if(item)
{ {
// we have children and they lie in the disired level range // we have children and they lie in the disired level range
...@@ -797,6 +797,20 @@ namespace Dune { ...@@ -797,6 +797,20 @@ namespace Dune {
, maxlevel_(org.maxlevel_) , maxlevel_(org.maxlevel_)
{} {}
template <class GridImp>
inline ALU3dGridHierarchicIterator<GridImp> &
ALU3dGridHierarchicIterator<GridImp> ::
operator = (const ALU3dGridHierarchicIterator<GridImp> & org)
{
elem_ = org.elem_;
maxlevel_ = org.maxlevel_;
// this method will free entity
this->clone(org);
return *this;
}
template <class GridImp> template <class GridImp>
inline ALU3DSPACE HElementType * ALU3dGridHierarchicIterator<GridImp>:: inline ALU3DSPACE HElementType * ALU3dGridHierarchicIterator<GridImp>::
goNextElement(ALU3DSPACE HElementType * oldelem ) goNextElement(ALU3DSPACE HElementType * oldelem )
...@@ -820,12 +834,12 @@ namespace Dune { ...@@ -820,12 +834,12 @@ namespace Dune {
} }
nextelem = oldelem->up(); nextelem = oldelem->up();
if(nextelem == &elem_) return 0; if(nextelem == elem_) return 0;
while( !nextelem->next() ) while( !nextelem->next() )
{ {
nextelem = nextelem->up(); nextelem = nextelem->up();
if(nextelem == &elem_) return 0; if(nextelem == elem_) return 0;
} }
if(nextelem) nextelem = nextelem->next(); if(nextelem) nextelem = nextelem->next();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment