1 package com.quadcap.util.collections; 2 3 40 41 import java.util.Iterator ; 42 43 import com.quadcap.util.Debug; 44 45 50 public class LongMap { 51 int size = 0; 52 Entry[] entries; 53 Entry freeList; 54 55 58 public LongMap(int initSize) { 59 initSize |= 1; 60 while (!isPrime(initSize)) initSize += 2; 61 entries = new Entry[initSize]; 62 } 63 64 67 public synchronized final Object get(long key) { 68 int h = hash(key); 69 for (Entry entry = entries[h]; entry != null; entry = entry.next) { 70 if (entry.key == key) return entry.val; 71 } 72 return null; 73 } 74 75 78 public synchronized final void put(long key, Object val) { 79 int h = hash(key); 80 for (Entry entry = entries[h]; entry != null; entry = entry.next) { 81 if (entry.key == key) { 82 entry.val = val; 83 return; 84 } 85 } 86 Entry entry = getEntry(key, val); 87 entry.next = entries[h]; 88 entries[h] = entry; 89 } 90 91 94 public synchronized final void remove(long key) { 95 int h = hash(key); 96 Entry prev = null; 97 Entry entry = entries[h]; 98 while (entry != null) { 99 Entry next = entry.next; 100 if (entry.key == key) { 101 if (prev == null) { 102 entries[h] = next; 103 } else { 104 prev.next = next; 105 } 106 freeEntry(entry); 107 return; 108 } 109 prev = entry; 110 entry = next; 111 } 112 } 113 114 public String toString() { 115 StringBuffer sb = new StringBuffer ("{"); 116 LongIterator k = keys(); 117 String delim = ""; 118 while (k.hasNext()) { 119 long v = k.nextLong(); 120 Object d = get(v); 121 sb.append(delim); 122 sb.append(v); 123 sb.append('='); 124 sb.append(String.valueOf(d)); 125 delim = ","; 126 } 127 sb.append("}"); 128 return sb.toString(); 129 } 130 131 132 133 136 public final int size() { return size; } 137 138 public final int buckets() { return entries.length; } 139 140 final Entry getEntry(long key, Object val) { 142 Entry entry = freeList; 143 if (entry == null) { 144 entry = new Entry(); 145 } else { 146 freeList = entry.next; 147 } 148 entry.key = key; 149 entry.val = val; 150 size++; 151 return entry; 152 } 153 154 final void freeEntry(Entry entry) { 155 size--; 156 entry.val = null; 157 entry.next = freeList; 158 freeList = entry; 159 } 160 161 final boolean isPrime(int x) { 162 return IntMap.isPrime(x); 163 } 164 165 public LongIterator keys() { 166 return new LongMapIterator(this); 167 } 168 169 final int hash(long key) { 170 int h = (int)(key % entries.length); 171 if (h < 0) { 172 h = 0 - h; 173 } 174 return h; 175 } 176 177 class Entry { 178 long key; 179 Object val; 180 Entry next; 181 } 182 183 public class LongMapIterator implements LongIterator { 184 LongMap map; 185 int epos = 0; 186 Entry entry = null; 187 Entry last = null; 188 189 public LongMapIterator(LongMap map) { 190 this.map = map; 191 advance(); 192 } 193 194 public boolean hasNext() { 195 return entry != null; 196 } 197 198 void advance() { 199 last = entry; 200 if (entry != null && entry.next != null) { 201 entry = entry.next; 202 } else { 203 entry = null; 204 } 205 while (epos < map.entries.length && entry == null) { 206 entry = map.entries[epos++]; 207 } 208 } 209 210 public Object next() { 211 Long ret = null; 212 if (entry != null) { 213 ret = new Long (entry.key); 214 advance(); 215 } 216 return ret; 217 } 218 219 public long nextLong() { 220 long ret = 0; 221 if (entry != null) { 222 ret = entry.key; 223 advance(); 224 } 225 return ret; 226 } 227 228 public void remove() { 229 if (last != null) { 230 map.remove(last.key); 231 last = null; 232 } 233 } 234 } 235 } 236 | Popular Tags |