From 6ea5d29d6116a56d9b3940a015f98443bcf4dab3 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 3 Jun 2012 16:49:28 +0200 Subject: [PATCH] minor --- .../util/src/com/intellij/util/SmartFMap.java | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/platform/util/src/com/intellij/util/SmartFMap.java b/platform/util/src/com/intellij/util/SmartFMap.java index 1a9e2a7dc880..766c7b6f3106 100644 --- a/platform/util/src/com/intellij/util/SmartFMap.java +++ b/platform/util/src/com/intellij/util/SmartFMap.java @@ -41,35 +41,41 @@ public class SmartFMap implements Map { } public SmartFMap plus(@NotNull K key, V value) { - if (myMap instanceof Map) { - THashMap newMap = new THashMap((Map)myMap); + return new SmartFMap(doPlus(myMap, key, value, false)); + } + + private static Object doPlus(Object oldMap, Object key, Object value, boolean inPlace) { + if (oldMap instanceof Map) { + Map newMap = inPlace ? (Map)oldMap : new THashMap((Map)oldMap); newMap.put(key, value); - return new SmartFMap(newMap); + return newMap; } - Object[] array = (Object[])myMap; + Object[] array = (Object[])oldMap; for (int i = 0; i < array.length; i += 2) { if (key.equals(array[i])) { - Object[] newArray = new Object[array.length]; - System.arraycopy(array, 0, newArray, 0, array.length); + Object[] newArray = inPlace ? array : new Object[array.length]; + if (!inPlace) { + System.arraycopy(array, 0, newArray, 0, array.length); + } newArray[i + 1] = value; - return new SmartFMap(newArray); + return newArray; } } if (array.length == 2 * ARRAY_THRESHOLD) { - THashMap map = new THashMap(); + THashMap map = new THashMap(); for (int i = 0; i < array.length; i += 2) { - map.put((K)array[i], (V)array[i + 1]); + map.put(array[i], array[i + 1]); } map.put(key, value); - return new SmartFMap(map); + return map; } Object[] newArray = new Object[array.length + 2]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[array.length] = key; newArray[array.length + 1] = value; - return new SmartFMap(newArray); + return newArray; } public SmartFMap minus(@NotNull K key) { @@ -156,16 +162,21 @@ public class SmartFMap implements Map { @Override @Nullable public V get(Object key) { + return (V)doGet(myMap, key); + } + + @Nullable + private static Object doGet(Object map, Object key) { if (key == null) { return null; } - if (myMap instanceof Map) { - return ((Map)myMap).get(key); + if (map instanceof Map) { + return ((Map)map).get(key); } - Object[] array = (Object[])myMap; + Object[] array = (Object[])map; for (int i = 0; i < array.length; i += 2) { if (key.equals(array[i])) { - return (V)array[i + 1]; + return array[i + 1]; } } return null;