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:
parent
867fb85151
commit
e9a1abe64c
2 changed files with 55 additions and 4 deletions
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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.
|
||||
//
|
||||
|
|
Loading…
Add table
Reference in a new issue