53 lines
1.5 KiB
Nim
53 lines
1.5 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2018 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed except
|
|
# according to those terms.
|
|
|
|
import
|
|
./rbtree_desc
|
|
|
|
{.push raises: [Defect].}
|
|
|
|
proc rbTreeRotateSingle*[C](node: RbNodeRef[C]; dir: RbDir): RbNodeRef[C] =
|
|
## Perform a single red-black tree rotation in the specified direction.
|
|
## This function assumes that all nodes are valid for a rotation.
|
|
##
|
|
## Params:
|
|
## :node: The root node to rotate around
|
|
## :dir: The direction to rotate (left or right)
|
|
##
|
|
## Returns:
|
|
## The new root after rotation
|
|
##
|
|
let save = node.link[not dir]
|
|
|
|
node.link[not dir] = save.link[dir]
|
|
save.link[dir] = node
|
|
|
|
node.isRed = true
|
|
save.isRed = false # aka black
|
|
|
|
save
|
|
|
|
|
|
proc rbTreeRotateDouble*[C](node: RbNodeRef[C]; dir: RbDir): RbNodeRef[C] =
|
|
## Perform a double red-black rotation in the specified direction.
|
|
## This function assumes that all nodes are valid for a rotation.
|
|
##
|
|
## Params:
|
|
## :node: The root node to rotate around
|
|
## :dir: The direction to rotate (0 = left, 1 = right)
|
|
##
|
|
## Returns:
|
|
## The new root after rotation.
|
|
##
|
|
node.link[not dir] = node.link[not dir].rbTreeRotateSingle(not dir)
|
|
node.rbTreeRotateSingle(dir)
|
|
|
|
# End
|