- void rotateLeft() {
- Box r = right;
- right = r.left;
- if (r.left != null) r.left.peerTree_parent = this;
- r.peerTree_parent = peerTree_parent;
- if (peerTree_parent == null) parent.rootChild = r;
- else if (peerTree_parent.left == this) peerTree_parent.left = r;
- else peerTree_parent.right = r;
- r.left = this;
- peerTree_parent = r;
- }
-
- void rotateRight() {
- Box l = left;
- left = l.right;
- if (l.right != null) l.right.peerTree_parent = this;
- l.peerTree_parent = peerTree_parent;
- if (peerTree_parent == null) parent.rootChild = l;
- else if (peerTree_parent.right == this) peerTree_parent.right = l;
- else peerTree_parent.left = l;
- l.right = this;
- peerTree_parent = l;
- }
-
- void fixAfterInsertion() {
- clear(BLACK);
- Box x = this;
-
- while (x != null && x != parent.rootChild && !x.peerTree_parent.test(BLACK)) {
- if (peerTree_parent(x) == leftOf(peerTree_parent(peerTree_parent(x)))) {
- Box y = rightOf(peerTree_parent(peerTree_parent(x)));
- if (colorOf(y) == REDbool) {
- setColor(peerTree_parent(x), BLACKbool);
- setColor(y, BLACKbool);
- setColor(peerTree_parent(peerTree_parent(x)), REDbool);
- x = peerTree_parent(peerTree_parent(x));
- }
- else {
- if (x == rightOf(peerTree_parent(x))) {
- x = peerTree_parent(x);
- x.rotateLeft();
- }
- setColor(peerTree_parent(x), BLACKbool);
- setColor(peerTree_parent(peerTree_parent(x)), REDbool);
- if (peerTree_parent(peerTree_parent(x)) != null)
- peerTree_parent(peerTree_parent(x)).rotateRight();
- }
- }
- else {
- Box y = leftOf(peerTree_parent(peerTree_parent(x)));
- if (colorOf(y) == REDbool) {
- setColor(peerTree_parent(x), BLACKbool);
- setColor(y, BLACKbool);
- setColor(peerTree_parent(peerTree_parent(x)), REDbool);
- x = peerTree_parent(peerTree_parent(x));
- }
- else {
- if (x == leftOf(peerTree_parent(x))) {
- x = peerTree_parent(x);
- x.rotateRight();
- }
- setColor(peerTree_parent(x), BLACKbool);
- setColor(peerTree_parent(peerTree_parent(x)), REDbool);
- if (peerTree_parent(peerTree_parent(x)) != null)
- peerTree_parent(peerTree_parent(x)).rotateLeft();
- }
- }
- }
- parent.rootChild.set(BLACK);
- }
-
- /** From CLR **/
- void fixAfterDeletion() {
- Box x = this;
- while (x != parent.rootChild && colorOf(x) == BLACKbool) {
- if (x == leftOf(peerTree_parent(x))) {
- Box sib = rightOf(peerTree_parent(x));
- if (colorOf(sib) == REDbool) {
- setColor(sib, BLACKbool);
- setColor(peerTree_parent(x), REDbool);
- peerTree_parent(x).rotateLeft();
- sib = rightOf(peerTree_parent(x));
- }
- if (colorOf(leftOf(sib)) == BLACKbool && colorOf(rightOf(sib)) == BLACKbool) {
- setColor(sib, REDbool);
- x = peerTree_parent(x);
- }
- else {
- if (colorOf(rightOf(sib)) == BLACKbool) {
- setColor(leftOf(sib), BLACKbool);
- setColor(sib, REDbool);
- sib.rotateRight();
- sib = rightOf(peerTree_parent(x));
- }
- setColor(sib, colorOf(peerTree_parent(x)));
- setColor(peerTree_parent(x), BLACKbool);
- setColor(rightOf(sib), BLACKbool);
- peerTree_parent(x).rotateLeft();
- x = parent.rootChild;
- }
- }
- else {
- Box sib = leftOf(peerTree_parent(x));
- if (colorOf(sib) == REDbool) {
- setColor(sib, BLACKbool);
- setColor(peerTree_parent(x), REDbool);
- peerTree_parent(x).rotateRight();
- sib = leftOf(peerTree_parent(x));
- }
- if (colorOf(rightOf(sib)) == BLACKbool && colorOf(leftOf(sib)) == BLACKbool) {
- setColor(sib, REDbool);
- x = peerTree_parent(x);
- }
- else {
- if (colorOf(leftOf(sib)) == BLACKbool) {
- setColor(rightOf(sib), BLACKbool);
- setColor(sib, REDbool);
- sib.rotateLeft();
- sib = leftOf(peerTree_parent(x));
- }
- setColor(sib, colorOf(peerTree_parent(x)));
- setColor(peerTree_parent(x), BLACKbool);
- setColor(leftOf(sib), BLACKbool);
- peerTree_parent(x).rotateRight();
- x = parent.rootChild;
- }
- }
- }
- setColor(x, BLACKbool);