This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git

commit 220254be373dcecaad8478e7ee616f3b49c3412d
Author: Jaroslav Tulach <[email protected]>
AuthorDate: Thu Feb 14 07:01:01 2019 +0100

    Avoid usage of HashMap
---
 .../main/java/org/netbeans/html/ko4j/MapObjs.java  | 94 ++++++++++++++++------
 1 file changed, 68 insertions(+), 26 deletions(-)

diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/MapObjs.java 
b/ko4j/src/main/java/org/netbeans/html/ko4j/MapObjs.java
index ef3ec28..672710a 100644
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/MapObjs.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/MapObjs.java
@@ -19,49 +19,91 @@
 
 package org.netbeans.html.ko4j;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.List;
+import net.java.html.json.Models;
 import org.netbeans.html.boot.spi.Fn;
 
 final class MapObjs {
+    private static final Object UNINITIALIZED = new Object();
+    private static Object onlyPresenter = UNINITIALIZED;
+
+    private final List<Object> all;
+
+    private MapObjs(Object... arr) {
+        this.all = Models.asList(arr);
+    }
+
+
     static Object put(Object now, Fn.Presenter key, Object js) {
-        Map<Fn.Presenter, Object> map = (Map<Fn.Presenter, Object>) now;
-        if (map == null) {
-            map = new HashMap<Fn.Presenter, Object>();
+        if (now instanceof MapObjs) {
+            return ((MapObjs)now).put(key, js);
+        } else {
+            if (onlyPresenter == UNINITIALIZED) {
+                onlyPresenter = key;
+                return js;
+            } else if (onlyPresenter == key) {
+                return js;
+            } else {
+                if (onlyPresenter == null) {
+                    assert now == null;
+                    return new MapObjs(key, js);
+                } else {
+                    final MapObjs map = new MapObjs(onlyPresenter, now, key, 
js);
+                    onlyPresenter = null;
+                    return map;
+                }
+            }
         }
-        map.put(key, js);
-        return map;
     }
 
     static Object get(Object now, Fn.Presenter key) {
-        if (now instanceof Map) {
-            Map<?,?> map = (Map<?,?>) now;
-            return map.get(key);
+        if (now instanceof MapObjs) {
+            return ((MapObjs)now).get(key);
         }
-        return null;
+        return key == onlyPresenter ? now : null;
     }
 
     static Object[] remove(Object now, Fn.Presenter key) {
-        Map<?,?> map = (Map<?,?>) now;
-        Object prev = map.remove(key);
-        return new Object[] { prev, map };
+        if (now instanceof MapObjs) {
+            return ((MapObjs)now).remove(key);
+        }
+        return new Object[] { now, null };
     }
 
     static Object[] toArray(Object now) {
-        if (now instanceof Map) {
-            Map<?, ?> map = (Map<?, ?>) now;
-            Object[] res = new Object[map.size() * 2];
-            int at = 0;
-            for (Map.Entry<? extends Object, ? extends Object> entry : 
map.entrySet()) {
-                Object key = entry.getKey();
-                Object value = entry.getValue();
+        if (now instanceof MapObjs) {
+            return ((MapObjs) now).all.toArray();
+        }
+        return new Object[] { onlyPresenter, now };
+    }
+
+    private Object put(Fn.Presenter key, Object js) {
+        for (int i = 0; i < all.size(); i += 2) {
+            if (all.get(i) == key) {
+                all.set(i + 1, js);
+                return this;
+            }
+        }
+        all.add(key);
+        all.add(js);
+        return this;
+    }
+
+    private Object get(Fn.Presenter key) {
+        for (int i = 0; i < all.size(); i += 2) {
+            if (all.get(i) == key) {
+                return all.get(i + 1);
+            }
+        }
+        return null;
+    }
 
-                res[at] = key;
-                res[at + 1] = value;
-                at += 2;
+    private Object[] remove(Fn.Presenter key) {
+        for (int i = 0; i < all.size(); i += 2) {
+            if (all.get(i) == key) {
+                return new Object[] { all.get(i + 1), this };
             }
-            return res;
         }
-        return new Object[0];
+        return new Object[] { null, this };
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to