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