jaroslav@149
|
1 |
/*
|
jaroslav@149
|
2 |
* To change this template, choose Tools | Templates
|
jaroslav@149
|
3 |
* and open the template in the editor.
|
jaroslav@149
|
4 |
*/
|
jtulach@167
|
5 |
package org.apidesign.javap;
|
jaroslav@149
|
6 |
|
jaroslav@316
|
7 |
import org.apidesign.bck2brwsr.core.JavaScriptBody;
|
jaroslav@316
|
8 |
|
jaroslav@149
|
9 |
/** A JavaScript optimized replacement for Hashtable.
|
jaroslav@149
|
10 |
*
|
jaroslav@149
|
11 |
* @author Jaroslav Tulach <jtulach@netbeans.org>
|
jaroslav@149
|
12 |
*/
|
jaroslav@149
|
13 |
final class Hashtable {
|
jaroslav@150
|
14 |
private Object[] keys;
|
jaroslav@150
|
15 |
private Object[] values;
|
jaroslav@149
|
16 |
|
jaroslav@149
|
17 |
Hashtable(int i) {
|
jaroslav@150
|
18 |
this();
|
jaroslav@149
|
19 |
}
|
jaroslav@149
|
20 |
|
jaroslav@149
|
21 |
Hashtable(int i, double d) {
|
jaroslav@150
|
22 |
this();
|
jaroslav@149
|
23 |
}
|
jaroslav@149
|
24 |
|
jaroslav@149
|
25 |
Hashtable() {
|
jaroslav@149
|
26 |
}
|
jaroslav@149
|
27 |
|
jaroslav@316
|
28 |
@JavaScriptBody(args = { "self", "key", "val" }, body =
|
jaroslav@316
|
29 |
"self[key] = val;"
|
jaroslav@316
|
30 |
)
|
jaroslav@150
|
31 |
synchronized void put(Object key, Object val) {
|
jaroslav@150
|
32 |
int[] where = { -1, -1 };
|
jaroslav@150
|
33 |
Object found = get(key, where);
|
jaroslav@150
|
34 |
if (where[0] != -1) {
|
jaroslav@150
|
35 |
// key exists
|
jaroslav@150
|
36 |
values[where[0]] = val;
|
jaroslav@150
|
37 |
} else {
|
jaroslav@150
|
38 |
if (where[1] != -1) {
|
jaroslav@150
|
39 |
// null found
|
jaroslav@150
|
40 |
keys[where[1]] = key;
|
jaroslav@150
|
41 |
values[where[1]] = val;
|
jaroslav@150
|
42 |
} else {
|
jaroslav@150
|
43 |
if (keys == null) {
|
jaroslav@150
|
44 |
keys = new Object[11];
|
jaroslav@150
|
45 |
values = new Object[11];
|
jaroslav@150
|
46 |
keys[0] = key;
|
jaroslav@150
|
47 |
values[0] = val;
|
jaroslav@150
|
48 |
} else {
|
jaroslav@150
|
49 |
Object[] newKeys = new Object[keys.length * 2];
|
jaroslav@150
|
50 |
Object[] newValues = new Object[values.length * 2];
|
jaroslav@150
|
51 |
for (int i = 0; i < keys.length; i++) {
|
jaroslav@150
|
52 |
newKeys[i] = keys[i];
|
jaroslav@150
|
53 |
newValues[i] = values[i];
|
jaroslav@150
|
54 |
}
|
jaroslav@150
|
55 |
newKeys[keys.length] = key;
|
jaroslav@150
|
56 |
newValues[keys.length] = val;
|
jaroslav@150
|
57 |
keys = newKeys;
|
jaroslav@150
|
58 |
values = newValues;
|
jaroslav@150
|
59 |
}
|
jaroslav@150
|
60 |
}
|
jaroslav@150
|
61 |
}
|
jaroslav@149
|
62 |
}
|
jaroslav@149
|
63 |
|
jaroslav@316
|
64 |
@JavaScriptBody(args = {"self", "key" }, body =
|
jaroslav@377
|
65 |
"var r = self[key]; return r ? r : null;"
|
jaroslav@316
|
66 |
)
|
jaroslav@150
|
67 |
Object get(Object key) {
|
jaroslav@150
|
68 |
return get(key, null);
|
jaroslav@150
|
69 |
}
|
jaroslav@150
|
70 |
private synchronized Object get(Object key, int[] foundAndNull) {
|
jaroslav@150
|
71 |
if (keys == null) {
|
jaroslav@150
|
72 |
return null;
|
jaroslav@150
|
73 |
}
|
jaroslav@150
|
74 |
for (int i = 0; i < keys.length; i++) {
|
jaroslav@150
|
75 |
if (keys[i] == null) {
|
jaroslav@150
|
76 |
if (foundAndNull != null) {
|
jaroslav@150
|
77 |
foundAndNull[1] = i;
|
jaroslav@150
|
78 |
}
|
jaroslav@150
|
79 |
} else if (keys[i].equals(key)) {
|
jaroslav@150
|
80 |
if (foundAndNull != null) {
|
jaroslav@150
|
81 |
foundAndNull[0] = i;
|
jaroslav@150
|
82 |
}
|
jaroslav@150
|
83 |
return values[i];
|
jaroslav@150
|
84 |
}
|
jaroslav@150
|
85 |
}
|
jaroslav@150
|
86 |
return null;
|
jaroslav@149
|
87 |
}
|
jaroslav@149
|
88 |
|
jaroslav@149
|
89 |
}
|