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
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package org.apidesign.javap;
     6 
     7 import org.apidesign.bck2brwsr.core.JavaScriptBody;
     8 
     9 /** A JavaScript optimized replacement for Hashtable.
    10  *
    11  * @author Jaroslav Tulach <jtulach@netbeans.org>
    12  */
    13 final class Hashtable {
    14     private Object[] keys;
    15     private Object[] values;
    16 
    17     Hashtable(int i) {
    18         this();
    19     }
    20 
    21     Hashtable(int i, double d) {
    22         this();
    23     }
    24 
    25     Hashtable() {
    26     }
    27 
    28     @JavaScriptBody(args = { "self", "key", "val" }, body = 
    29         "self[key] = val;"
    30     )
    31     synchronized void put(Object key, Object val) {
    32         int[] where = { -1, -1 };
    33         Object found = get(key, where);
    34         if (where[0] != -1) {
    35             // key exists
    36             values[where[0]] = val;
    37         } else {
    38             if (where[1] != -1) {
    39                 // null found
    40                 keys[where[1]] = key;
    41                 values[where[1]] = val;
    42             } else {
    43                 if (keys == null) {
    44                     keys = new Object[11];
    45                     values = new Object[11];
    46                     keys[0] = key;
    47                     values[0] = val;
    48                 } else {
    49                     Object[] newKeys = new Object[keys.length * 2];
    50                     Object[] newValues = new Object[values.length * 2];
    51                     for (int i = 0; i < keys.length; i++) {
    52                         newKeys[i] = keys[i];
    53                         newValues[i] = values[i];
    54                     }
    55                     newKeys[keys.length] = key;
    56                     newValues[keys.length] = val;
    57                     keys = newKeys;
    58                     values = newValues;
    59                 }
    60             }
    61         }
    62     }
    63 
    64     @JavaScriptBody(args = {"self", "key" }, body = 
    65         "var r = self[key]; return r ? r : null;"
    66     )
    67     Object get(Object key) {
    68         return get(key, null);
    69     }
    70     private synchronized Object get(Object key, int[] foundAndNull) {
    71         if (keys == null) {
    72             return null;
    73         }
    74         for (int i = 0; i < keys.length; i++) {
    75             if (keys[i] == null) {
    76                 if (foundAndNull != null) {
    77                     foundAndNull[1] = i;
    78                 }
    79             } else if (keys[i].equals(key)) {
    80                 if (foundAndNull != null) {
    81                     foundAndNull[0] = i;
    82                 }
    83                 return values[i];
    84             }
    85         }
    86         return null;
    87     }
    88     
    89 }