javap/src/main/java/org/apidesign/javap/Hashtable.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 13 Dec 2012 23:20:47 +0100
changeset 316 8da329789435
parent 167 77f7135b6eb1
child 377 1295e596fd35
permissions -rw-r--r--
Providing JavaScript specific implementations of Hashtable and Vector. Those should likely be faster for the JavaScript VM than interpreting bytecode. This is the way to get the best of JavaScript and yet provide reasonably well working implementation in Java.
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@316
    65
        "return self[key];"
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
}