Merge branch 'bugfix/node-swap' of https://github.com/dmsteck/intrusive into dmsteck-bugfix/node-swap

This commit is contained in:
Ion Gaztañaga committed 2021-06-19 20:49:07 +02:00
commit edb8f9e6fd
2 files changed
+381 -19

No files matched your search

+29 -19
View File
@@ -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);
}
}
}
}