📄 kwqmapimpl.cpp
字号:
(sibling->right() == NULL || sibling->right()->color == KWQMapNodeImpl::Black)) {
sibling->color = KWQMapNodeImpl::Red;
height = height - 1;
} else {
if (sibling->right() == NULL || sibling->right()->color == KWQMapNodeImpl::Black) {
sibling->left()->color = KWQMapNodeImpl::Black;
sibling->color = KWQMapNodeImpl::Red;
rotateRight(sibling, nodes[height-1], !wentLeft[height-1]);
sibling = nodes[height-1]->right();
}
sibling->color = nodes[height-1]->color;
nodes[height-1]->color = KWQMapNodeImpl::Black;
sibling->right()->color = KWQMapNodeImpl::Black;
rotateLeft(nodes[height-1], nodes[height-2], wentLeft[height-2]);
nodes[height] = d->guard->prev;
}
} else {
// same as the other branch, but with left and right swapped
KWQMapNodeImpl *sibling = nodes[height-1]->left();
if (sibling != NULL && sibling->color == KWQMapNodeImpl::Red) {
sibling->color = KWQMapNodeImpl::Black;
nodes[height-1]->color = KWQMapNodeImpl::Red;
rotateRight(nodes[height-1], nodes[height-2], wentLeft[height-2]);
nodes[height] = nodes[height-1];
wentLeft[height] = false;
nodes[height-1] = sibling;
height = height + 1;
sibling = nodes[height-1]->left();
}
if ((sibling->right() == NULL || sibling->right()->color == KWQMapNodeImpl::Black) &&
(sibling->left() == NULL || sibling->left()->color == KWQMapNodeImpl::Black)) {
sibling->color = KWQMapNodeImpl::Red;
height = height - 1;
} else {
if (sibling->left() == NULL || sibling->left()->color == KWQMapNodeImpl::Black) {
sibling->right()->color = KWQMapNodeImpl::Black;
sibling->color = KWQMapNodeImpl::Red;
rotateLeft(sibling, nodes[height-1], !wentLeft[height-1]);
sibling = nodes[height-1]->left();
}
sibling->color = nodes[height-1]->color;
nodes[height-1]->color = KWQMapNodeImpl::Black;
sibling->left()->color = KWQMapNodeImpl::Black;
rotateRight(nodes[height-1], nodes[height-2], wentLeft[height-2]);
nodes[height] = d->guard->prev;
}
}
}
if (nodes[height] != NULL) {
nodes[height]->color = KWQMapNodeImpl::Black;
}
}
}
KWQMapNodeImpl *KWQMapImpl::findInternal(KWQMapNodeImpl *target) const
{
KWQMapNodeImpl *node = d->guard->left();
while (node != NULL) {
CompareResult compare = compareNodes(target,node);
if (compare == Equal) {
break;
} else if (compare == Less) {
node = node->left();
} else if (compare == Greater) {
node = node->right();
}
}
return node;
}
KWQMapNodeImpl *KWQMapImpl::insertInternal(KWQMapNodeImpl *nodeToInsert, bool replaceExisting)
{
KWQMapNodeImpl *nodeStack[MAX_STACK];
bool wentLeftStack[MAX_STACK];
int height = 0;
copyOnWrite();
nodeStack[height] = d->guard;
wentLeftStack[height] = true;
height++;
KWQMapNodeImpl *node = d->guard->left();
while (node != NULL) {
CompareResult compare = compareNodes(nodeToInsert, node);
if (compare == Equal) {
break;
} else if (compare == Less) {
nodeStack[height] = node;
wentLeftStack[height] = true;
height++;
node = node->left();
} else {
nodeStack[height] = node;
wentLeftStack[height] = false;
height++;
node = node->right();
}
}
if (node != NULL) {
if (replaceExisting) {
copyNode(nodeToInsert, node);
}
return node;
}
node = duplicateNode(nodeToInsert);
nodeStack[height] = node;
if (wentLeftStack[height-1]) {
// arrange for threading
node->prev = nodeStack[height-1]->prev;
node->prevIsChild = false;
node->next = nodeStack[height-1];
node->nextIsChild = false;
// make it the child
nodeStack[height-1]->prev = node;
nodeStack[height-1]->prevIsChild = true;
} else {
// arrange for threading
node->next = nodeStack[height-1]->next;
node->nextIsChild = false;
node->prev = nodeStack[height-1];
node->prevIsChild = false;
// make it the child
nodeStack[height-1]->next = node;
nodeStack[height-1]->nextIsChild = true;
}
rebalanceAfterInsert(nodeStack, wentLeftStack, height);
d->numNodes++;
return node;
}
void KWQMapImpl::removeEqualInternal(KWQMapNodeImpl *nodeToDelete, bool samePointer)
{
KWQMapNodeImpl *nodeStack[MAX_STACK];
bool wentLeftStack[MAX_STACK];
int height = 0;
copyOnWrite();
nodeStack[height] = d->guard;
wentLeftStack[height] = true;
height++;
KWQMapNodeImpl *node = d->guard->left();
while (node != NULL) {
CompareResult compare = compareNodes(nodeToDelete, node);
if (compare == Equal) {
break;
} else if (compare == Less) {
nodeStack[height] = node;
wentLeftStack[height] = true;
height++;
node = node->left();
} else {
nodeStack[height] = node;
wentLeftStack[height] = false;
height++;
node = node->right();
}
}
if (node == NULL || samePointer && node != nodeToDelete) {
return;
}
KWQMapNodeImpl *removalParent;
KWQMapNodeImpl *nodeToRemove;
bool removalWentLeft;
if (node->left() == NULL || node->right() == NULL) {
// If this node has at most one subtree, we can remove it directly
nodeToRemove = node;
removalParent = nodeStack[height-1];
removalWentLeft = wentLeftStack[height-1];
} else {
// Otherwise we find the immediate successor (leftmost
// node in the right subtree), which must have at most one
// subtree, swap it's contents with the node we found, and
// remove it.
nodeToRemove = node->right();
wentLeftStack[height] = false;
nodeStack[height] = node;
height++;
removalParent = node;
removalWentLeft = false;
while (nodeToRemove->left() != NULL) {
wentLeftStack[height] = true;
nodeStack[height] = nodeToRemove;
removalParent = nodeToRemove;
nodeToRemove = nodeToRemove->left();
removalWentLeft = true;
height++;
}
swapNodes(node,nodeToRemove);
}
// find replacement node
KWQMapNodeImpl *removalReplacement;
if (nodeToRemove->left() != NULL) {
removalReplacement = nodeToRemove->left();
// fixup threading
nodeToRemove->predecessor()->next = nodeToRemove->next;
} else if (nodeToRemove->right() != NULL) {
removalReplacement = nodeToRemove->right();
// fixup threading
nodeToRemove->successor()->prev = nodeToRemove->prev;
} else {
removalReplacement = NULL;
}
nodeStack[height] = removalReplacement;
// detach removal node
if (removalWentLeft) {
if (removalReplacement == NULL) {
removalParent->prev = nodeToRemove->prev;
removalParent->prevIsChild = nodeToRemove->prevIsChild;
} else {
removalParent->prev = removalReplacement;
}
} else {
if (removalReplacement == NULL) {
removalParent->next = nodeToRemove->next;
removalParent->nextIsChild = nodeToRemove->nextIsChild;
} else {
removalParent->next = removalReplacement;
}
}
// do red-black rebalancing
rebalanceAfterRemove(nodeToRemove, nodeStack, wentLeftStack, height);
// detach removal node's children
nodeToRemove->next = NULL;
nodeToRemove->prev = NULL;
d->numNodes--;
d->deleteNode(nodeToRemove);
}
void KWQMapImpl::swap(KWQMapImpl &map)
{
KWQRefPtr<KWQMapPrivate> tmp = d;
d = map.d;
map.d = d;
}
uint KWQMapImpl::countInternal() const
{
return d->numNodes;
}
void KWQMapImpl::clearInternal()
{
copyOnWrite();
d->deleteNode(d->guard->prev);
d->guard->prev = NULL;
d->numNodes = 0;
}
const KWQMapNodeImpl *KWQMapImpl::beginInternal() const
{
KWQMapNodeImpl *node;
node = d->guard;
while (node->left() != NULL) {
node = node->left();
}
return node;
}
const KWQMapNodeImpl *KWQMapImpl::endInternal() const
{
return d->guard;
}
KWQMapNodeImpl *KWQMapImpl::beginInternal()
{
KWQMapNodeImpl *node;
copyOnWrite();
node = d->guard;
while (node->left() != NULL) {
node = node->left();
}
return node;
}
KWQMapNodeImpl *KWQMapImpl::endInternal()
{
copyOnWrite();
return d->guard;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -