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.MethodBinding; 15 16 public class MethodNameAndTypeCache { 17 public MethodBinding keyTable[]; 18 public int valueTable[]; 19 int elementSize; 20 int threshold; 21 25 public MethodNameAndTypeCache() { 26 this(13); 27 } 28 34 public MethodNameAndTypeCache(int initialCapacity) { 35 this.elementSize = 0; 36 this.threshold = (int) (initialCapacity * 0.66f); 37 this.keyTable = new MethodBinding[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(MethodBinding 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 70 public boolean equalsForNameAndType(MethodBinding method1, MethodBinding method2) { 71 return CharOperation.equals(method1.selector, method2.selector) && CharOperation.equals(method1.signature(), method2.signature()); 72 } 73 79 public int get(MethodBinding key) { 80 int index = hashCode(key), length = keyTable.length; 81 while (keyTable[index] != null) { 82 if (equalsForNameAndType(keyTable[index], key)) 83 return valueTable[index]; 84 if (++index == length) { 85 index = 0; 86 } 87 } 88 return -1; 89 } 90 96 public int hashCode(MethodBinding key) { 97 return CharOperation.hashCode(key.selector) % keyTable.length; 98 } 99 108 public int put(MethodBinding key, int value) { 109 int index = hashCode(key), length = keyTable.length; 110 while (keyTable[index] != null) { 111 if (equalsForNameAndType(keyTable[index], key)) 112 return valueTable[index] = value; 113 if (++index == length) { 114 index = 0; 115 } 116 } 117 keyTable[index] = key; 118 valueTable[index] = value; 119 120 if (++elementSize > threshold) 122 rehash(); 123 return value; 124 } 125 130 private void rehash() { 131 MethodNameAndTypeCache newHashtable = new MethodNameAndTypeCache(keyTable.length * 2); 132 for (int i = keyTable.length; --i >= 0;) 133 if (keyTable[i] != null) 134 newHashtable.put(keyTable[i], valueTable[i]); 135 136 this.keyTable = newHashtable.keyTable; 137 this.valueTable = newHashtable.valueTable; 138 this.threshold = newHashtable.threshold; 139 } 140 145 public int size() { 146 return elementSize; 147 } 148 153 public String toString() { 154 int max = size(); 155 StringBuffer buf = new StringBuffer (); 156 buf.append("{"); for (int i = 0; i < max; ++i) { 158 if (keyTable[i] != null) { 159 buf.append(keyTable[i]).append("->").append(valueTable[i]); } 161 if (i < max) { 162 buf.append(", "); } 164 } 165 buf.append("}"); return buf.toString(); 167 } 168 } 169 | Popular Tags |