1 11 package org.eclipse.jdt.internal.compiler.codegen; 12 13 import org.eclipse.jdt.core.compiler.CharOperation; 14 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; 15 16 public class FieldNameAndTypeCache { 17 public FieldBinding keyTable[]; 18 public int valueTable[]; 19 int elementSize; 20 int threshold; 21 25 public FieldNameAndTypeCache() { 26 this(13); 27 } 28 34 public FieldNameAndTypeCache(int initialCapacity) { 35 this.elementSize = 0; 36 this.threshold = (int) (initialCapacity * 0.66f); 37 this.keyTable = new FieldBinding[initialCapacity]; 38 this.valueTable = new int[initialCapacity]; 39 } 40 43 public void clear() { 44 for (int i = keyTable.length; --i >= 0;) { 45 keyTable[i] = null; 46 valueTable[i] = 0; 47 } 48 elementSize = 0; 49 } 50 55 public boolean containsKey(FieldBinding key) { 56 int index = hashCode(key), length = keyTable.length; 57 while (keyTable[index] != null) { 58 if (equalsForNameAndType(keyTable[index], key)) 59 return true; 60 if (++index == length) { 61 index = 0; 62 } 63 } 64 return false; 65 } 66 69 public boolean equalsForNameAndType(FieldBinding field1, FieldBinding field2) { 70 return ((field1.type == field2.type) && CharOperation.equals(field1.name, field2.name)); 71 } 72 78 public int get(FieldBinding key) { 79 int index = hashCode(key), length = keyTable.length; 80 while (keyTable[index] != null) { 81 if (equalsForNameAndType(keyTable[index], key)) 82 return valueTable[index]; 83 if (++index == length) { 84 index = 0; 85 } 86 } 87 return -1; 88 } 89 95 public int hashCode(FieldBinding key) { 96 return ((CharOperation.hashCode(key.name) + key.type.hashCode()) & 0x7FFFFFFF) % keyTable.length; 97 } 98 107 public int put(FieldBinding key, int value) { 108 int index = hashCode(key), length = keyTable.length; 109 while (keyTable[index] != null) { 110 if (equalsForNameAndType(keyTable[index], key)) 111 return valueTable[index] = value; 112 if (++index == length) { 113 index = 0; 114 } 115 } 116 keyTable[index] = key; 117 valueTable[index] = value; 118 119 if (++elementSize > threshold) 121 rehash(); 122 return value; 123 } 124 129 private void rehash() { 130 FieldNameAndTypeCache newHashtable = new FieldNameAndTypeCache(keyTable.length * 2); 131 for (int i = keyTable.length; --i >= 0;) 132 if (keyTable[i] != null) 133 newHashtable.put(keyTable[i], valueTable[i]); 134 135 this.keyTable = newHashtable.keyTable; 136 this.valueTable = newHashtable.valueTable; 137 this.threshold = newHashtable.threshold; 138 } 139 144 public int size() { 145 return elementSize; 146 } 147 152 public String toString() { 153 int max = size(); 154 StringBuffer buf = new StringBuffer (); 155 buf.append("{"); for (int i = 0; i < max; ++i) { 157 if (keyTable[i] != null) { 158 buf.append(keyTable[i]).append("->").append(valueTable[i]); } 160 if (i < max) { 161 buf.append(", "); } 163 } 164 buf.append("}"); return buf.toString(); 166 } 167 } 168 | Popular Tags |