forked from boostorg/intrusive
Merge branch 'bugfix/node-swap' of https://github.com/dmsteck/intrusive into dmsteck-bugfix/node-swap
This commit is contained in:
commit
edb8f9e6fd
2 files changed
+381
-19
No files matched your search
@@ -1,6 +1,7 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztanaga 2007-2014
|
||||
// (C) Copyright Daniel Steck 2021
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@@ -396,38 +397,47 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
|
||||
NodeTraits::set_parent(node1, NodeTraits::get_parent(node2));
|
||||
NodeTraits::set_parent(node2, temp);
|
||||
|
||||
//Now adjust adjacent nodes for newly inserted node 1
|
||||
//Now adjust child nodes for newly inserted node 1
|
||||
if((temp = NodeTraits::get_left(node1))){
|
||||
NodeTraits::set_parent(temp, node1);
|
||||
}
|
||||
if((temp = NodeTraits::get_right(node1))){
|
||||
NodeTraits::set_parent(temp, node1);
|
||||
}
|
||||
if((temp = NodeTraits::get_parent(node1)) &&
|
||||
//The header has been already updated so avoid it
|
||||
temp != header2){
|
||||
if(NodeTraits::get_left(temp) == node2){
|
||||
NodeTraits::set_left(temp, node1);
|
||||
}
|
||||
if(NodeTraits::get_right(temp) == node2){
|
||||
NodeTraits::set_right(temp, node1);
|
||||
}
|
||||
}
|
||||
//Now adjust adjacent nodes for newly inserted node 2
|
||||
//Now adjust child nodes for newly inserted node 2
|
||||
if((temp = NodeTraits::get_left(node2))){
|
||||
NodeTraits::set_parent(temp, node2);
|
||||
}
|
||||
if((temp = NodeTraits::get_right(node2))){
|
||||
NodeTraits::set_parent(temp, node2);
|
||||
}
|
||||
if((temp = NodeTraits::get_parent(node2)) &&
|
||||
//The header has been already updated so avoid it
|
||||
temp != header1){
|
||||
if(NodeTraits::get_left(temp) == node1){
|
||||
NodeTraits::set_left(temp, node2);
|
||||
|
||||
//Finally adjust parent nodes
|
||||
if ((temp = NodeTraits::get_parent(node1)) == NodeTraits::get_parent(node2)) {
|
||||
// special logic for the case where the nodes are siblings
|
||||
const node_ptr left = NodeTraits::get_left(temp);
|
||||
NodeTraits::set_left(temp, NodeTraits::get_right(temp));
|
||||
NodeTraits::set_right(temp, left);
|
||||
} else {
|
||||
if ((temp = NodeTraits::get_parent(node1)) &&
|
||||
//The header has been already updated so avoid it
|
||||
temp != header2) {
|
||||
if (NodeTraits::get_left(temp) == node2) {
|
||||
NodeTraits::set_left(temp, node1);
|
||||
}
|
||||
if (NodeTraits::get_right(temp) == node2) {
|
||||
NodeTraits::set_right(temp, node1);
|
||||
}
|
||||
}
|
||||
if(NodeTraits::get_right(temp) == node1){
|
||||
NodeTraits::set_right(temp, node2);
|
||||
if ((temp = NodeTraits::get_parent(node2)) &&
|
||||
//The header has been already updated so avoid it
|
||||
temp != header1) {
|
||||
if (NodeTraits::get_left(temp) == node1) {
|
||||
NodeTraits::set_left(temp, node2);
|
||||
}
|
||||
if (NodeTraits::get_right(temp) == node1) {
|
||||
NodeTraits::set_right(temp, node2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user