mirror of https://github.com/CGAL/cgal
Fixed a bug in the swap(pos1, pos2) function.
This commit is contained in:
parent
3117e5af59
commit
68d5ab3e0c
|
|
@ -1355,6 +1355,14 @@ protected:
|
||||||
*/
|
*/
|
||||||
void _swap (Node* node1_P, Node* node2_P);
|
void _swap (Node* node1_P, Node* node2_P);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Swap the location two sibling nodes in the tree.
|
||||||
|
* \param node1_P The first node.
|
||||||
|
* \param node2_P The second node.
|
||||||
|
* \pre The two nodes have a common parent.
|
||||||
|
*/
|
||||||
|
void _swap_siblings (Node* node1_P, Node* node2_P);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Calculate the height of the sub-tree spanned by the given node.
|
* Calculate the height of the sub-tree spanned by the given node.
|
||||||
* \param nodeP The sub-tree root.
|
* \param nodeP The sub-tree root.
|
||||||
|
|
@ -2304,7 +2312,11 @@ void Multiset<Type, Compare, Allocator>::swap (iterator pos1,
|
||||||
_pred2_P->object) != SMALLER);
|
_pred2_P->object) != SMALLER);
|
||||||
|
|
||||||
// Perform the swap.
|
// Perform the swap.
|
||||||
_swap (node1_P, node2_P);
|
if (node1_P->parentP == node2_P->parentP)
|
||||||
|
_swap_siblings (node1_P, node2_P);
|
||||||
|
else
|
||||||
|
_swap (node1_P, node2_P);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3330,6 +3342,82 @@ void Multiset<Type, Compare, Allocator>::_swap (Node* node1_P,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// Swap the location two sibling nodes in the tree.
|
||||||
|
//
|
||||||
|
template <class Type, class Compare, typename Allocator>
|
||||||
|
void Multiset<Type, Compare, Allocator>::_swap_siblings (Node* node1_P,
|
||||||
|
Node* node2_P)
|
||||||
|
{
|
||||||
|
CGAL_multiset_assertion (_is_valid (node1_P));
|
||||||
|
CGAL_multiset_assertion (_is_valid (node2_P));
|
||||||
|
|
||||||
|
// Store the properties of the first node.
|
||||||
|
typename Node::Node_color color1 = node1_P->color;
|
||||||
|
Node *right1_P = node1_P->rightP;
|
||||||
|
Node *left1_P = node1_P->leftP;
|
||||||
|
|
||||||
|
// Copy the properties of the second node to the first node.
|
||||||
|
node1_P->color = node2_P->color;
|
||||||
|
|
||||||
|
node1_P->rightP = node2_P->rightP;
|
||||||
|
if (_is_valid (node1_P->rightP))
|
||||||
|
node1_P->rightP->parentP = node1_P;
|
||||||
|
|
||||||
|
node1_P->leftP = node2_P->leftP;
|
||||||
|
if (_is_valid (node1_P->leftP))
|
||||||
|
node1_P->leftP->parentP = node1_P;
|
||||||
|
|
||||||
|
// Copy the stored properties of the first node to the second node.
|
||||||
|
node2_P->color = color1;
|
||||||
|
|
||||||
|
node2_P->rightP = right1_P;
|
||||||
|
if (_is_valid (node2_P->rightP))
|
||||||
|
node2_P->rightP->parentP = node2_P;
|
||||||
|
|
||||||
|
node2_P->leftP = left1_P;
|
||||||
|
if (_is_valid (node2_P->leftP))
|
||||||
|
node2_P->leftP->parentP = node2_P;
|
||||||
|
|
||||||
|
// Swap the children of the common parent node.
|
||||||
|
Node *parent_P = node1_P->parentP;
|
||||||
|
Node *temp;
|
||||||
|
|
||||||
|
CGAL_multiset_assertion (parent_P == node2_P->parentP);
|
||||||
|
|
||||||
|
temp = parent_P->leftP;
|
||||||
|
parent_P->leftP = parent_P->rightP;
|
||||||
|
parent_P->rightP = temp;
|
||||||
|
|
||||||
|
// If one of the swapped nodes used to be the tree minimum, update
|
||||||
|
// the properties of the fictitious before-the-begin node.
|
||||||
|
if (beginNode.parentP == node1_P)
|
||||||
|
{
|
||||||
|
beginNode.parentP = node2_P;
|
||||||
|
node2_P->leftP = &beginNode;
|
||||||
|
}
|
||||||
|
else if (beginNode.parentP == node2_P)
|
||||||
|
{
|
||||||
|
beginNode.parentP = node1_P;
|
||||||
|
node1_P->leftP = &beginNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If one of the swapped nodes used to be the tree maximum, update
|
||||||
|
// the properties of the fictitious past-the-end node.
|
||||||
|
if (endNode.parentP == node1_P)
|
||||||
|
{
|
||||||
|
endNode.parentP = node2_P;
|
||||||
|
node2_P->rightP = &endNode;
|
||||||
|
}
|
||||||
|
else if (endNode.parentP == node2_P)
|
||||||
|
{
|
||||||
|
endNode.parentP = node1_P;
|
||||||
|
node1_P->rightP = &endNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// Calculate the height of the subtree spanned by a given node.
|
// Calculate the height of the subtree spanned by a given node.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue