home *** CD-ROM | disk | FTP | other *** search
- package COM.objectspace.jgl;
-
- final class Tree {
- public static final int RED = 1;
- public static final int BLACK = 2;
- TreeNode NIL;
- int size;
- boolean myInsertAlways;
- boolean myIsMap;
- BinaryPredicate myComparator;
- Container myContainer;
- TreeNode myHeader;
-
- Tree(boolean var1, boolean var2, Container var3) {
- this(var1, var2, new HashComparator(), var3);
- }
-
- Tree(boolean var1, boolean var2, BinaryPredicate var3, Container var4) {
- this.NIL = new TreeNode(this);
- this.myHeader = new TreeNode(this);
- this.myContainer = var4;
- this.myIsMap = var1;
- this.myInsertAlways = var2;
- this.myComparator = var3;
- this.myHeader.color = 1;
- this.clear();
- }
-
- Tree(Tree var1) {
- this.NIL = new TreeNode(this);
- this.myHeader = new TreeNode(this);
- this.myContainer = var1.myContainer;
- this.myIsMap = var1.myIsMap;
- this.myInsertAlways = var1.myInsertAlways;
- this.myComparator = var1.myComparator;
- this.myHeader.color = 1;
- this.copyTree(var1);
- }
-
- boolean compare(Object var1, Object var2) {
- return this.myComparator.execute(var1, var2);
- }
-
- Object key(Object var1) {
- return this.myIsMap ? ((Pair)var1).first : var1;
- }
-
- Object value(Object var1) {
- if (this.myIsMap) {
- return var1 == null ? null : ((Pair)var1).second;
- } else {
- return var1;
- }
- }
-
- void copy(Tree var1) {
- if (this != var1) {
- this.clear();
- this.copyTree(var1);
- }
-
- }
-
- OrderedSetIterator beginSet() {
- return new OrderedSetIterator(this, this.myHeader.left, (OrderedSet)this.myContainer);
- }
-
- OrderedSetIterator endSet() {
- return new OrderedSetIterator(this, this.myHeader, (OrderedSet)this.myContainer);
- }
-
- OrderedMapIterator beginMap(int var1) {
- return new OrderedMapIterator(this, this.myHeader.left, (OrderedMap)this.myContainer, var1);
- }
-
- OrderedMapIterator endMap(int var1) {
- return new OrderedMapIterator(this, this.myHeader, (OrderedMap)this.myContainer, var1);
- }
-
- int maxSize() {
- return Integer.MAX_VALUE;
- }
-
- TreeNode insert(TreeNode var1, Object var2) {
- if (var1 == this.myHeader.left) {
- if (this.size > 0) {
- Object var8 = this.myIsMap ? ((Pair)var2).first : var2;
- Object var12 = var1.object;
- var12 = this.myIsMap ? ((Pair)var12).first : var12;
- if (this.myComparator.execute(var8, var12)) {
- return this.insert(var1, var1, var2);
- }
- }
-
- return this.insertAux(var2, true).node;
- } else if (var1 == this.myHeader) {
- Object var6 = this.myHeader.right.object;
- var6 = this.myIsMap ? ((Pair)var6).first : var6;
- Object var11 = this.myIsMap ? ((Pair)var2).first : var2;
- return this.myComparator.execute(var6, var11) ? this.insert(this.NIL, this.myHeader.right, var2) : this.insertAux(var2, true).node;
- } else {
- TreeNode var3 = decrement(var1, this.NIL);
- Object var4 = var3.object;
- var4 = this.myIsMap ? ((Pair)var4).first : var4;
- Object var5 = this.myIsMap ? ((Pair)var2).first : var2;
- if (this.myComparator.execute(var4, var5)) {
- var4 = this.myIsMap ? ((Pair)var2).first : var2;
- var5 = var1.object;
- var5 = this.myIsMap ? ((Pair)var5).first : var5;
- if (this.myComparator.execute(var4, var5)) {
- if (var3.right == this.NIL) {
- return this.insert(this.NIL, var3, var2);
- }
-
- return this.insert(var1, var1, var2);
- }
- }
-
- return this.insertAux(var2, true).node;
- }
- }
-
- void clear() {
- this.myHeader.parent = this.NIL;
- this.myHeader.right = this.myHeader;
- this.myHeader.left = this.myHeader;
- this.size = 0;
- }
-
- Pair remove(Object var1) {
- Pair var2 = this.equalRange(var1);
- return this.remove((TreeNode)var2.first, (TreeNode)var2.second, this.size);
- }
-
- Pair remove(Object var1, int var2) {
- Pair var3 = this.equalRange(var1);
- return this.remove((TreeNode)var3.first, (TreeNode)var3.second, var2);
- }
-
- Pair remove(TreeNode var1, TreeNode var2) {
- return this.remove(var1, var2, this.size);
- }
-
- Pair remove(TreeNode var1, TreeNode var2, int var3) {
- if (var3 <= 0) {
- return new Pair((Object)null, new Integer(0));
- } else {
- int var4 = 0;
- Object var5 = null;
- if (var1 == this.myHeader.left && var2 == this.myHeader && this.size <= var3) {
- var4 = this.size;
- Object var8 = var1.object;
- var5 = this.myIsMap ? (var8 == null ? null : ((Pair)var8).second) : var8;
- this.clear();
- } else {
- while(var3 > 0 && var1 != var2) {
- if (var4 == 0) {
- Object var7 = var1.object;
- var5 = this.myIsMap ? (var7 == null ? null : ((Pair)var7).second) : var7;
- }
-
- --var3;
- ++var4;
- TreeNode var6 = increment(var1, this.NIL);
- this.remove(var1);
- var1 = var6;
- }
- }
-
- return new Pair(var5, new Integer(var4));
- }
- }
-
- TreeNode find(Object var1) {
- TreeNode var2 = (TreeNode)this.equalRange(var1).first;
- if (var2 != this.myHeader) {
- Object var3 = var2.object;
- var3 = this.myIsMap ? ((Pair)var3).first : var3;
- if (!this.myComparator.execute(var1, var3)) {
- return var2;
- }
- }
-
- return this.myHeader;
- }
-
- int count(Object var1) {
- Pair var2 = this.equalRange(var1);
- return distance((TreeNode)var2.first, (TreeNode)var2.second, this.NIL);
- }
-
- TreeNode lowerBound(Object var1) {
- return (TreeNode)this.equalRange(var1).first;
- }
-
- TreeNode upperBound(Object var1) {
- return (TreeNode)this.equalRange(var1).second;
- }
-
- Pair equalRange(Object var1) {
- TreeNode var2 = this.lowerBoundAux(var1);
- TreeNode var3 = this.upperBoundAux(var1);
- if (var3 == this.myHeader) {
- return new Pair(var2, var3);
- } else if (var2 == this.myHeader) {
- return new Pair(var3, var2);
- } else {
- TreeNode var4 = var2;
- TreeNode var5 = var3;
-
- while(true) {
- var4 = increment(var4, this.NIL);
- var5 = increment(var5, this.NIL);
- if (var5 != this.myHeader && var4 != var3) {
- if (var4 != this.myHeader && var2 != var5) {
- continue;
- }
-
- return new Pair(var3, var2);
- }
-
- return new Pair(var2, var3);
- }
- }
- }
-
- TreeNode lowerBoundAux(Object var1) {
- TreeNode var2 = this.myHeader;
- TreeNode var3 = this.myHeader.parent;
-
- boolean var4;
- for(var4 = false; var3 != this.NIL; var3 = var4 ? var3.right : var3.left) {
- var2 = var3;
- Object var5 = var3.object;
- var5 = this.myIsMap ? ((Pair)var5).first : var5;
- var4 = this.myComparator.execute(var5, var1);
- }
-
- if (var4) {
- return increment(var2, this.NIL);
- } else {
- return var2;
- }
- }
-
- TreeNode upperBoundAux(Object var1) {
- TreeNode var2 = this.myHeader;
- TreeNode var3 = this.myHeader.parent;
-
- boolean var4;
- for(var4 = true; var3 != this.NIL; var3 = var4 ? var3.left : var3.right) {
- var2 = var3;
- Object var5 = var3.object;
- var5 = this.myIsMap ? ((Pair)var5).first : var5;
- var4 = this.myComparator.execute(var1, var5);
- }
-
- if (var4) {
- return var2;
- } else {
- return increment(var2, this.NIL);
- }
- }
-
- void insert(InputIterator var1, InputIterator var2) {
- InputIterator var3 = (InputIterator)var1.clone();
-
- while(!var3.equals(var2)) {
- Object var4 = var3.nextElement();
- this.insertAux(var4, true);
- }
-
- }
-
- InsertResult insertAux(Object var1, boolean var2) {
- TreeNode var3 = this.myHeader;
- TreeNode var4 = this.myHeader.parent;
-
- boolean var5;
- for(var5 = true; var4 != this.NIL; var4 = var5 ? var4.left : var4.right) {
- var3 = var4;
- Object var6 = this.myIsMap ? ((Pair)var1).first : var1;
- Object var7 = var4.object;
- var7 = this.myIsMap ? ((Pair)var7).first : var7;
- var5 = this.myComparator.execute(var6, var7);
- }
-
- if (this.myInsertAlways && var2) {
- return new InsertResult(this, this.insert(var4, var3, var1), true);
- } else {
- TreeNode var9 = var3;
- if (var5) {
- if (var3 == this.myHeader.left) {
- return new InsertResult(this, this.insert(var4, var3, var1), true);
- }
-
- var9 = decrement(var3, this.NIL);
- }
-
- Object var11 = var9.object;
- var11 = this.myIsMap ? ((Pair)var11).first : var11;
- Object var8 = this.myIsMap ? ((Pair)var1).first : var1;
- if (this.myComparator.execute(var11, var8)) {
- return new InsertResult(this, this.insert(var4, var3, var1), true);
- } else {
- return new InsertResult(this, var9, false);
- }
- }
- }
-
- InsertResult insert(Object var1) {
- return this.insertAux(var1, true);
- }
-
- InsertResult put(Object var1) {
- return this.insertAux(var1, false);
- }
-
- Object get(Object var1) {
- TreeNode var2 = this.myHeader;
- TreeNode var3 = this.myHeader.parent;
-
- boolean var4;
- for(var4 = true; var3 != this.NIL; var3 = var4 ? var3.left : var3.right) {
- var2 = var3;
- Object var5 = var3.object;
- var5 = this.myIsMap ? ((Pair)var5).first : var5;
- var4 = this.myComparator.execute(var1, var5);
- }
-
- TreeNode var8 = var2;
- if (var4) {
- if (var2 == this.myHeader.left) {
- return null;
- }
-
- var8 = decrement(var2, this.NIL);
- }
-
- Object var6 = var8.object;
- var6 = this.myIsMap ? ((Pair)var6).first : var6;
- if (this.myComparator.execute(var6, var1)) {
- return null;
- } else {
- return ((Pair)var8.object).second;
- }
- }
-
- TreeNode insert(TreeNode var1, TreeNode var2, Object var3) {
- TreeNode var4;
- boolean var10000;
- label24: {
- ++this.size;
- var4 = new TreeNode(this, var3);
- if (var2 != this.myHeader && var1 == this.NIL) {
- Object var5 = this.myIsMap ? ((Pair)var3).first : var3;
- Object var6 = var2.object;
- var6 = this.myIsMap ? ((Pair)var6).first : var6;
- if (!this.myComparator.execute(var5, var6)) {
- var10000 = false;
- break label24;
- }
- }
-
- var10000 = true;
- }
-
- boolean var7 = var10000;
- this.insert(var7, var1, var2, var4);
- return var4;
- }
-
- static int distance(TreeNode var0, TreeNode var1, TreeNode var2) {
- int var3;
- for(var3 = 0; var0 != var1; ++var3) {
- var0 = increment(var0, var2);
- }
-
- return var3;
- }
-
- TreeNode copyTree(TreeNode var1, TreeNode var2, TreeNode var3) {
- if (var1 == var3) {
- return this.NIL;
- } else {
- TreeNode var4 = new TreeNode(this, var1.object);
- var4.color = var1.color;
- var4.left = this.copyTree(var1.left, var4, var3);
- var4.right = this.copyTree(var1.right, var4, var3);
- var4.parent = var2;
- return var4;
- }
- }
-
- void copyTree(Tree var1) {
- this.myHeader.parent = this.copyTree(var1.myHeader.parent, this.myHeader, var1.NIL);
- this.myHeader.left = this.minimum(this.myHeader.parent);
- this.myHeader.right = this.maximum(this.myHeader.parent);
- this.size = var1.size;
- }
-
- Array keys() {
- Array var1 = new Array();
-
- for(TreeNode var2 = this.myHeader.left; var2 != this.myHeader; var2 = increment(var2, this.NIL)) {
- var1.add(((Pair)var2.object).first);
- }
-
- return var1;
- }
-
- Array keys(Object var1) {
- Array var2 = new Array();
-
- for(TreeNode var3 = this.myHeader.left; var3 != this.myHeader; var3 = increment(var3, this.NIL)) {
- if (((Pair)var3.object).second.equals(var1)) {
- var2.add(((Pair)var3.object).first);
- }
- }
-
- return var2;
- }
-
- Array values(Object var1) {
- Array var2 = new Array();
-
- for(TreeNode var3 = this.myHeader.left; var3 != this.myHeader; var3 = increment(var3, this.NIL)) {
- if (((Pair)var3.object).first.equals(var1)) {
- var2.add(((Pair)var3.object).second);
- }
- }
-
- return var2;
- }
-
- static TreeNode increment(TreeNode var0, TreeNode var1) {
- if (var0.right != var1) {
- for(var0 = var0.right; var0.left != var1; var0 = var0.left) {
- }
-
- return var0;
- } else {
- while(var0 == var0.parent.right) {
- var0 = var0.parent;
- }
-
- return var0.right == var0.parent ? var0 : var0.parent;
- }
- }
-
- static TreeNode decrement(TreeNode var0, TreeNode var1) {
- if (var0.color == 1 && var0.parent.parent == var0) {
- return var0.right;
- } else if (var0.left != var1) {
- for(var0 = var0.left; var0.right != var1; var0 = var0.right) {
- }
-
- return var0;
- } else {
- while(var0 == var0.parent.left) {
- var0 = var0.parent;
- }
-
- return var0.parent;
- }
- }
-
- TreeNode minimum(TreeNode var1) {
- if (var1 == this.NIL) {
- return this.myHeader;
- } else {
- while(var1.left != this.NIL) {
- var1 = var1.left;
- }
-
- return var1;
- }
- }
-
- TreeNode maximum(TreeNode var1) {
- if (var1 == this.NIL) {
- return this.myHeader;
- } else {
- while(var1.right != this.NIL) {
- var1 = var1.right;
- }
-
- return var1;
- }
- }
-
- void rotateLeft(TreeNode var1) {
- TreeNode var2 = var1.right;
- var1.right = var2.left;
- if (var2.left != this.NIL) {
- var2.left.parent = var1;
- }
-
- var2.parent = var1.parent;
- if (var1 == this.myHeader.parent) {
- this.myHeader.parent = var2;
- } else if (var1 == var1.parent.left) {
- var1.parent.left = var2;
- } else {
- var1.parent.right = var2;
- }
-
- var2.left = var1;
- var1.parent = var2;
- }
-
- void rotateRight(TreeNode var1) {
- TreeNode var2 = var1.left;
- var1.left = var2.right;
- if (var2.right != this.NIL) {
- var2.right.parent = var1;
- }
-
- var2.parent = var1.parent;
- if (var1 == this.myHeader.parent) {
- this.myHeader.parent = var2;
- } else if (var1 == var1.parent.right) {
- var1.parent.right = var2;
- } else {
- var1.parent.left = var2;
- }
-
- var2.right = var1;
- var1.parent = var2;
- }
-
- void insert(boolean var1, TreeNode var2, TreeNode var3, TreeNode var4) {
- if (var1) {
- var3.left = var4;
- if (var3 == this.myHeader) {
- this.myHeader.parent = var4;
- this.myHeader.right = var4;
- } else if (var3 == this.myHeader.left) {
- this.myHeader.left = var4;
- }
- } else {
- var3.right = var4;
- if (var3 == this.myHeader.right) {
- this.myHeader.right = var4;
- }
- }
-
- var4.parent = var3;
- var4.left = this.NIL;
- var4.right = this.NIL;
- var2 = var4;
- var4.color = 1;
-
- while(var2 != this.myHeader.parent && var2.parent.color == 1) {
- if (var2.parent == var2.parent.parent.left) {
- var3 = var2.parent.parent.right;
- if (var3.color == 1) {
- var2.parent.color = 2;
- var3.color = 2;
- var2.parent.parent.color = 1;
- var2 = var2.parent.parent;
- } else {
- if (var2 == var2.parent.right) {
- var2 = var2.parent;
- this.rotateLeft(var2);
- }
-
- var2.parent.color = 2;
- var2.parent.parent.color = 1;
- this.rotateRight(var2.parent.parent);
- }
- } else {
- var3 = var2.parent.parent.left;
- if (var3.color == 1) {
- var2.parent.color = 2;
- var3.color = 2;
- var2.parent.parent.color = 1;
- var2 = var2.parent.parent;
- } else {
- if (var2 == var2.parent.left) {
- var2 = var2.parent;
- this.rotateRight(var2);
- }
-
- var2.parent.color = 2;
- var2.parent.parent.color = 1;
- this.rotateLeft(var2.parent.parent);
- }
- }
- }
-
- this.myHeader.parent.color = 2;
- }
-
- TreeNode remove(TreeNode var1) {
- TreeNode var2 = var1;
- TreeNode var3;
- if (var1.left == this.NIL) {
- var3 = var1.right;
- } else if (var1.right == this.NIL) {
- var3 = var1.left;
- } else {
- for(var2 = var1.right; var2.left != this.NIL; var2 = var2.left) {
- }
-
- var3 = var2.right;
- }
-
- if (var2 != var1) {
- var1.left.parent = var2;
- var2.left = var1.left;
- if (var2 != var1.right) {
- var3.parent = var2.parent;
- var2.parent.left = var3;
- var2.right = var1.right;
- var1.right.parent = var2;
- } else {
- var3.parent = var2;
- }
-
- if (this.myHeader.parent == var1) {
- this.myHeader.parent = var2;
- } else if (var1.parent.left == var1) {
- var1.parent.left = var2;
- } else {
- var1.parent.right = var2;
- }
-
- var2.parent = var1.parent;
- int var4 = var2.color;
- var2.color = var1.color;
- var1.color = var4;
- var2 = var1;
- } else {
- var3.parent = var2.parent;
- if (this.myHeader.parent == var1) {
- this.myHeader.parent = var3;
- } else if (var1.parent.left == var1) {
- var1.parent.left = var3;
- } else {
- var1.parent.right = var3;
- }
-
- if (this.myHeader.left == var1) {
- if (var1.right == this.NIL) {
- this.myHeader.left = var1.parent;
- } else {
- this.myHeader.left = this.minimum(var3);
- }
- }
-
- if (this.myHeader.right == var1) {
- if (var1.left == this.NIL) {
- this.myHeader.right = var1.parent;
- } else {
- this.myHeader.right = this.maximum(var3);
- }
- }
- }
-
- if (var2.color != 1) {
- while(var3 != this.myHeader.parent && var3.color == 2) {
- if (var3 == var3.parent.left) {
- TreeNode var6 = var3.parent.right;
- if (var6.color == 1) {
- var6.color = 2;
- var3.parent.color = 1;
- this.rotateLeft(var3.parent);
- var6 = var3.parent.right;
- }
-
- if (var6.left.color != 2 || var6.right.color != 2) {
- if (var6.right.color == 2) {
- var6.left.color = 2;
- var6.color = 1;
- this.rotateRight(var6);
- var6 = var3.parent.right;
- }
-
- var6.color = var3.parent.color;
- var3.parent.color = 2;
- var6.right.color = 2;
- this.rotateLeft(var3.parent);
- break;
- }
-
- var6.color = 1;
- var3 = var3.parent;
- } else {
- TreeNode var5 = var3.parent.left;
- if (var5.color == 1) {
- var5.color = 2;
- var3.parent.color = 1;
- this.rotateRight(var3.parent);
- var5 = var3.parent.left;
- }
-
- if (var5.right.color != 2 || var5.left.color != 2) {
- if (var5.left.color == 2) {
- var5.right.color = 2;
- var5.color = 1;
- this.rotateLeft(var5);
- var5 = var3.parent.left;
- }
-
- var5.color = var3.parent.color;
- var3.parent.color = 2;
- var5.left.color = 2;
- this.rotateRight(var3.parent);
- break;
- }
-
- var5.color = 1;
- var3 = var3.parent;
- }
- }
-
- var3.color = 2;
- }
-
- --this.size;
- return var2;
- }
- }
-