+ PRTL_SPLAY_LINKS N, P, C, SP;
+ N = Links;
+
+ /* Check if we have two children */
+ if (RtlLeftChild(N) && RtlRightChild(N))
+ {
+ /* Get the predecessor */
+ SP = RtlSubtreePredecessor(N);
+
+ /* If we are the root, the new root will be our predecessor after swapping */
+ if (RtlIsRoot(N)) *Root = SP;
+
+ /* Swap the predecessor with N, this will guarantee that N will only have a child */
+ SwapSplayLinks(SP, N);
+ }
+
+ /* Check if we have no children */
+ if (!RtlLeftChild(N) && !RtlRightChild(N))
+ {
+ /* If we are also the root, then the tree is gone */
+ if (RtlIsRoot(N))
+ {
+ *Root = NULL;
+ return;
+ }
+
+ /* Get our parent */
+ P = RtlParent(N);
+
+ /* Find out who is referencing us and delete the reference */
+ if (RtlIsLeftChild(N))
+ {
+ /* N was a left child, so erase its parent's left child link */
+ RtlLeftChild(P) = NULL;
+ }
+ else
+ {
+ /* N was a right child, so erase its parent's right child link */
+ RtlRightChild(P) = NULL;
+ }
+
+ /* We are done */
+ return;
+ }
+
+ /* If we got here, we have a child (not two: we swapped above!) */
+ if (RtlLeftChild(N))
+ {
+ /* We have a left child, so get it */
+ C = RtlLeftChild(N);
+ }
+ else
+ {
+ /* We have a right child, get it instead */
+ C = RtlRightChild(N);
+ }
+
+ /* Check if we are the root entry */
+ if (RtlIsRoot(N))
+ {
+ /* Our child is now root, return it */
+ RtlParent(C) = C;
+ *Root = C;
+ return;
+ }
+
+ /* Get our parent */
+ P = RtlParent(N);
+
+ /* Find out who is referencing us and link to our child instead */
+ if (RtlIsLeftChild(N))
+ {
+ /* N was a left child, so set its parent's left child as our child */
+ RtlLeftChild(P) = C;
+ }
+ else
+ {
+ /* N was a right child, so set its parent's right child as our child */
+ RtlRightChild(P) = C;
+ }
+
+ /* Finally, inherit our parent and we are done */
+ RtlParent(C) = P;
+ return;