e4995d5b9cbf42c363437880031290722eb96bd2
[jalviewjs.git] / site / j2s / java / util / Hashtable.js
1 \r
2 // modified by Bob Hanson 3/21/2014 6:44:21 AM  to reduce this.b$[....] phrases to simply this.h$\r
3 // BH added ability to use a non-Java key for HTML elements, for example.\r
4 // BH 8/24/2014 8:48:58 PM all synchronization and inner classes removed\r
5 \r
6 \r
7 Clazz.load([],"java.util.HashtableIterator",[],function(){\r
8 c$=Clazz.decorateAsClass(function(){\r
9 this.position=0;\r
10 this.expectedModCount=0;\r
11 this.type=null;\r
12 this.lastEntry=null;\r
13 this.lastPosition=0;\r
14 this.canRemove=false;\r
15 Clazz.instantialize(this,arguments);\r
16 },java.util,"HashtableIterator",null,java.util.Iterator);\r
17 Clazz.makeConstructor(c$,\r
18 function(a){\r
19 this.type=a;\r
20 this.h$ = a.h$;\r
21 this.position=this.h$.lastSlot;\r
22 this.expectedModCount=this.h$.modCount;\r
23 },"java.util.AbstractSet");\r
24 Clazz.overrideMethod(c$,"hasNext",\r
25 function(){\r
26 if(this.lastEntry&&this.lastEntry.next){\r
27 return true;\r
28 }while(this.position>=this.h$.firstSlot){\r
29 if(this.h$.elementData[this.position]==null){\r
30 this.position--;\r
31 }else{\r
32 return true;\r
33 }}\r
34 return false;\r
35 });\r
36 Clazz.overrideMethod(c$,"next",\r
37 function(){\r
38 if(this.expectedModCount==this.h$.modCount){\r
39 if(this.lastEntry){\r
40 this.lastEntry=this.lastEntry.next;\r
41 }if(this.lastEntry==null){\r
42 while(this.position>=this.h$.firstSlot&&(this.lastEntry=this.h$.elementData[this.position])==null){\r
43 this.position--;\r
44 }\r
45 if(this.lastEntry){\r
46 this.lastPosition=this.position;\r
47 this.position--;\r
48 }}if(this.lastEntry){\r
49 this.canRemove=true;\r
50 return this.type.get(this.lastEntry);\r
51 }throw new java.util.NoSuchElementException();\r
52 }throw new java.util.ConcurrentModificationException();\r
53 });\r
54 Clazz.overrideMethod(c$,"remove",\r
55 function(){\r
56 if(this.expectedModCount==this.h$.modCount){\r
57 if(this.canRemove){\r
58 this.canRemove=false;\r
59 {\r
60 var a=false;\r
61 var b=this.h$.elementData[this.lastPosition];\r
62 if(b===this.lastEntry){\r
63 this.h$.elementData[this.lastPosition]=b.next;\r
64 a=true;\r
65 }else{\r
66 while(b&&b.next!==this.lastEntry){\r
67 b=b.next;\r
68 }\r
69 if(b){\r
70 b.next=this.lastEntry.next;\r
71 a=true;\r
72 }}if(a){\r
73 this.h$.modCount++;\r
74 this.h$.elementCount--;\r
75 this.expectedModCount++;\r
76 return;\r
77 }}}else{\r
78 throw new IllegalStateException();\r
79 }}throw new java.util.ConcurrentModificationException();\r
80 });\r
81 });\r
82 \r
83 \r
84 \r
85 ////////////////////////////\r
86 \r
87 \r
88 Clazz.load([],"java.util.HashtableEnumerator",[],function(){\r
89 c$=Clazz.decorateAsClass(function(){\r
90 this.key=false;\r
91 this.start=0;\r
92 this.entry=null;\r
93 Clazz.instantialize(this,arguments);\r
94 },java.util,"HashtableEnumerator",null,java.util.Enumeration);\r
95 \r
96 Clazz.makeConstructor(c$,\r
97 function(a, b){\r
98 this.key = a;\r
99 this.h$ = b;\r
100 if (this.h$)this.start=this.h$.lastSlot+1;\r
101 },"~B,java.util.Hashtable");\r
102 Clazz.overrideMethod(c$,"hasMoreElements",\r
103 function(){\r
104 if (!this.h$)return false;\r
105 if(this.entry)return true;\r
106 \r
107 while(--this.start>=this.h$.firstSlot){\r
108 if(this.h$.elementData[this.start]){\r
109 this.entry=this.h$.elementData[this.start];\r
110 return true;\r
111 }}\r
112 return false;\r
113 });\r
114 Clazz.overrideMethod(c$,"nextElement",\r
115 function(){\r
116 if(this.hasMoreElements()){\r
117 var a=this.key?this.entry.key:this.entry.value;\r
118 this.entry=this.entry.next;\r
119 return a;\r
120 }\r
121 throw new java.util.NoSuchElementException();\r
122 });\r
123 });\r
124 \r
125 ////////////////////////////\r
126 \r
127 Clazz.load([],"java.util.HashtableEntrySet",[],function(){\r
128 c$=Clazz.decorateAsClass(function(){\r
129 Clazz.instantialize(this,arguments);\r
130 },java.util,"HashtableEntrySet",java.util.AbstractSet);\r
131 \r
132 Clazz.makeConstructor(c$,\r
133 function(a){\r
134 this.h$ = a;\r
135 },"java.util.Hashtable");\r
136 Clazz.overrideMethod(c$,"size",\r
137 function(){\r
138 return this.h$.elementCount;\r
139 });\r
140 Clazz.overrideMethod(c$,"clear",\r
141 function(){\r
142 this.h$.clear();\r
143 });\r
144 Clazz.overrideMethod(c$,"remove",\r
145 function(object){\r
146 if(this.contains(object)){\r
147 this.h$.remove((object).getKey());\r
148 return true;\r
149 }return false;\r
150 },"~O");\r
151 Clazz.defineMethod(c$,"contains",\r
152 function(object){\r
153 var entry=this.h$.getEntry((object).getKey());\r
154 return object.equals(entry);\r
155 },"~O");\r
156 \r
157 Clazz.overrideMethod(c$,"get",\r
158 function(entry){\r
159 return entry;\r
160 },"java.util.MapEntry");\r
161 \r
162 Clazz.defineMethod(c$,"iterator",\r
163 function(){\r
164 return new java.util.HashtableIterator(this);\r
165 });\r
166 });\r
167 \r
168 \r
169 ////////////////////////////\r
170 \r
171 Clazz.load([],"java.util.HashtableKeySet",[],function(){\r
172 c$=Clazz.decorateAsClass(function(){\r
173 Clazz.instantialize(this,arguments);\r
174 },java.util,"HashtableKeySet",java.util.AbstractSet);\r
175 \r
176 Clazz.makeConstructor(c$,\r
177 function(a){\r
178 this.h$ = a;\r
179 },"java.util.Hashtable");\r
180 \r
181 Clazz.overrideMethod(c$,"contains",\r
182 function(object){\r
183 return this.h$.containsKey(object);\r
184 },"~O");\r
185 Clazz.overrideMethod(c$,"size",\r
186 function(){\r
187 return this.h$.elementCount;\r
188 });\r
189 Clazz.overrideMethod(c$,"clear",\r
190 function(){\r
191 this.h$.clear();\r
192 });\r
193 Clazz.overrideMethod(c$,"remove",\r
194 function(key){\r
195 if(this.h$.containsKey(key)){\r
196 this.h$.remove(key);\r
197 return true;\r
198 }return false;\r
199 },"~O");\r
200 \r
201 Clazz.overrideMethod(c$,"get",\r
202 function(entry){\r
203 return entry.key;\r
204 },"java.util.MapEntry");\r
205 \r
206 Clazz.overrideMethod(c$,"iterator",\r
207 function(){\r
208 return new java.util.HashtableIterator(this);\r
209 });\r
210 });\r
211 \r
212 ////////////////////////////\r
213 \r
214 Clazz.load([],"java.util.HashtableValueCollection",[],function(){\r
215 c$=Clazz.decorateAsClass(function(){\r
216 Clazz.instantialize(this,arguments);\r
217 },java.util,"HashtableValueCollection",null,java.util.AbstractCollection);\r
218 \r
219 Clazz.makeConstructor(c$,\r
220 function(a){\r
221 this.h$ = a;\r
222 },"java.util.Hashtable");\r
223 Clazz.overrideMethod(c$,"contains",\r
224 function(object){\r
225 return this.h$.contains(object);\r
226 },"~O");\r
227 Clazz.overrideMethod(c$,"size",\r
228 function(){\r
229 return this.h$.elementCount;\r
230 });\r
231 Clazz.overrideMethod(c$,"clear",\r
232 function(){\r
233 this.h$.clear();\r
234 });\r
235 \r
236 Clazz.overrideMethod(c$,"get",\r
237 function(entry){\r
238 return entry.value;\r
239 },"java.util.MapEntry");\r
240 \r
241 Clazz.overrideMethod(c$,"iterator",\r
242 function(){\r
243 return new java.util.HashtableIterator(this);\r
244 });\r
245 });\r
246 ////////////////////////////\r
247 \r
248 \r
249 Clazz.load(["java.util.MapEntry"],"java.util.HashtableEntry",[],function(){\r
250 c$=Clazz.decorateAsClass(function(){\r
251 this.next=null;\r
252 this.hashcode=0;\r
253 Clazz.instantialize(this,arguments);\r
254 },java.util,"HashtableEntry",java.util.MapEntry);\r
255 Clazz.overrideConstructor(c$,\r
256 function(a,b){\r
257 this.key = a;\r
258 this.value = b;\r
259 this.hashcode=a.hashCode();\r
260 });\r
261 Clazz.defineMethod(c$,"clone",\r
262 function(){\r
263 var a=Clazz.superCall(this,java.util.HashtableEntry,"clone",[]);\r
264 if(this.next!=null){\r
265 a.next=this.next.clone();\r
266 }\r
267 return a;\r
268 });\r
269 Clazz.overrideMethod(c$,"setValue",\r
270 function(a){\r
271 if(a==null){\r
272 throw new NullPointerException();\r
273 }var b=this.value;\r
274 this.value=a;\r
275 return b;\r
276 },"~O");\r
277 Clazz.defineMethod(c$,"getKeyHash",\r
278 function(){\r
279 return this.key.hashCode();\r
280 });\r
281 Clazz.defineMethod(c$,"equalsKey",\r
282 function(a,b){\r
283 return this.hashcode==(!a.hashCode || a.hashCode())&&this.key.equals(a);\r
284 },"~O,~N");\r
285 Clazz.overrideMethod(c$,"toString",\r
286 function(){\r
287 return this.key+"="+this.value;\r
288 });\r
289 });\r
290 \r
291 \r
292 \r
293 ////////////////////////////\r
294 \r
295 \r
296 Clazz.load(["java.util.Dictionary","$.Enumeration","$.HashtableEnumerator","$.Iterator","$.Map","$.MapEntry","$.NoSuchElementException"],"java.util.Hashtable",["java.lang.IllegalArgumentException","$.IllegalStateException","$.NullPointerException","$.StringBuilder","java.util.AbstractCollection","$.AbstractSet","$.Arrays","$.Collections","$.ConcurrentModificationException","java.util.MapEntry.Type","java.util.HashtableEntry"],function(){\r
297 c$=Clazz.decorateAsClass(function(){\r
298 this.elementCount=0;\r
299 this.elementData=null;\r
300 this.loadFactor=0;\r
301 this.threshold=0;\r
302 this.firstSlot=0;\r
303 this.lastSlot=-1;\r
304 this.modCount=0;\r
305 Clazz.instantialize(this,arguments);\r
306 },java.util,"Hashtable",java.util.Dictionary,[java.util.Map,Cloneable,java.io.Serializable]);   \r
307 c$.newEntry=Clazz.defineMethod(c$,"newEntry",\r
308 ($fz=function(key,value,hash){\r
309 return new java.util.HashtableEntry(key,value);\r
310 },$fz.isPrivate=true,$fz),"~O,~O,~N");\r
311 Clazz.overrideConstructor(c$,\r
312 function(){\r
313 this.elementCount=0;\r
314 this.elementData=this.newElementArray(11);\r
315 this.firstSlot=this.elementData.length;\r
316 this.loadFactor=0.75;\r
317 this.computeMaxSize();\r
318 });\r
319 Clazz.defineMethod(c$,"newElementArray",\r
320 ($fz=function(size){\r
321 return new Array(size);\r
322 },$fz.isPrivate=true,$fz),"~N");\r
323 Clazz.overrideMethod(c$,"clear",\r
324 function(){\r
325 this.elementCount=0;\r
326 for (var i = this.elementData.length; --i >= 0;)\r
327           this.elementData[i] = null;\r
328 this.modCount++;\r
329 });\r
330 Clazz.defineMethod(c$,"clone",\r
331 function(){\r
332 try{\r
333 var hashtable=Clazz.superCall(this,java.util.Hashtable,"clone",[]);\r
334 hashtable.elementData=this.elementData.clone();\r
335 var entry;\r
336 for(var i=this.elementData.length;--i>=0;){\r
337 if((entry=this.elementData[i])){\r
338 hashtable.elementData[i]=entry.clone();\r
339 }}\r
340 return hashtable;\r
341 }catch(e){\r
342 if(Clazz.instanceOf(e,CloneNotSupportedException)){\r
343 return null;\r
344 }else{\r
345 throw e;\r
346 }\r
347 }\r
348 });\r
349 Clazz.defineMethod(c$,"computeMaxSize",\r
350 ($fz=function(){\r
351 this.threshold=Math.round((this.elementData.length*this.loadFactor));\r
352 },$fz.isPrivate=true,$fz));\r
353 Clazz.defineMethod(c$,"contains",\r
354 function(value){\r
355 if(value==null){\r
356 throw new NullPointerException();\r
357 }for(var i=this.elementData.length;--i>=0;){\r
358 var entry=this.elementData[i];\r
359 while(entry){\r
360 if(value.equals(entry.value)){\r
361 return true;\r
362 }entry=entry.next;\r
363 }\r
364 }\r
365 return false;\r
366 },"~O");\r
367 Clazz.overrideMethod(c$,"containsKey",\r
368 function(key){\r
369         if(!key.hashCode)  {\r
370           key.hashCode = function(){return 1};\r
371           if (!key.equals)\r
372                 key.equals = function(a) {return this == a};\r
373         }\r
374 return this.getEntry(key)!=null ;\r
375 },"~O");\r
376 Clazz.overrideMethod(c$,"containsValue",\r
377 function(value){\r
378 return this.contains(value);\r
379 },"~O");\r
380 Clazz.overrideMethod(c$,"elements",\r
381 function(){\r
382 if(this.elementCount==0){\r
383 return java.util.Hashtable.EMPTY_ENUMERATION;\r
384 }\r
385 return new java.util.HashtableEnumerator(false, this);\r
386 });\r
387 Clazz.overrideMethod(c$,"entrySet",\r
388 function(){\r
389 return new java.util.HashtableEntrySet(this);\r
390 });\r
391 Clazz.overrideMethod(c$,"equals",\r
392 function(object){\r
393 if(this===object){\r
394 return true;\r
395 }if(Clazz.instanceOf(object,java.util.Map)){\r
396 var map=object;\r
397 if(this.size()!=map.size()){\r
398 return false;\r
399 }var entries=this.entrySet();\r
400 for(var e,$e=map.entrySet().iterator();$e.hasNext()&&((e=$e.next())||true);){\r
401 if(!entries.contains(e)){\r
402 return false;\r
403 }}\r
404 return true;\r
405 }return false;\r
406 },"~O");\r
407 Clazz.overrideMethod(c$,"get",\r
408 function(key){\r
409         if(!key.hashCode) { \r
410           key.hashCode = function(){return 1};\r
411         if (!key.equals)\r
412                 key.equals = function(a) {return this == a};\r
413         }\r
414 var hash=key.hashCode();\r
415 var index=(hash&0x7FFFFFFF)%this.elementData.length;\r
416 var entry=this.elementData[index];\r
417 while(entry){\r
418 if(entry.equalsKey(key,hash)){\r
419 return entry.value;\r
420 }entry=entry.next;\r
421 }\r
422 return null;\r
423 },"~O");\r
424 Clazz.defineMethod(c$,"getEntry",\r
425 function(key){\r
426 var hash=key.hashCode();\r
427 var index=(hash&0x7FFFFFFF)%this.elementData.length;\r
428 var entry=this.elementData[index];\r
429 while(entry){\r
430 if(entry.equalsKey(key,hash)){\r
431 return entry;\r
432 }entry=entry.next;\r
433 }\r
434 return null;\r
435 },"~O");\r
436 Clazz.overrideMethod(c$,"hashCode",\r
437 function(){\r
438 var result=0;\r
439 var it=this.entrySet().iterator();\r
440 while(it.hasNext()){\r
441 var entry=it.next();\r
442 var key=entry.getKey();\r
443 var value=entry.getValue();\r
444 var hash=(key!==this?key.hashCode():0)^(value!==this?(value!=null?value.hashCode():0):0);\r
445 result+=hash;\r
446 }\r
447 return result;\r
448 });\r
449 Clazz.overrideMethod(c$,"isEmpty",\r
450 function(){\r
451 return this.elementCount==0;\r
452 });\r
453 Clazz.overrideMethod(c$,"keys",\r
454 function(){\r
455 if(this.elementCount==0){\r
456 return java.util.Hashtable.EMPTY_ENUMERATION;\r
457 }\r
458 return new java.util.HashtableEnumerator(true, this); \r
459 });\r
460 Clazz.overrideMethod(c$,"keySet",\r
461 function(){\r
462 return new java.util.HashtableKeySet(this);\r
463 });\r
464 Clazz.overrideMethod(c$,"put",\r
465 function(key,value){\r
466 if(key!=null&&value!=null){\r
467         if(!key.hashCode)  {\r
468           key.hashCode = function(){return 1};\r
469           if (!key.equals)\r
470                 key.equals = function(a) {return this == a};\r
471         }\r
472         var hash=key.hashCode();\r
473         var index=(hash&0x7FFFFFFF)%this.elementData.length;\r
474         var entry=this.elementData[index];\r
475         while(entry!=null&&!entry.equalsKey(key,hash)){\r
476         entry=entry.next;\r
477 }\r
478 if(entry==null){\r
479 this.modCount++;\r
480 if(++this.elementCount>this.threshold){\r
481 this.rehash();\r
482 index=(hash&0x7FFFFFFF)%this.elementData.length;\r
483 }if(index<this.firstSlot){\r
484 this.firstSlot=index;\r
485 }if(index>this.lastSlot){\r
486 this.lastSlot=index;\r
487 }\r
488 \r
489 entry=java.util.Hashtable.newEntry(key,value,hash);\r
490 entry.next=this.elementData[index];\r
491 this.elementData[index]=entry;\r
492 return null;\r
493 }var result=entry.value;\r
494 entry.value=value;\r
495 return result;\r
496 }throw new NullPointerException();\r
497 },"~O,~O");\r
498 Clazz.overrideMethod(c$,"putAll",\r
499 function(map){\r
500 for(var entry,$entry=map.entrySet().iterator();$entry.hasNext()&&((entry=$entry.next())||true);){\r
501 this.put(entry.getKey(),entry.getValue());\r
502 }\r
503 },"java.util.Map");\r
504 \r
505 Clazz.defineMethod(c$,"rehash",\r
506 function(){\r
507 var length=(this.elementData.length<<1)+1;\r
508 if(length==0){\r
509 length=1;\r
510 }var newFirst=length;\r
511 var newLast=-1;\r
512 var newData=this.newElementArray(length);\r
513 for(var i=this.lastSlot+1;--i>=this.firstSlot;){\r
514 var entry=this.elementData[i];\r
515 while(entry!=null){\r
516 var index=(entry.getKeyHash()&0x7FFFFFFF)%length;\r
517 if(index<newFirst){\r
518 newFirst=index;\r
519 }if(index>newLast){\r
520 newLast=index;\r
521 }var next=entry.next;\r
522 entry.next=newData[index];\r
523 newData[index]=entry;\r
524 entry=next;\r
525 }\r
526 }\r
527 this.firstSlot=newFirst;\r
528 this.lastSlot=newLast;\r
529 this.elementData=newData;\r
530 this.computeMaxSize();\r
531 });\r
532 Clazz.overrideMethod(c$,"remove",\r
533 function(key){\r
534 var hash=key.hashCode();\r
535 var index=(hash&0x7FFFFFFF)%this.elementData.length;\r
536 var last=null;\r
537 var entry=this.elementData[index];\r
538 while(entry!=null&&!entry.equalsKey(key,hash)){\r
539 last=entry;\r
540 entry=entry.next;\r
541 }\r
542 if(entry!=null){\r
543 this.modCount++;\r
544 if(last==null){\r
545 this.elementData[index]=entry.next;\r
546 }else{\r
547 last.next=entry.next;\r
548 }this.elementCount--;\r
549 var result=entry.value;\r
550 entry.value=null;\r
551 return result;\r
552 }return null;\r
553 },"~O");\r
554 Clazz.overrideMethod(c$,"size",\r
555 function(){\r
556 return this.elementCount;\r
557 });\r
558 Clazz.overrideMethod(c$,"toString",\r
559 function(){\r
560 if(this.isEmpty()){\r
561 return"{}";\r
562 }var buffer=new StringBuilder(this.size()*28);\r
563 buffer.append('{');\r
564 for(var i=this.lastSlot;i>=this.firstSlot;i--){\r
565 var entry=this.elementData[i];\r
566 while(entry!=null){\r
567 if(entry.key!==this){\r
568 buffer.append(entry.key);\r
569 }else{\r
570 buffer.append("(this Map)");\r
571 }buffer.append('=');\r
572 if(entry.value!==this){\r
573 buffer.append(entry.value);\r
574 }else{\r
575 buffer.append("(this Map)");\r
576 }buffer.append(", ");\r
577 entry=entry.next;\r
578 }\r
579 }\r
580 if(this.elementCount>0){\r
581 buffer.setLength(buffer.length()-2);\r
582 }buffer.append('}');\r
583 return buffer.toString();\r
584 });\r
585 Clazz.overrideMethod(c$,"values",\r
586 function(){\r
587 return new java.util.HashtableValueCollection(this);\r
588 });\r
589 java.util.Hashtable.EMPTY_ENUMERATION = new java.util.HashtableEnumerator();\r
590 });\r