1 34 package smallsql.database; 35 36 39 class StorePageMap { 40 41 42 43 46 private Entry[] table; 47 48 51 private int size; 52 53 57 private int threshold; 58 59 60 61 62 63 67 StorePageMap() { 68 threshold = 12; 69 table = new Entry[17]; 70 } 71 72 73 74 75 76 77 82 final int size() { 83 return size; 84 } 85 86 91 final boolean isEmpty() { 92 return size == 0; 93 } 94 95 98 final TableStorePage get(long key) { 99 int i = (int)(key % table.length); 100 Entry e = table[i]; 101 while (true) { 102 if (e == null) 103 return null; 104 if (e.key == key) 105 return e.value; 106 e = e.next; 107 } 108 } 109 110 115 final boolean containsKey(long key) { 116 return (get(key) != null); 117 } 118 119 120 126 final TableStorePage add(long key, TableStorePage value) { 127 int i = (int)(key % table.length); 128 129 table[i] = new Entry(key, value, table[i]); 130 if (size++ >= threshold) 131 resize(2 * table.length); 132 return null; 133 } 134 135 136 150 final private void resize(int newCapacity) { 151 152 Entry[] newTable = new Entry[newCapacity]; 153 transfer(newTable); 154 table = newTable; 155 threshold = (int)(newCapacity * 0.75f); 156 } 157 158 161 final private void transfer(Entry[] newTable) { 162 Entry[] src = table; 163 int newCapacity = newTable.length; 164 for (int j = 0; j < src.length; j++) { 165 Entry e = src[j]; 166 if (e != null) { 167 src[j] = null; 168 do { 169 Entry next = e.next; 170 e.next = null; 171 int i = (int)(e.key % newCapacity); 172 if(newTable[i] == null){ 175 newTable[i] = e; 176 }else{ 177 Entry entry = newTable[i]; 178 while(entry.next != null) entry = entry.next; 179 entry.next = e; 180 } 181 e = next; 182 } while (e != null); 183 } 184 } 185 } 186 187 188 197 final TableStorePage remove(long key) { 198 int i = (int)(key % table.length); 199 Entry prev = table[i]; 200 Entry e = prev; 201 202 while (e != null) { 203 Entry next = e.next; 204 if (e.key == key) { 205 size--; 206 if (prev == e) 207 table[i] = next; 208 else 209 prev.next = next; 210 return e.value; 211 } 212 prev = e; 213 e = next; 214 } 215 return null; 216 } 217 218 219 222 final void clear() { 223 Entry tab[] = table; 224 for (int i = 0; i < tab.length; i++) 225 tab[i] = null; 226 size = 0; 227 } 228 229 237 final boolean containsValue(TableStorePage value) { 238 Entry tab[] = table; 239 for (int i = 0; i < tab.length ; i++) 240 for (Entry e = tab[i] ; e != null ; e = e.next) 241 if (value.equals(e.value)) 242 return true; 243 return false; 244 } 245 246 247 248 static class Entry{ 249 final long key; 250 final TableStorePage value; 251 Entry next; 252 253 256 Entry(long k, TableStorePage v, Entry n) { 257 value = v; 258 next = n; 259 key = k; 260 } 261 262 263 } 264 265 266 } 267 | Popular Tags |