From 99dac1a0728f7cc4f1c1b4651d846dea8bdd1c89 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Fri, 28 Oct 2022 11:43:51 +0300 Subject: [PATCH] Progress for rbtree_rebalance_for_erase Former-commit-id: f05b3c0b017e4e61333ab6df889b437289de6627 --- src/Kyoto/rstl/rstl_map.cpp | 112 +++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/src/Kyoto/rstl/rstl_map.cpp b/src/Kyoto/rstl/rstl_map.cpp index fe6181d6..33dd87bd 100644 --- a/src/Kyoto/rstl/rstl_map.cpp +++ b/src/Kyoto/rstl/rstl_map.cpp @@ -97,7 +97,7 @@ void rbtree_rebalance(void* header_void, void* node_void) { p->mColor = kNC_Red; node->mParent->mParent->mColor = kNC_Black; node = node->mParent->mParent; - + } else { if (node == node->mParent->mLeft) { node = node->mParent; @@ -115,7 +115,115 @@ void* rbtree_rebalance_for_erase(void* header_void, void* node_void) { _header* header = static_cast< _header* >(header_void); _node* node = static_cast< _node* >(node_void); - return nullptr; + _node* next; + _node* result = node; + + if (node->mLeft == nullptr) { + next = node->mRight; + } else { + _node* tmp = node->mRight; + if (tmp == nullptr) { + next = tmp; + } else { + do { + result = tmp; + tmp = result->mLeft; + } while (result->mLeft != nullptr); + next = result->mRight; + } + } + + if (result != node) { + node->mLeft->mParent = result; + result->mLeft = node->mLeft; + + _node* tmp = result; + if (result != node->mRight) { + tmp = result->mParent; + if (next != nullptr) { + next->mParent = result->mParent; + } + result->mParent->mLeft = next; + result->mRight = node->mRight; + node->mRight->mParent = result; + } + + if (header->mRootNode == node) { + header->mRootNode = result; + } else { + if (node->mParent->mLeft == node) { + node->mParent->mLeft = result; + } else { + node->mParent->mRight = result; + } + } + + result->mParent = node->mParent; + node_color c = result->mColor; + result->mColor = node->mColor; + node->mColor = c; + result = node; + + } else { + _node* a1 = result->mParent; + if (next != nullptr) { + next->mParent = a1; + } + if (header->mRootNode == node) { + header->mRootNode = next; + } else { + if (node->mParent->mLeft == node) { + node->mParent->mLeft = next; + } else { + node->mParent->mRight = next; + } + } + + if (header->mLeftmost == node) { + if (node->mRight == nullptr) { + header->mLeftmost = node->mParent; + } else { + // prVar1 = next; + _node* prVar1 = next; + if (next == nullptr) { + header->mLeftmost = nullptr; + } else { + _node* newLeftmost; + do { + newLeftmost = prVar1; + prVar1 = newLeftmost->mLeft; + } while (newLeftmost->mLeft != nullptr); + header->mLeftmost = newLeftmost; + } + } + } + + if (header->mRightmost == node) { + if (node->mLeft == nullptr) { + header->mRightmost = node->mParent; + } else { + // prVar1 = next; + _node* prVar1 = next; + if (next == nullptr) { + header->mRightmost = nullptr; + } else { + _node* newRightmost; + do { + newRightmost = prVar1; + prVar1 = newRightmost->mRight; + } while (newRightmost->mRight != nullptr); + header->mRightmost = newRightmost; + } + } + } + } + + if (result->mColor != kNC_Black) { + while (true) { + } + } + + return result; } void* rbtree_traverse_forward(const void* header_void, void* node_void) {