PET: Partial Evaluation-based Test Case Generator for Bytecode

package related;

/**
 * Adaptation de la librairie Sun TreeMap
 @author Florence Charreteur
 *
 */
public class RedBlackTree {

  public EntryRBT root;

  /**
   * The number of entries in the tree
   */
  public int size;

  /**
   * The number of structural modifications to the tree.
   */
  public int modCount;


  public static EntryRBT parentOf(EntryRBT p) {
    return (p == null null: p.parent);
  }
  public static int colorOf(EntryRBT p) {
      int BLACK = 1;
    return (p == null ? BLACK : p.color);
  }

  public static  EntryRBT leftOf(EntryRBT p) {
    return (p == nullnull: p.left;
  }

  public static EntryRBT rightOf(EntryRBT p) {
    return (p == nullnull: p.right;
  }

  public static  void setColor(EntryRBT p, int c) {
    if (p != null)
      p.color = c;
  }

  public void deleteEntry(EntryRBT p) {
      int RED=0;
      int BLACK=1;
    modCount++;
    size--;

    // If strictly internal, copy successor's element to p and then make p
    // point to successor.
    if (p.left != null && p.right != null) {
      EntryRBT s = successor (p);
      p.key = s.key;
      p.value = s.value;
      p = s;
    // p has 2 children

    // Start fixup at replacement node, if it exists.
    EntryRBT replacement = (p.left != null ? p.left : p.right);

    if (replacement != null) {
      // Link replacement to parent
      replacement.parent = p.parent;
      if (p.parent == null)
        root = replacement;
      else if (p == p.parent.left)
        p.parent.left  = replacement;
      else
        p.parent.right = replacement;

      // Null out links so they are OK to use by fixAfterDeletion.
      p.left = p.right = p.parent = null;

      // Fix replacement
      if (p.color == BLACK)
        fixAfterDeletion(replacement);
    else if (p.parent == null) { // return if we are the only node.
      root = null;
    else //  No children. Use self as phantom replacement and unlink.
      if (p.color == BLACK)
        fixAfterDeletion(p);
      if (p.parent != null) {
        if (p == p.parent.left)
          p.parent.left = null;
        else if (p == p.parent.right)
          p.parent.right = null;
        p.parent = null;
      }
    }
  }

  /**
   * Returns the successor of the specified Entry, or null if no such.
   */
  public static EntryRBT successor(EntryRBT t) {
    if (t == null)
      return null;
    else if (t.right != null) {
      EntryRBT p = t.right;
      while (p.left != null)
        p = p.left;
      return p;
    else {
      EntryRBT p = t.parent;
      EntryRBT ch = t;
      while (p != null && ch == p.right) {
        ch = p;
        p = p.parent;
      }
      return p;
    }
  }

  /** From CLR */
  public void fixAfterDeletion(EntryRBT x) {
      int RED=0;
      int BLACK=1;
    while (x != root && colorOf(x== BLACK) {
      if (x == leftOf(parentOf(x))) {
        EntryRBT sib = rightOf(parentOf(x));

        if (colorOf(sib== RED) {
          setColor(sib, BLACK);
          setColor(parentOf(x), RED);
          rotateLeft(parentOf(x));
          sib = rightOf(parentOf(x));
        }

        if (colorOf(leftOf(sib))  == BLACK &&
            colorOf(rightOf(sib)) == BLACK) {
          setColor(sib, RED);
          x = parentOf(x);
        else {
          if (colorOf(rightOf(sib)) == BLACK) {
            setColor(leftOf(sib), BLACK);
            setColor(sib, RED);
            rotateRight(sib);
            sib = rightOf(parentOf(x));
          }
          setColor(sib, colorOf(parentOf(x)));
          setColor(parentOf(x), BLACK);
          setColor(rightOf(sib), BLACK);
          rotateLeft(parentOf(x));
          x = root;
        }
      else // symmetric
        EntryRBT sib = leftOf(parentOf(x));

      if (colorOf(sib== RED) {
        setColor(sib, BLACK);
        setColor(parentOf(x), RED);
        rotateRight(parentOf(x));
        sib = leftOf(parentOf(x));
      }

      if (colorOf(rightOf(sib)) == BLACK &&
          colorOf(leftOf(sib)) == BLACK) {
        setColor(sib, RED);
        x = parentOf(x);
      else {
        if (colorOf(leftOf(sib)) == BLACK) {
          setColor(rightOf(sib), BLACK);
          setColor(sib, RED);
          rotateLeft(sib);
          sib = leftOf(parentOf(x));
        }
        setColor(sib, colorOf(parentOf(x)));
        setColor(parentOf(x), BLACK);
        setColor(leftOf(sib), BLACK);
        rotateRight(parentOf(x));
        x = root;
      }
      }
    }

    setColor(x, BLACK);
  }

  public void fixAfterInsertion(EntryRBT x) {
          int RED=0;
          int BLACK=1;
    x.color = RED;
    while (x != null && x != root && x.parent.color == RED) {
      if (parentOf(x== leftOf(parentOf(parentOf(x)))) {
        EntryRBT y = rightOf(parentOf(parentOf(x)));
        if (colorOf(y== RED) {
          setColor(parentOf(x), BLACK);
          setColor(y, BLACK);
          setColor(parentOf(parentOf(x)), RED);
          x = parentOf(parentOf(x));
        else {
          if (x == rightOf(parentOf(x))) {
            x = parentOf(x);
            rotateLeft(x);
          }
          setColor(parentOf(x), BLACK);
          setColor(parentOf(parentOf(x)), RED);
          rotateRight(parentOf(parentOf(x)));
        }
      else {
        EntryRBT y = leftOf(parentOf(parentOf(x)));
        if (colorOf(y== RED) {
          setColor(parentOf(x), BLACK);
          setColor(y, BLACK);
          setColor(parentOf(parentOf(x)), RED);
          x = parentOf(parentOf(x));
        else {
          if (x == leftOf(parentOf(x))) {
            x = parentOf(x);
            rotateRight(x);
          }
          setColor(parentOf(x), BLACK);
          setColor(parentOf(parentOf(x)), RED);
          rotateLeft(parentOf(parentOf(x)));
        }
      }
    }
    root.color = BLACK;
  }

  public void rotateLeft(EntryRBT p) {
    if (p != null) {
      EntryRBT r = p.right;
      p.right = r.left;
      if (r.left != null)
        r.left.parent = p;
      r.parent = p.parent;
      if (p.parent == null)
        root = r;
      else if (p.parent.left == p)
        p.parent.left = r;
      else
        p.parent.right = r;
      r.left = p;
      p.parent = r;
    }
  }

  public void rotateRight(EntryRBT p) {
    if (p != null) {
      EntryRBT l = p.left;
      p.left = l.right;
      if (l.right != nulll.right.parent = p;
      l.parent = p.parent;
      if (p.parent == null)
        root = l;
      else if (p.parent.right == p)
        p.parent.right = l;
      else p.parent.left = l;
      l.right = p;
      p.parent = l;
    }
  }

}

The Java2Html library is used for displaying source code.