home *** CD-ROM | disk | FTP | other *** search
- package COM.objectspace.jgl;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.Enumeration;
-
- public class HashMap extends Map {
- static final int DEFAULT_SIZE = 203;
- static final float DEFAULT_RATIO = 0.75F;
- BinaryPredicate comparator;
- boolean allowDups;
- boolean expandActive;
- transient int size;
- transient HashMapNode[] buckets;
- int length;
- int limit;
- float ratio;
-
- public HashMap() {
- this(new EqualTo(), false, 203, 0.75F);
- }
-
- public HashMap(boolean var1) {
- this(new EqualTo(), var1, 203, 0.75F);
- }
-
- public HashMap(BinaryPredicate var1) {
- this(var1, false, 203, 0.75F);
- }
-
- public HashMap(BinaryPredicate var1, boolean var2) {
- this(var1, var2, 203, 0.75F);
- }
-
- public HashMap(BinaryPredicate var1, int var2, float var3) {
- this(var1, false, var2, var3);
- }
-
- public HashMap(BinaryPredicate var1, boolean var2, int var3, float var4) {
- this.expandActive = true;
- this.comparator = var1;
- this.ratio = var4;
- this.length = var3;
- this.limit = (int)((float)this.length * this.ratio);
- this.buckets = new HashMapNode[this.length];
- this.allowDups = var2;
- }
-
- public HashMap(HashMap var1) {
- this.expandActive = true;
- this.copy(var1);
- }
-
- public boolean allowsDuplicates() {
- return this.allowDups;
- }
-
- public BinaryPredicate getComparator() {
- return this.comparator;
- }
-
- public float getLoadRatio() {
- return this.ratio;
- }
-
- public synchronized Object clone() {
- return new HashMap(this);
- }
-
- public synchronized void copy(HashMap var1) {
- synchronized(var1){}
-
- try {
- this.comparator = var1.comparator;
- this.length = var1.length;
- this.ratio = var1.ratio;
- this.limit = var1.limit;
- this.size = var1.size();
- this.buckets = new HashMapNode[this.length];
- this.allowDups = var1.allowDups;
-
- for(int var4 = 0; var4 < this.length; ++var4) {
- HashMapNode var5 = null;
-
- for(HashMapNode var6 = var1.buckets[var4]; var6 != null; var6 = var6.next) {
- HashMapNode var7 = new HashMapNode(this);
- var7.key = var6.key;
- var7.value = var6.value;
- var7.hash = var6.hash;
- if (this.buckets[var4] == null) {
- this.buckets[var4] = var7;
- } else {
- var5.next = var7;
- }
-
- var5 = var7;
- }
- }
- } catch (Throwable var9) {
- throw var9;
- }
-
- }
-
- public synchronized String toString() {
- return "HashMap" + Printing.toString(this.start(), this.finish());
- }
-
- public synchronized Enumeration elements() {
- return new HashMapIterator(this.first(), this, 3);
- }
-
- public ForwardIterator start() {
- return this.begin();
- }
-
- public ForwardIterator finish() {
- return this.end();
- }
-
- public synchronized HashMapIterator begin() {
- return new HashMapIterator(this.first(), this, 1);
- }
-
- public synchronized HashMapIterator end() {
- return new HashMapIterator((HashMapNode)null, this, 1);
- }
-
- public boolean isEmpty() {
- return this.size == 0;
- }
-
- public int size() {
- return this.size;
- }
-
- public int maxSize() {
- return Integer.MAX_VALUE;
- }
-
- public boolean equals(Object var1) {
- return var1 instanceof HashMap && this.equals((HashMap)var1);
- }
-
- public synchronized boolean equals(HashMap var1) {
- synchronized(var1){}
-
- try {
- if (this.size() != var1.size()) {
- boolean var11 = false;
- return var11;
- } else if (!this.allowDups) {
- HashMapIterator var12 = this.begin();
-
- while(var12.myNode != null) {
- Object var13 = var1.get(var12.myNode.key);
- if (var13 == null || !var13.equals(var12.myNode.value)) {
- boolean var10 = false;
- return var10;
- }
-
- var12.advance();
- }
-
- return true;
- } else {
- Object var5 = null;
-
- for(HashMapIterator var6 = this.begin(); var6.myNode != null; var6.advance()) {
- Object var7 = var6.myNode.key;
- if (var5 == null || !var7.equals(var5)) {
- var5 = var7;
- if (!this.same(this.values(var7), var1.values(var7))) {
- boolean var2 = false;
- return var2;
- }
- }
- }
-
- return true;
- }
- } catch (Throwable var9) {
- throw var9;
- }
- }
-
- public synchronized int hashCode() {
- HashMapIterator var1 = new HashMapIterator(this.first(), this, 2);
- HashMapIterator var2 = new HashMapIterator((HashMapNode)null, this, 2);
- return Hashing.unorderedHash(var1, var2);
- }
-
- public synchronized void swap(HashMap var1) {
- synchronized(var1){}
-
- try {
- int var4 = this.size;
- this.size = var1.size();
- var1.size = var4;
- HashMapNode[] var5 = this.buckets;
- this.buckets = var1.buckets;
- var1.buckets = var5;
- int var6 = this.length;
- this.length = var1.length;
- var1.length = var6;
- int var7 = this.limit;
- this.limit = var1.limit;
- var1.limit = var7;
- float var8 = this.ratio;
- this.ratio = var1.ratio;
- var1.ratio = var8;
- boolean var9 = this.allowDups;
- this.allowDups = var1.allowDups;
- var1.allowDups = var9;
- } catch (Throwable var11) {
- throw var11;
- }
-
- }
-
- public synchronized void clear() {
- this.buckets = new HashMapNode[this.length];
- this.size = 0;
- }
-
- public Object remove(Object var1) {
- return this.removeAux(var1, this.size).first;
- }
-
- public int remove(Object var1, int var2) {
- Pair var3 = this.removeAux(var1, var2);
- return ((Number)var3.second).intValue();
- }
-
- synchronized Pair removeAux(Object var1, int var2) {
- if (var2 > 0) {
- int var3 = var1.hashCode() & Integer.MAX_VALUE;
- int var4 = var3 % this.length;
- HashMapNode var5 = this.buckets[var4];
-
- for(HashMapNode var6 = null; var5 != null; var5 = var5.next) {
- if (var5.hash == var3 && this.comparator.execute(var5.key, var1)) {
- int var7 = 1;
- --var2;
- HashMapNode var8 = var5.next;
- Object var9 = var5.value;
- if (this.allowDups) {
- while(var2 > 0 && var8 != null && var8.hash == var3 && this.comparator.execute(var8.key, var1)) {
- ++var7;
- --var2;
- var8 = var8.next;
- }
- }
-
- if (var6 == null) {
- this.buckets[var4] = var8;
- } else {
- var6.next = var8;
- }
-
- this.size -= var7;
- return new Pair(var9, new Integer(var7));
- }
-
- var6 = var5;
- }
- }
-
- return new Pair((Object)null, new Integer(0));
- }
-
- public synchronized Object remove(Enumeration var1) {
- if (!(var1 instanceof HashMapIterator)) {
- throw new IllegalArgumentException("Enumeration not a HashMapIterator");
- } else if (((HashMapIterator)var1).myHashMap != this) {
- throw new IllegalArgumentException("Enumeration not for this HashMap");
- } else {
- HashMapNode var2 = ((HashMapIterator)var1).myNode;
- int var3 = var2.hash % this.length;
- HashMapNode var4 = this.buckets[var3];
- if (var2 == var4) {
- this.buckets[var3] = var2.next;
- } else {
- while(var4.next != var2) {
- var4 = var4.next;
- }
-
- var4.next = var2.next;
- }
-
- --this.size;
- return var2 == null ? null : var2.value;
- }
- }
-
- public synchronized int remove(Enumeration var1, Enumeration var2) {
- if (var1 instanceof HashMapIterator && var2 instanceof HashMapIterator) {
- if (((HashMapIterator)var1).myHashMap == this && ((HashMapIterator)var2).myHashMap == this) {
- HashMapIterator var3 = (HashMapIterator)var1;
- HashMapIterator var4 = (HashMapIterator)var2;
-
- int var5;
- for(var5 = 0; var3.myNode != var4.myNode; ++var5) {
- HashMapIterator var6 = new HashMapIterator(var3);
- var6.advance();
- this.remove((Enumeration)var3);
- var3 = var6;
- }
-
- return var5;
- } else {
- throw new IllegalArgumentException("Enumeration not for this HashMap");
- }
- } else {
- throw new IllegalArgumentException("Enumeration not a HashMapIterator");
- }
- }
-
- public synchronized HashMapIterator find(Object var1) {
- int var2 = var1.hashCode() & Integer.MAX_VALUE;
-
- for(HashMapNode var3 = this.buckets[var2 % this.length]; var3 != null; var3 = var3.next) {
- if (var2 == var3.hash && this.comparator.execute(var3.key, var1)) {
- return new HashMapIterator(var3, this, 1);
- }
- }
-
- return new HashMapIterator((HashMapNode)null, this, 1);
- }
-
- public synchronized int count(Object var1) {
- int var2 = var1.hashCode() & Integer.MAX_VALUE;
-
- for(HashMapNode var3 = this.buckets[var2 % this.length]; var3 != null; var3 = var3.next) {
- if (var2 == var3.hash && this.comparator.execute(var3.key, var1)) {
- if (!this.allowDups) {
- return 1;
- }
-
- int var4 = 1;
-
- for(HashMapNode var5 = var3.next; var5 != null && var2 == var5.hash && this.comparator.execute(var5.key, var1); var5 = var5.next) {
- ++var4;
- }
-
- return var4;
- }
- }
-
- return 0;
- }
-
- public synchronized int countValues(Object var1) {
- return Counting.count(new HashMapIterator(this.first(), this, 3), new HashMapIterator((HashMapNode)null, this, 3), var1);
- }
-
- public synchronized Object get(Object var1) {
- int var2 = var1.hashCode() & Integer.MAX_VALUE;
-
- for(HashMapNode var3 = this.buckets[var2 % this.length]; var3 != null; var3 = var3.next) {
- if (var2 == var3.hash && this.comparator.execute(var3.key, var1)) {
- return var3.value;
- }
- }
-
- return null;
- }
-
- public synchronized Object put(Object var1, Object var2) {
- if (var1 != null && var2 != null) {
- int var3 = var1.hashCode() & Integer.MAX_VALUE;
- int var4 = var3 % this.length;
-
- for(HashMapNode var5 = this.buckets[var4]; var5 != null; var5 = var5.next) {
- if (var3 == var5.hash && this.comparator.execute(var5.key, var1)) {
- var5.key = var1;
- Object var6 = var5.value;
- var5.value = var2;
- return var6;
- }
- }
-
- HashMapNode var7 = new HashMapNode(this);
- var7.key = var1;
- var7.value = var2;
- var7.hash = var3;
- var7.next = this.buckets[var4];
- this.buckets[var4] = var7;
- if (++this.size > this.limit) {
- this.expand();
- }
-
- return null;
- } else {
- throw new NullPointerException();
- }
- }
-
- public Object add(Object var1) {
- if (var1 == null) {
- throw new NullPointerException();
- } else if (!(var1 instanceof Pair)) {
- throw new IllegalArgumentException("object is not pair");
- } else if (((Pair)var1).first != null && ((Pair)var1).second != null) {
- Pair var2 = (Pair)var1;
- return this.add(var2.first, var2.second);
- } else {
- throw new NullPointerException();
- }
- }
-
- public synchronized Object add(Object var1, Object var2) {
- if (var1 != null && var2 != null) {
- int var3 = var1.hashCode() & Integer.MAX_VALUE;
- int var4 = var3 % this.length;
-
- for(HashMapNode var5 = this.buckets[var4]; var5 != null; var5 = var5.next) {
- if (var3 == var5.hash && this.comparator.execute(var5.key, var1)) {
- if (this.allowDups) {
- HashMapNode var6 = new HashMapNode(this);
- var6.key = var1;
- var6.value = var2;
- var6.hash = var3;
- var6.next = var5.next;
- var5.next = var6;
- if (++this.size > this.limit) {
- this.expand();
- }
-
- return null;
- }
-
- return var5.value;
- }
- }
-
- HashMapNode var7 = new HashMapNode(this);
- var7.key = var1;
- var7.value = var2;
- var7.hash = var3;
- var7.next = this.buckets[var4];
- this.buckets[var4] = var7;
- if (++this.size > this.limit) {
- this.expand();
- }
-
- return null;
- } else {
- throw new NullPointerException();
- }
- }
-
- public synchronized Enumeration keys() {
- return new HashMapIterator(this.first(), this, 2);
- }
-
- public synchronized Enumeration keys(Object var1) {
- Array var2 = new Array();
-
- for(HashMapIterator var3 = this.begin(); var3.myNode != null; var3.advance()) {
- if (var3.myNode.value.equals(var1)) {
- var2.pushBack(var3.myNode.key);
- }
- }
-
- return var2.elements();
- }
-
- public synchronized Enumeration values(Object var1) {
- Array var2 = new Array();
-
- for(HashMapIterator var3 = this.begin(); var3.myNode != null; var3.advance()) {
- if (this.comparator.execute(var3.myNode.key, var1)) {
- var2.pushBack(var3.myNode.value);
- }
- }
-
- return var2.elements();
- }
-
- public synchronized HashMapIterator lowerBound(Object var1) {
- return (HashMapIterator)this.equalRange(var1).begin;
- }
-
- public synchronized HashMapIterator upperBound(Object var1) {
- return (HashMapIterator)this.equalRange(var1).end;
- }
-
- public synchronized Range equalRange(Object var1) {
- int var2 = var1.hashCode() & Integer.MAX_VALUE;
-
- for(HashMapNode var3 = this.buckets[var2 % this.length]; var3 != null; var3 = var3.next) {
- if (var2 == var3.hash && this.comparator.execute(var3.key, var1)) {
- HashMapNode var4 = var3;
-
- for(var3 = var3.next == null ? this.next(var3) : var3.next; var3 != null && var2 == var3.hash && this.comparator.execute(var3.key, var1); var3 = var3.next == null ? this.next(var3) : var3.next) {
- }
-
- return new Range(new HashMapIterator(var4, this, 1), new HashMapIterator(var3, this, 1));
- }
- }
-
- return new Range(this.end(), this.end());
- }
-
- private HashMapNode first() {
- if (this.size > 0) {
- for(int var1 = 0; var1 < this.length; ++var1) {
- if (this.buckets[var1] != null) {
- return this.buckets[var1];
- }
- }
- }
-
- return null;
- }
-
- private HashMapNode next(HashMapNode var1) {
- for(int var2 = var1.hash % this.length + 1; var2 < this.length; ++var2) {
- if (this.buckets[var2] != null) {
- return this.buckets[var2];
- }
- }
-
- return null;
- }
-
- public boolean expansionAllowed() {
- return this.expandActive;
- }
-
- public synchronized void allowExpansion(boolean var1) {
- this.expandActive = var1;
- }
-
- private void expand() {
- if (this.expansionAllowed()) {
- int var1 = this.length * 2 + 1;
- HashMapNode[] var2 = new HashMapNode[var1];
-
- HashMapNode var5;
- int var6;
- for(int var3 = 0; var3 < this.length; ++var3) {
- for(HashMapNode var4 = this.buckets[var3]; var4 != null; var2[var6] = var5) {
- var5 = var4;
- var4 = var4.next;
- var6 = var5.hash % var1;
- var5.next = var2[var6];
- }
- }
-
- this.buckets = var2;
- this.length = var1;
- this.limit = (int)((float)this.length * this.ratio);
- }
- }
-
- private boolean same(Enumeration var1, Enumeration var2) {
- Array var3 = new Array();
- Array var4 = new Array();
-
- while(var1.hasMoreElements()) {
- var3.add(var1.nextElement());
- }
-
- while(var2.hasMoreElements()) {
- var4.add(var2.nextElement());
- }
-
- if (var3.size() != var4.size()) {
- return false;
- } else {
- for(int var5 = 0; var5 < var3.size(); ++var5) {
- Object var6 = var3.at(var5);
- int var7 = 0;
- int var8 = 0;
-
- for(int var9 = 0; var9 < var4.size(); ++var9) {
- if (var3.at(var9).equals(var6)) {
- ++var7;
- }
-
- if (var4.at(var9).equals(var6)) {
- ++var8;
- }
- }
-
- if (var7 != var8) {
- return false;
- }
- }
-
- return true;
- }
- }
-
- private void size(int var1) {
- this.size = var1;
- }
-
- private synchronized void writeObject(ObjectOutputStream var1) throws IOException {
- var1.defaultWriteObject();
- var1.writeInt(this.size);
- Copying.copy(this.begin(), this.end(), new ObjectOutputStreamIterator(var1));
- }
-
- private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- this.buckets = new HashMapNode[this.length];
- int var2 = var1.readInt();
-
- while(var2-- > 0) {
- this.add(var1.readObject());
- }
-
- }
- }
-