home *** CD-ROM | disk | FTP | other *** search
- package netscape.util;
-
- public class Hashtable implements Cloneable, Codable {
- // $FF: renamed from: A int
- static final int field_0 = -1640531527;
- static final int EMPTY = 0;
- static final int REMOVED = 1;
- static final int DEFAULT = 2;
- static final String keysField = "keys";
- static final String elementsField = "elements";
- int count;
- int totalCount;
- int shift;
- int capacity;
- int indexMask;
- int[] hashCodes;
- Object[] keys;
- Object[] elements;
-
- public Hashtable() {
- this.shift = 30;
- }
-
- public Hashtable(int var1) {
- this();
- if (var1 < 0) {
- throw new IllegalArgumentException("initialCapacity must be > 0");
- } else {
- this.grow(var1);
- }
- }
-
- public Object clone() {
- Hashtable var2;
- try {
- var2 = (Hashtable)super.clone();
- } catch (CloneNotSupportedException var3) {
- throw new InternalError("Error in clone(). This shouldn't happen.");
- }
-
- if (this.count == 0) {
- var2.shift = 30;
- var2.totalCount = 0;
- var2.capacity = 0;
- var2.indexMask = 0;
- var2.hashCodes = null;
- var2.keys = null;
- var2.elements = null;
- return var2;
- } else {
- int var1 = this.hashCodes.length;
- var2.hashCodes = new int[var1];
- var2.keys = new Object[var1];
- var2.elements = new Object[var1];
- System.arraycopy(this.hashCodes, 0, var2.hashCodes, 0, var1);
- System.arraycopy(this.keys, 0, var2.keys, 0, var1);
- System.arraycopy(this.elements, 0, var2.elements, 0, var1);
- return var2;
- }
- }
-
- public int count() {
- return this.count;
- }
-
- public int size() {
- return this.count;
- }
-
- public boolean isEmpty() {
- return this.count == 0;
- }
-
- public Enumeration keys() {
- return new HashtableEnumerator(this, true);
- }
-
- public Enumeration elements() {
- return new HashtableEnumerator(this, false);
- }
-
- public Vector keysVector() {
- if (this.count == 0) {
- return new Vector();
- } else {
- Vector var4 = new Vector(this.count);
- int var2 = 0;
-
- for(int var1 = 0; var1 < this.keys.length && var2 < this.count; ++var1) {
- Object var3 = this.keys[var1];
- if (var3 != null) {
- var4.addElement(var3);
- ++var2;
- }
- }
-
- return var4;
- }
- }
-
- public Vector elementsVector() {
- if (this.count == 0) {
- return new Vector();
- } else {
- Vector var4 = new Vector(this.count);
- int var2 = 0;
-
- for(int var1 = 0; var1 < this.elements.length && var2 < this.count; ++var1) {
- Object var3 = this.elements[var1];
- if (var3 != null) {
- var4.addElement(var3);
- ++var2;
- }
- }
-
- return var4;
- }
- }
-
- public Object[] keysArray() {
- if (this.count == 0) {
- return null;
- } else {
- Object[] var4 = new Object[this.count];
- int var2 = 0;
-
- for(int var1 = 0; var1 < this.keys.length && var2 < this.count; ++var1) {
- Object var3 = this.keys[var1];
- if (var3 != null) {
- var4[var2++] = var3;
- }
- }
-
- return var4;
- }
- }
-
- public Object[] elementsArray() {
- if (this.count == 0) {
- return null;
- } else {
- Object[] var4 = new Object[this.count];
- int var2 = 0;
-
- for(int var1 = 0; var1 < this.elements.length && var2 < this.count; ++var1) {
- Object var3 = this.elements[var1];
- if (var3 != null) {
- var4[var2++] = var3;
- }
- }
-
- return var4;
- }
- }
-
- public boolean contains(Object var1) {
- if (this.count == 0) {
- return false;
- } else if (var1 == null) {
- throw new NullPointerException();
- } else if (this.elements == null) {
- return false;
- } else {
- for(int var2 = 0; var2 < this.elements.length; ++var2) {
- Object var3 = this.elements[var2];
- if (var3 != null && var1.equals(var3)) {
- return true;
- }
- }
-
- return false;
- }
- }
-
- public boolean containsKey(Object var1) {
- return this.get(var1) != null;
- }
-
- public Object get(Object var1) {
- return this.count == 0 ? null : this.elements[this.tableIndexFor(var1, this.hash(var1))];
- }
-
- public Object remove(Object var1) {
- if (this.count == 0) {
- return null;
- } else {
- int var2 = this.tableIndexFor(var1, this.hash(var1));
- Object var3 = this.elements[var2];
- if (var3 == null) {
- return null;
- } else {
- --this.count;
- this.hashCodes[var2] = 1;
- this.keys[var2] = null;
- this.elements[var2] = null;
- return var3;
- }
- }
- }
-
- public Object put(Object var1, Object var2) {
- if (var2 == null) {
- throw new NullPointerException();
- } else {
- if (this.hashCodes == null) {
- this.grow();
- }
-
- int var4 = this.hash(var1);
- int var3 = this.tableIndexFor(var1, var4);
- Object var5 = this.elements[var3];
- if (var5 == null) {
- if (this.hashCodes[var3] == 0) {
- if (this.totalCount >= this.capacity) {
- this.grow();
- return this.put(var1, var2);
- }
-
- ++this.totalCount;
- }
-
- ++this.count;
- }
-
- this.hashCodes[var3] = var4;
- this.keys[var3] = var1;
- this.elements[var3] = var2;
- return var5;
- }
- }
-
- private int hash(Object var1) {
- int var2 = var1.hashCode();
- if (var2 == 0 || var2 == 1) {
- var2 = 2;
- }
-
- return var2;
- }
-
- private int tableIndexFor(Object var1, int var2) {
- int var3 = var2 * -1640531527;
- int var5 = var3 >>> this.shift;
- int var4 = this.hashCodes[var5];
- int var7;
- if (var4 == var2) {
- if (var1.equals(this.keys[var5])) {
- return var5;
- }
-
- var7 = -1;
- } else {
- if (var4 == 0) {
- return var5;
- }
-
- if (var4 == 1) {
- var7 = var5;
- } else {
- var7 = -1;
- }
- }
-
- int var6 = var3 >>> 2 * this.shift - 32 & this.indexMask | 1;
- int var8 = 1;
-
- do {
- ++var8;
- var5 = var5 + var6 & this.indexMask;
- var4 = this.hashCodes[var5];
- if (var4 == var2) {
- if (var1.equals(this.keys[var5])) {
- return var5;
- }
- } else {
- if (var4 == 0) {
- if (var7 < 0) {
- return var5;
- }
-
- return var7;
- }
-
- if (var4 == 1 && var7 == -1) {
- var7 = var5;
- }
- }
- } while(var8 <= this.totalCount);
-
- throw new InconsistencyException("Hashtable overflow");
- }
-
- private void grow(int var1) {
- int var2 = var1 * 4 / 3;
-
- int var3;
- for(var3 = 3; 1 << var3 < var2; ++var3) {
- }
-
- this.shift = 32 - var3 + 1;
- this.grow();
- }
-
- private void grow() {
- --this.shift;
- int var4 = 32 - this.shift;
- this.indexMask = (1 << var4) - 1;
- this.capacity = 3 * (1 << var4) / 4;
- int[] var5 = this.hashCodes;
- Object[] var7 = this.keys;
- Object[] var8 = this.elements;
- this.hashCodes = new int[1 << var4];
- this.keys = new Object[1 << var4];
- this.elements = new Object[1 << var4];
- this.totalCount = 0;
- if (this.count > 0) {
- this.count = 0;
-
- for(int var1 = 0; var1 < var5.length; ++var1) {
- Object var6 = var7[var1];
- if (var6 != null) {
- int var3 = var5[var1];
- int var2 = this.tableIndexFor(var6, var3);
- this.hashCodes[var2] = var3;
- this.keys[var2] = var6;
- this.elements[var2] = var8[var1];
- ++this.count;
- ++this.totalCount;
- }
- }
- }
-
- }
-
- public void clear() {
- if (this.hashCodes != null) {
- for(int var1 = 0; var1 < this.hashCodes.length; ++var1) {
- this.hashCodes[var1] = 0;
- this.keys[var1] = null;
- this.elements[var1] = null;
- }
-
- this.count = 0;
- this.totalCount = 0;
- }
- }
-
- public String toString() {
- return FormattingSerializer.serializeObject(this);
- }
-
- public void describeClassInfo(ClassInfo var1) {
- var1.addClass("netscape.util.Hashtable", 1);
- var1.addField("keys", (byte)19);
- var1.addField("elements", (byte)19);
- }
-
- public void encode(Encoder var1) throws CodingException {
- if (this.count != 0) {
- Object[] var2 = this.keysArray();
- Object[] var3 = this.elementsArray();
- var1.encodeObjectArray("keys", var2, 0, var2.length);
- var1.encodeObjectArray("elements", var3, 0, var3.length);
- }
- }
-
- public void decode(Decoder var1) throws CodingException {
- Object[] var3 = var1.decodeObjectArray("keys");
- Object[] var4 = var1.decodeObjectArray("elements");
- if (var3 != null && var3.length != 0) {
- this.grow(var3.length);
-
- for(int var2 = 0; var2 < var3.length; ++var2) {
- this.put(var3[var2], var4[var2]);
- }
-
- }
- }
-
- public void finishDecoding() throws CodingException {
- }
- }
-