Fixed bug 1440694 by adding check if rhs is previous neighbor.

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@575 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
rich_sposato 2006-03-01 02:08:11 +00:00
parent 867fb85151
commit e9a1abe64c
2 changed files with 55 additions and 4 deletions

View file

@ -89,7 +89,7 @@ void RefLinkedBase::Swap(RefLinkedBase& rhs)
rhs.Swap(*this);
return;
}
if (next_ == &rhs ) // neighbours
if (next_ == &rhs ) // rhs is next neighbour
{
if ( prev_ == &rhs )
return; // cycle of 2 pointers - no need to swap.
@ -98,14 +98,23 @@ void RefLinkedBase::Swap(RefLinkedBase& rhs)
std::swap(rhs.prev_, next_);
std::swap(rhs.prev_->next_,next_->prev_);
}
else
else if ( prev_ == &rhs ) // rhs is prev neighbor
{
if ( next_ == &rhs )
return; // cycle of 2 pointers - no need to swap.
std::swap( prev_, next_ );
std::swap( rhs.next_, rhs.prev_ );
std::swap( rhs.next_, prev_ );
std::swap( rhs.next_->prev_, prev_->next_ );
}
else // not neighhbors
{
std::swap(prev_, rhs.prev_);
std::swap(next_, rhs.next_);
std::swap(prev_->next_, rhs.prev_->next_);
std::swap(next_->prev_, rhs.next_->prev_);
}
assert( next_ == this ? prev_ == this : prev_ != this);
}
@ -118,6 +127,9 @@ void RefLinkedBase::Swap(RefLinkedBase& rhs)
// ----------------------------------------------------------------------------
// $Log$
// Revision 1.3 2006/03/01 02:08:10 rich_sposato
// Fixed bug 1440694 by adding check if rhs is previous neighbor.
//
// Revision 1.2 2006/02/25 13:07:15 syntheticpp
// gcc does not like ; when closing a namespace
//

View file

@ -578,7 +578,43 @@ void DoRefLinkSwapTests( void )
assert( p5 == p5 );
assert( p6 == p6 );
p5 = p3;
p5 = p3; // p6 <---> p2 <---> p3 <---> p5 and p4 <---> p1
assert( p6 == p5 );
assert( p6 == p2 );
assert( p6 == p3 );
assert( p5 == p3 );
assert( p2 == p3 );
assert( p1 == p4 );
assert( p2 != p4 );
assert( p1 != p5 );
assert( p2 != p1 );
assert( p3 != p1 );
assert( p1 == p1 );
assert( p2 == p2 );
assert( p3 == p3 );
assert( p4 == p4 );
assert( p5 == p5 );
assert( p6 == p6 );
p5.Swap( p3 ); // p6 <---> p2 <---> p5 <---> p3 and p4 <---> p1
assert( p6 == p5 );
assert( p6 == p2 );
assert( p6 == p3 );
assert( p5 == p3 );
assert( p2 == p3 );
assert( p1 == p4 );
assert( p2 != p4 );
assert( p1 != p5 );
assert( p2 != p1 );
assert( p3 != p1 );
assert( p1 == p1 );
assert( p2 == p2 );
assert( p3 == p3 );
assert( p4 == p4 );
assert( p5 == p5 );
assert( p6 == p6 );
p2.Swap( p3 ); // p6 <---> p3 <---> p5 <---> p2 and p4 <---> p1
assert( p6 == p5 );
assert( p6 == p2 );
assert( p6 == p3 );
@ -621,6 +657,9 @@ int main( unsigned int , const char * [] )
// ----------------------------------------------------------------------------
// $Log$
// Revision 1.2 2006/03/01 02:08:11 rich_sposato
// Fixed bug 1440694 by adding check if rhs is previous neighbor.
//
// Revision 1.1 2006/02/25 01:53:20 rich_sposato
// Added test project for Loki::SmartPtr class.
//