home *** CD-ROM | disk | FTP | other *** search
- package java.util;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
-
- public class TreeMap extends AbstractMap implements SortedMap, Cloneable, Serializable {
- private Comparator comparator = null;
- private transient Entry root = null;
- private transient int size = 0;
- private transient int modCount = 0;
- private transient Set keySet = null;
- private transient Set entrySet = null;
- private transient Collection values = null;
- private static final int KEYS = 0;
- private static final int VALUES = 1;
- private static final int ENTRIES = 2;
- private static final boolean RED = false;
- private static final boolean BLACK = true;
- private static final long serialVersionUID = 919286545866124006L;
-
- private void incrementSize() {
- ++this.modCount;
- ++this.size;
- }
-
- private void decrementSize() {
- ++this.modCount;
- --this.size;
- }
-
- public TreeMap() {
- }
-
- public TreeMap(Comparator var1) {
- this.comparator = var1;
- }
-
- public TreeMap(Map var1) {
- this.putAll(var1);
- }
-
- public TreeMap(SortedMap var1) {
- this.comparator = var1.comparator();
-
- try {
- this.buildFromSorted(var1.size(), var1.entrySet().iterator(), (ObjectInputStream)null, (Object)null);
- } catch (IOException var4) {
- } catch (ClassNotFoundException var5) {
- }
-
- }
-
- public int size() {
- return this.size;
- }
-
- public boolean containsKey(Object var1) {
- return this.getEntry(var1) != null;
- }
-
- public boolean containsValue(Object var1) {
- return this.root == null ? false : (var1 == null ? this.valueSearchNull(this.root) : this.valueSearchNonNull(this.root, var1));
- }
-
- private boolean valueSearchNull(Entry var1) {
- if (var1.value == null) {
- return true;
- } else {
- return var1.left != null && this.valueSearchNull(var1.left) || var1.right != null && this.valueSearchNull(var1.right);
- }
- }
-
- private boolean valueSearchNonNull(Entry var1, Object var2) {
- if (var2.equals(var1.value)) {
- return true;
- } else {
- return var1.left != null && this.valueSearchNonNull(var1.left, var2) || var1.right != null && this.valueSearchNonNull(var1.right, var2);
- }
- }
-
- public Object get(Object var1) {
- Entry var2 = this.getEntry(var1);
- return var2 == null ? null : var2.value;
- }
-
- public Comparator comparator() {
- return this.comparator;
- }
-
- public Object firstKey() {
- return key(this.firstEntry());
- }
-
- public Object lastKey() {
- return key(this.lastEntry());
- }
-
- public void putAll(Map var1) {
- int var2 = var1.size();
- if (this.size == 0 && var2 != 0 && var1 instanceof SortedMap) {
- Comparator var3 = ((SortedMap)var1).comparator();
- if (var3 == this.comparator || var3 != null && var3.equals(this.comparator)) {
- ++this.modCount;
-
- try {
- this.buildFromSorted(var2, var1.entrySet().iterator(), (ObjectInputStream)null, (Object)null);
- } catch (IOException var6) {
- } catch (ClassNotFoundException var7) {
- }
-
- return;
- }
- }
-
- super.putAll(var1);
- }
-
- private Entry getEntry(Object var1) {
- Entry var2 = this.root;
-
- while(var2 != null) {
- int var3 = this.compare(var1, var2.key);
- if (var3 == 0) {
- return var2;
- }
-
- if (var3 < 0) {
- var2 = var2.left;
- } else {
- var2 = var2.right;
- }
- }
-
- return null;
- }
-
- private Entry getCeilEntry(Object var1) {
- Entry var2 = this.root;
- if (var2 == null) {
- return null;
- } else {
- while(true) {
- int var3 = this.compare(var1, var2.key);
- if (var3 == 0) {
- return var2;
- }
-
- if (var3 < 0) {
- if (var2.left == null) {
- return var2;
- }
-
- var2 = var2.left;
- } else {
- if (var2.right == null) {
- Entry var4 = var2.parent;
-
- for(Entry var5 = var2; var4 != null && var5 == var4.right; var4 = var4.parent) {
- var5 = var4;
- }
-
- return var4;
- }
-
- var2 = var2.right;
- }
- }
- }
- }
-
- private Entry getPrecedingEntry(Object var1) {
- Entry var2 = this.root;
- if (var2 == null) {
- return null;
- } else {
- while(true) {
- int var3 = this.compare(var1, var2.key);
- if (var3 > 0) {
- if (var2.right == null) {
- return var2;
- }
-
- var2 = var2.right;
- } else {
- if (var2.left == null) {
- Entry var4 = var2.parent;
-
- for(Entry var5 = var2; var4 != null && var5 == var4.left; var4 = var4.parent) {
- var5 = var4;
- }
-
- return var4;
- }
-
- var2 = var2.left;
- }
- }
- }
- }
-
- private static Object key(Entry var0) {
- if (var0 == null) {
- throw new NoSuchElementException();
- } else {
- return var0.key;
- }
- }
-
- public Object put(Object var1, Object var2) {
- Entry var3 = this.root;
- if (var3 == null) {
- this.incrementSize();
- this.root = new Entry(var1, var2, (Entry)null);
- return null;
- } else {
- while(true) {
- int var4 = this.compare(var1, var3.key);
- if (var4 == 0) {
- return var3.setValue(var2);
- }
-
- if (var4 < 0) {
- if (var3.left == null) {
- this.incrementSize();
- var3.left = new Entry(var1, var2, var3);
- this.fixAfterInsertion(var3.left);
- return null;
- }
-
- var3 = var3.left;
- } else {
- if (var3.right == null) {
- this.incrementSize();
- var3.right = new Entry(var1, var2, var3);
- this.fixAfterInsertion(var3.right);
- return null;
- }
-
- var3 = var3.right;
- }
- }
- }
- }
-
- public Object remove(Object var1) {
- Entry var2 = this.getEntry(var1);
- if (var2 == null) {
- return null;
- } else {
- Object var3 = var2.value;
- this.deleteEntry(var2);
- return var3;
- }
- }
-
- public void clear() {
- ++this.modCount;
- this.size = 0;
- this.root = null;
- }
-
- public Object clone() {
- Object var1 = null;
-
- try {
- var7 = (TreeMap)super.clone();
- } catch (CloneNotSupportedException var6) {
- throw new InternalError();
- }
-
- var7.root = null;
- var7.size = 0;
- var7.modCount = 0;
- var7.keySet = var7.entrySet = null;
- var7.values = null;
-
- try {
- var7.buildFromSorted(this.size, this.entrySet().iterator(), (ObjectInputStream)null, (Object)null);
- } catch (IOException var4) {
- } catch (ClassNotFoundException var5) {
- }
-
- return var7;
- }
-
- public Set keySet() {
- if (this.keySet == null) {
- this.keySet = new 1(this);
- }
-
- return this.keySet;
- }
-
- public Collection values() {
- if (this.values == null) {
- this.values = new 2(this);
- }
-
- return this.values;
- }
-
- public Set entrySet() {
- if (this.entrySet == null) {
- this.entrySet = new 3(this);
- }
-
- return this.entrySet;
- }
-
- public SortedMap subMap(Object var1, Object var2) {
- return new SubMap(this, var1, var2);
- }
-
- public SortedMap headMap(Object var1) {
- return new SubMap(this, var1, true);
- }
-
- public SortedMap tailMap(Object var1) {
- return new SubMap(this, var1, false);
- }
-
- private int compare(Object var1, Object var2) {
- return this.comparator == null ? ((Comparable)var1).compareTo(var2) : this.comparator.compare(var1, var2);
- }
-
- private static boolean valEquals(Object var0, Object var1) {
- return var0 == null ? var1 == null : var0.equals(var1);
- }
-
- private Entry firstEntry() {
- Entry var1 = this.root;
- if (var1 != null) {
- while(var1.left != null) {
- var1 = var1.left;
- }
- }
-
- return var1;
- }
-
- private Entry lastEntry() {
- Entry var1 = this.root;
- if (var1 != null) {
- while(var1.right != null) {
- var1 = var1.right;
- }
- }
-
- return var1;
- }
-
- private Entry successor(Entry var1) {
- if (var1 == null) {
- return null;
- } else if (var1.right != null) {
- Entry var4;
- for(var4 = var1.right; var4.left != null; var4 = var4.left) {
- }
-
- return var4;
- } else {
- Entry var2 = var1.parent;
-
- for(Entry var3 = var1; var2 != null && var3 == var2.right; var2 = var2.parent) {
- var3 = var2;
- }
-
- return var2;
- }
- }
-
- private static boolean colorOf(Entry var0) {
- return var0 == null ? true : var0.color;
- }
-
- private static Entry parentOf(Entry var0) {
- return var0 == null ? null : var0.parent;
- }
-
- private static void setColor(Entry var0, boolean var1) {
- if (var0 != null) {
- var0.color = var1;
- }
-
- }
-
- private static Entry leftOf(Entry var0) {
- return var0 == null ? null : var0.left;
- }
-
- private static Entry rightOf(Entry var0) {
- return var0 == null ? null : var0.right;
- }
-
- private void rotateLeft(Entry var1) {
- Entry var2 = var1.right;
- var1.right = var2.left;
- if (var2.left != null) {
- var2.left.parent = var1;
- }
-
- var2.parent = var1.parent;
- if (var1.parent == null) {
- this.root = var2;
- } else if (var1.parent.left == var1) {
- var1.parent.left = var2;
- } else {
- var1.parent.right = var2;
- }
-
- var2.left = var1;
- var1.parent = var2;
- }
-
- private void rotateRight(Entry var1) {
- Entry var2 = var1.left;
- var1.left = var2.right;
- if (var2.right != null) {
- var2.right.parent = var1;
- }
-
- var2.parent = var1.parent;
- if (var1.parent == null) {
- this.root = var2;
- } else if (var1.parent.right == var1) {
- var1.parent.right = var2;
- } else {
- var1.parent.left = var2;
- }
-
- var2.right = var1;
- var1.parent = var2;
- }
-
- private void fixAfterInsertion(Entry var1) {
- var1.color = false;
-
- while(var1 != null && var1 != this.root && !var1.parent.color) {
- if (parentOf(var1) == leftOf(parentOf(parentOf(var1)))) {
- Entry var2 = rightOf(parentOf(parentOf(var1)));
- if (!colorOf(var2)) {
- setColor(parentOf(var1), true);
- setColor(var2, true);
- setColor(parentOf(parentOf(var1)), false);
- var1 = parentOf(parentOf(var1));
- } else {
- if (var1 == rightOf(parentOf(var1))) {
- var1 = parentOf(var1);
- this.rotateLeft(var1);
- }
-
- setColor(parentOf(var1), true);
- setColor(parentOf(parentOf(var1)), false);
- if (parentOf(parentOf(var1)) != null) {
- this.rotateRight(parentOf(parentOf(var1)));
- }
- }
- } else {
- Entry var3 = leftOf(parentOf(parentOf(var1)));
- if (!colorOf(var3)) {
- setColor(parentOf(var1), true);
- setColor(var3, true);
- setColor(parentOf(parentOf(var1)), false);
- var1 = parentOf(parentOf(var1));
- } else {
- if (var1 == leftOf(parentOf(var1))) {
- var1 = parentOf(var1);
- this.rotateRight(var1);
- }
-
- setColor(parentOf(var1), true);
- setColor(parentOf(parentOf(var1)), false);
- if (parentOf(parentOf(var1)) != null) {
- this.rotateLeft(parentOf(parentOf(var1)));
- }
- }
- }
- }
-
- this.root.color = true;
- }
-
- private void deleteEntry(Entry var1) {
- this.decrementSize();
- if (var1.left != null && var1.right != null) {
- Entry var2 = this.successor(var1);
- this.swapPosition(var2, var1);
- }
-
- Entry var3 = var1.left != null ? var1.left : var1.right;
- if (var3 != null) {
- var3.parent = var1.parent;
- if (var1.parent == null) {
- this.root = var3;
- } else if (var1 == var1.parent.left) {
- var1.parent.left = var3;
- } else {
- var1.parent.right = var3;
- }
-
- var1.left = var1.right = var1.parent = null;
- if (var1.color) {
- this.fixAfterDeletion(var3);
- }
- } else if (var1.parent == null) {
- this.root = null;
- } else {
- if (var1.color) {
- this.fixAfterDeletion(var1);
- }
-
- if (var1.parent != null) {
- if (var1 == var1.parent.left) {
- var1.parent.left = null;
- } else if (var1 == var1.parent.right) {
- var1.parent.right = null;
- }
-
- var1.parent = null;
- }
- }
-
- }
-
- private void fixAfterDeletion(Entry var1) {
- while(var1 != this.root && colorOf(var1)) {
- if (var1 == leftOf(parentOf(var1))) {
- Entry var3 = rightOf(parentOf(var1));
- if (!colorOf(var3)) {
- setColor(var3, true);
- setColor(parentOf(var1), false);
- this.rotateLeft(parentOf(var1));
- var3 = rightOf(parentOf(var1));
- }
-
- if (colorOf(leftOf(var3)) && colorOf(rightOf(var3))) {
- setColor(var3, false);
- var1 = parentOf(var1);
- } else {
- if (colorOf(rightOf(var3))) {
- setColor(leftOf(var3), true);
- setColor(var3, false);
- this.rotateRight(var3);
- var3 = rightOf(parentOf(var1));
- }
-
- setColor(var3, colorOf(parentOf(var1)));
- setColor(parentOf(var1), true);
- setColor(rightOf(var3), true);
- this.rotateLeft(parentOf(var1));
- var1 = this.root;
- }
- } else {
- Entry var2 = leftOf(parentOf(var1));
- if (!colorOf(var2)) {
- setColor(var2, true);
- setColor(parentOf(var1), false);
- this.rotateRight(parentOf(var1));
- var2 = leftOf(parentOf(var1));
- }
-
- if (colorOf(rightOf(var2)) && colorOf(leftOf(var2))) {
- setColor(var2, false);
- var1 = parentOf(var1);
- } else {
- if (colorOf(leftOf(var2))) {
- setColor(rightOf(var2), true);
- setColor(var2, false);
- this.rotateLeft(var2);
- var2 = leftOf(parentOf(var1));
- }
-
- setColor(var2, colorOf(parentOf(var1)));
- setColor(parentOf(var1), true);
- setColor(leftOf(var2), true);
- this.rotateRight(parentOf(var1));
- var1 = this.root;
- }
- }
- }
-
- setColor(var1, true);
- }
-
- private void swapPosition(Entry var1, Entry var2) {
- Entry var3 = var1.parent;
- Entry var4 = var1.left;
- Entry var5 = var1.right;
- Entry var6 = var2.parent;
- Entry var7 = var2.left;
- Entry var8 = var2.right;
- boolean var9 = var3 != null && var1 == var3.left;
- boolean var10 = var6 != null && var2 == var6.left;
- if (var1 == var6) {
- var1.parent = var2;
- if (var10) {
- var2.left = var1;
- var2.right = var5;
- } else {
- var2.right = var1;
- var2.left = var4;
- }
- } else {
- var1.parent = var6;
- if (var6 != null) {
- if (var10) {
- var6.left = var1;
- } else {
- var6.right = var1;
- }
- }
-
- var2.left = var4;
- var2.right = var5;
- }
-
- if (var2 == var3) {
- var2.parent = var1;
- if (var9) {
- var1.left = var2;
- var1.right = var8;
- } else {
- var1.right = var2;
- var1.left = var7;
- }
- } else {
- var2.parent = var3;
- if (var3 != null) {
- if (var9) {
- var3.left = var2;
- } else {
- var3.right = var2;
- }
- }
-
- var1.left = var7;
- var1.right = var8;
- }
-
- if (var1.left != null) {
- var1.left.parent = var1;
- }
-
- if (var1.right != null) {
- var1.right.parent = var1;
- }
-
- if (var2.left != null) {
- var2.left.parent = var2;
- }
-
- if (var2.right != null) {
- var2.right.parent = var2;
- }
-
- boolean var11 = var1.color;
- var1.color = var2.color;
- var2.color = var11;
- if (this.root == var1) {
- this.root = var2;
- } else if (this.root == var2) {
- this.root = var1;
- }
-
- }
-
- private void writeObject(ObjectOutputStream var1) throws IOException {
- var1.defaultWriteObject();
- var1.writeInt(this.size);
-
- for(Entry var3 : this.entrySet()) {
- var1.writeObject(var3.key);
- var1.writeObject(var3.value);
- }
-
- }
-
- private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- int var2 = var1.readInt();
- this.buildFromSorted(var2, (java.util.Iterator)null, var1, (Object)null);
- }
-
- void readTreeSet(int var1, ObjectInputStream var2, Object var3) throws IOException, ClassNotFoundException {
- this.buildFromSorted(var1, (java.util.Iterator)null, var2, var3);
- }
-
- void addAllForTreeSet(SortedSet var1, Object var2) {
- try {
- this.buildFromSorted(var1.size(), var1.iterator(), (ObjectInputStream)null, var2);
- } catch (IOException var5) {
- } catch (ClassNotFoundException var6) {
- }
-
- }
-
- private void buildFromSorted(int var1, java.util.Iterator var2, ObjectInputStream var3, Object var4) throws IOException, ClassNotFoundException {
- this.size = var1;
- this.root = buildFromSorted(0, 0, var1 - 1, computeRedLevel(var1), var2, var3, var4);
- }
-
- private static Entry buildFromSorted(int var0, int var1, int var2, int var3, java.util.Iterator var4, ObjectInputStream var5, Object var6) throws IOException, ClassNotFoundException {
- if (var2 < var1) {
- return null;
- } else {
- int var7 = (var1 + var2) / 2;
- Entry var8 = null;
- if (var1 < var7) {
- var8 = buildFromSorted(var0 + 1, var1, var7 - 1, var3, var4, var5, var6);
- }
-
- Object var9;
- Object var10;
- if (var4 != null) {
- if (var6 == null) {
- Map.Entry var11 = (Map.Entry)var4.next();
- var9 = var11.getKey();
- var10 = var11.getValue();
- } else {
- var9 = var4.next();
- var10 = var6;
- }
- } else {
- var9 = var5.readObject();
- var10 = var6 != null ? var6 : var5.readObject();
- }
-
- Entry var13 = new Entry(var9, var10, (Entry)null);
- if (var0 == var3) {
- var13.color = false;
- }
-
- if (var8 != null) {
- var13.left = var8;
- var8.parent = var13;
- }
-
- if (var7 < var2) {
- Entry var12 = buildFromSorted(var0 + 1, var7 + 1, var2, var3, var4, var5, var6);
- var13.right = var12;
- var12.parent = var13;
- }
-
- return var13;
- }
- }
-
- private static int computeRedLevel(int var0) {
- int var1 = 0;
-
- for(int var2 = var0 - 1; var2 >= 0; var2 = var2 / 2 - 1) {
- ++var1;
- }
-
- return var1;
- }
-
- // $FF: synthetic method
- static int access$000(TreeMap var0) {
- return var0.size;
- }
-
- // $FF: synthetic method
- static Entry access$100(TreeMap var0) {
- return var0.firstEntry();
- }
-
- // $FF: synthetic method
- static Entry access$200(TreeMap var0, Entry var1) {
- return var0.successor(var1);
- }
-
- // $FF: synthetic method
- static boolean access$300(Object var0, Object var1) {
- return valEquals(var0, var1);
- }
-
- // $FF: synthetic method
- static void access$400(TreeMap var0, Entry var1) {
- var0.deleteEntry(var1);
- }
-
- // $FF: synthetic method
- static Entry access$500(TreeMap var0, Object var1) {
- return var0.getEntry(var1);
- }
-
- // $FF: synthetic method
- static int access$600(TreeMap var0, Object var1, Object var2) {
- return var0.compare(var1, var2);
- }
-
- // $FF: synthetic method
- static Comparator access$700(TreeMap var0) {
- return var0.comparator;
- }
-
- // $FF: synthetic method
- static Entry access$800(TreeMap var0, Object var1) {
- return var0.getCeilEntry(var1);
- }
-
- // $FF: synthetic method
- static Object access$900(Entry var0) {
- return key(var0);
- }
-
- // $FF: synthetic method
- static Entry access$1000(TreeMap var0) {
- return var0.lastEntry();
- }
-
- // $FF: synthetic method
- static Entry access$1100(TreeMap var0, Object var1) {
- return var0.getPrecedingEntry(var1);
- }
-
- // $FF: synthetic method
- static int access$1400(TreeMap var0) {
- return var0.modCount;
- }
- }
-