javap/src/main/java/org/apidesign/javap/Hashtable.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 24 Dec 2012 08:33:40 +0100
branchexceptions
changeset 378 ccb1544a88bc
parent 377 1295e596fd35
child 395 69db488a2bc6
permissions -rw-r--r--
Fixing license of files that are donated by us
jaroslav@378
     1
/**
jaroslav@378
     2
 * Back 2 Browser Bytecode Translator
jaroslav@378
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@378
     4
 *
jaroslav@378
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@378
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@378
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@378
     8
 *
jaroslav@378
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@378
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@378
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@378
    12
 * GNU General Public License for more details.
jaroslav@378
    13
 *
jaroslav@378
    14
 * You should have received a copy of the GNU General Public License
jaroslav@378
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@378
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@149
    17
 */
jtulach@167
    18
package org.apidesign.javap;
jaroslav@149
    19
jaroslav@316
    20
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@316
    21
jaroslav@149
    22
/** A JavaScript optimized replacement for Hashtable.
jaroslav@149
    23
 *
jaroslav@149
    24
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@149
    25
 */
jaroslav@149
    26
final class Hashtable {
jaroslav@150
    27
    private Object[] keys;
jaroslav@150
    28
    private Object[] values;
jaroslav@149
    29
jaroslav@149
    30
    Hashtable(int i) {
jaroslav@150
    31
        this();
jaroslav@149
    32
    }
jaroslav@149
    33
jaroslav@149
    34
    Hashtable(int i, double d) {
jaroslav@150
    35
        this();
jaroslav@149
    36
    }
jaroslav@149
    37
jaroslav@149
    38
    Hashtable() {
jaroslav@149
    39
    }
jaroslav@149
    40
jaroslav@316
    41
    @JavaScriptBody(args = { "self", "key", "val" }, body = 
jaroslav@316
    42
        "self[key] = val;"
jaroslav@316
    43
    )
jaroslav@150
    44
    synchronized void put(Object key, Object val) {
jaroslav@150
    45
        int[] where = { -1, -1 };
jaroslav@150
    46
        Object found = get(key, where);
jaroslav@150
    47
        if (where[0] != -1) {
jaroslav@150
    48
            // key exists
jaroslav@150
    49
            values[where[0]] = val;
jaroslav@150
    50
        } else {
jaroslav@150
    51
            if (where[1] != -1) {
jaroslav@150
    52
                // null found
jaroslav@150
    53
                keys[where[1]] = key;
jaroslav@150
    54
                values[where[1]] = val;
jaroslav@150
    55
            } else {
jaroslav@150
    56
                if (keys == null) {
jaroslav@150
    57
                    keys = new Object[11];
jaroslav@150
    58
                    values = new Object[11];
jaroslav@150
    59
                    keys[0] = key;
jaroslav@150
    60
                    values[0] = val;
jaroslav@150
    61
                } else {
jaroslav@150
    62
                    Object[] newKeys = new Object[keys.length * 2];
jaroslav@150
    63
                    Object[] newValues = new Object[values.length * 2];
jaroslav@150
    64
                    for (int i = 0; i < keys.length; i++) {
jaroslav@150
    65
                        newKeys[i] = keys[i];
jaroslav@150
    66
                        newValues[i] = values[i];
jaroslav@150
    67
                    }
jaroslav@150
    68
                    newKeys[keys.length] = key;
jaroslav@150
    69
                    newValues[keys.length] = val;
jaroslav@150
    70
                    keys = newKeys;
jaroslav@150
    71
                    values = newValues;
jaroslav@150
    72
                }
jaroslav@150
    73
            }
jaroslav@150
    74
        }
jaroslav@149
    75
    }
jaroslav@149
    76
jaroslav@316
    77
    @JavaScriptBody(args = {"self", "key" }, body = 
jaroslav@377
    78
        "var r = self[key]; return r ? r : null;"
jaroslav@316
    79
    )
jaroslav@150
    80
    Object get(Object key) {
jaroslav@150
    81
        return get(key, null);
jaroslav@150
    82
    }
jaroslav@150
    83
    private synchronized Object get(Object key, int[] foundAndNull) {
jaroslav@150
    84
        if (keys == null) {
jaroslav@150
    85
            return null;
jaroslav@150
    86
        }
jaroslav@150
    87
        for (int i = 0; i < keys.length; i++) {
jaroslav@150
    88
            if (keys[i] == null) {
jaroslav@150
    89
                if (foundAndNull != null) {
jaroslav@150
    90
                    foundAndNull[1] = i;
jaroslav@150
    91
                }
jaroslav@150
    92
            } else if (keys[i].equals(key)) {
jaroslav@150
    93
                if (foundAndNull != null) {
jaroslav@150
    94
                    foundAndNull[0] = i;
jaroslav@150
    95
                }
jaroslav@150
    96
                return values[i];
jaroslav@150
    97
            }
jaroslav@150
    98
        }
jaroslav@150
    99
        return null;
jaroslav@149
   100
    }
jaroslav@149
   101
    
jaroslav@149
   102
}