javap/src/main/java/org/apidesign/javap/Hashtable.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 24 Dec 2012 08:30:20 +0100
branchexceptions
changeset 377 1295e596fd35
parent 316 8da329789435
child 378 ccb1544a88bc
permissions -rw-r--r--
Need to return null for unknown keys
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
}