javap/src/main/java/org/apidesign/javap/Hashtable.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 12 Dec 2012 20:35:01 +0100
branchbenchmarks
changeset 313 398110b3eee6
parent 150 945817561b9a
child 316 8da329789435
permissions -rw-r--r--
Backed out changeset 5a053b8f40ad: Now when the test finally passed, we can increase the time out again.wq
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@149
     7
/** A JavaScript optimized replacement for Hashtable.
jaroslav@149
     8
 *
jaroslav@149
     9
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@149
    10
 */
jaroslav@149
    11
final class Hashtable {
jaroslav@150
    12
    private Object[] keys;
jaroslav@150
    13
    private Object[] values;
jaroslav@149
    14
jaroslav@149
    15
    Hashtable(int i) {
jaroslav@150
    16
        this();
jaroslav@149
    17
    }
jaroslav@149
    18
jaroslav@149
    19
    Hashtable(int i, double d) {
jaroslav@150
    20
        this();
jaroslav@149
    21
    }
jaroslav@149
    22
jaroslav@149
    23
    Hashtable() {
jaroslav@149
    24
    }
jaroslav@149
    25
jaroslav@150
    26
    synchronized void put(Object key, Object val) {
jaroslav@150
    27
        int[] where = { -1, -1 };
jaroslav@150
    28
        Object found = get(key, where);
jaroslav@150
    29
        if (where[0] != -1) {
jaroslav@150
    30
            // key exists
jaroslav@150
    31
            values[where[0]] = val;
jaroslav@150
    32
        } else {
jaroslav@150
    33
            if (where[1] != -1) {
jaroslav@150
    34
                // null found
jaroslav@150
    35
                keys[where[1]] = key;
jaroslav@150
    36
                values[where[1]] = val;
jaroslav@150
    37
            } else {
jaroslav@150
    38
                if (keys == null) {
jaroslav@150
    39
                    keys = new Object[11];
jaroslav@150
    40
                    values = new Object[11];
jaroslav@150
    41
                    keys[0] = key;
jaroslav@150
    42
                    values[0] = val;
jaroslav@150
    43
                } else {
jaroslav@150
    44
                    Object[] newKeys = new Object[keys.length * 2];
jaroslav@150
    45
                    Object[] newValues = new Object[values.length * 2];
jaroslav@150
    46
                    for (int i = 0; i < keys.length; i++) {
jaroslav@150
    47
                        newKeys[i] = keys[i];
jaroslav@150
    48
                        newValues[i] = values[i];
jaroslav@150
    49
                    }
jaroslav@150
    50
                    newKeys[keys.length] = key;
jaroslav@150
    51
                    newValues[keys.length] = val;
jaroslav@150
    52
                    keys = newKeys;
jaroslav@150
    53
                    values = newValues;
jaroslav@150
    54
                }
jaroslav@150
    55
            }
jaroslav@150
    56
        }
jaroslav@149
    57
    }
jaroslav@149
    58
jaroslav@150
    59
    Object get(Object key) {
jaroslav@150
    60
        return get(key, null);
jaroslav@150
    61
    }
jaroslav@150
    62
    private synchronized Object get(Object key, int[] foundAndNull) {
jaroslav@150
    63
        if (keys == null) {
jaroslav@150
    64
            return null;
jaroslav@150
    65
        }
jaroslav@150
    66
        for (int i = 0; i < keys.length; i++) {
jaroslav@150
    67
            if (keys[i] == null) {
jaroslav@150
    68
                if (foundAndNull != null) {
jaroslav@150
    69
                    foundAndNull[1] = i;
jaroslav@150
    70
                }
jaroslav@150
    71
            } else if (keys[i].equals(key)) {
jaroslav@150
    72
                if (foundAndNull != null) {
jaroslav@150
    73
                    foundAndNull[0] = i;
jaroslav@150
    74
                }
jaroslav@150
    75
                return values[i];
jaroslav@150
    76
            }
jaroslav@150
    77
        }
jaroslav@150
    78
        return null;
jaroslav@149
    79
    }
jaroslav@149
    80
    
jaroslav@149
    81
}