Don't use UserDataHolder in SlicedMapImpl, use KeyFMap directly

This commit is contained in:
Dmitry Jemerov
2017-03-21 16:20:03 +01:00
parent f45511b983
commit 51c7fc9f73
@@ -20,7 +20,7 @@ import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Multimap;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.util.keyFMap.KeyFMap;
import gnu.trove.THashMap;
import kotlin.jvm.functions.Function3;
import org.jetbrains.annotations.NotNull;
@@ -35,7 +35,7 @@ public class SlicedMapImpl implements MutableSlicedMap {
return new SlicedMapImpl();
}
private final Map<Object, UserDataHolderImpl> map = new THashMap<Object, UserDataHolderImpl>(0);
private final Map<Object, KeyFMap> map = new THashMap<Object, KeyFMap>(0);
private Multimap<WritableSlice<?, ?>, Object> collectiveSliceKeys = null;
@Override
@@ -44,17 +44,16 @@ public class SlicedMapImpl implements MutableSlicedMap {
return;
}
UserDataHolderImpl holder = map.get(key);
KeyFMap holder = map.get(key);
if (holder == null) {
holder = new UserDataHolderImpl();
map.put(key, holder);
holder = KeyFMap.EMPTY_MAP;
}
Key<V> sliceKey = slice.getKey();
RewritePolicy rewritePolicy = slice.getRewritePolicy();
if (rewritePolicy.rewriteProcessingNeeded(key)) {
V oldValue = holder.getUserData(sliceKey);
V oldValue = holder.get(sliceKey);
if (oldValue != null) {
//noinspection unchecked
if (!rewritePolicy.processRewrite(slice, key, oldValue, value)) {
@@ -71,7 +70,7 @@ public class SlicedMapImpl implements MutableSlicedMap {
collectiveSliceKeys.put(slice, key);
}
holder.putUserData(sliceKey, value);
map.put(key, holder.plus(sliceKey, value));
slice.afterPut(this, key, value);
}
@@ -83,9 +82,9 @@ public class SlicedMapImpl implements MutableSlicedMap {
@Override
public <K, V> V get(ReadOnlySlice<K, V> slice, K key) {
UserDataHolderImpl holder = map.get(key);
KeyFMap holder = map.get(key);
V value = holder == null ? null : holder.getUserData(slice.getKey());
V value = holder == null ? null : holder.get(slice.getKey());
return slice.computeValue(this, key, value, value == null);
}
@@ -101,14 +100,14 @@ public class SlicedMapImpl implements MutableSlicedMap {
@Override
public void forEach(@NotNull Function3<WritableSlice, Object, Object, Void> f) {
for (Map.Entry<Object, UserDataHolderImpl> entry : map.entrySet()) {
for (Map.Entry<Object, KeyFMap> entry : map.entrySet()) {
Object key = entry.getKey();
UserDataHolderImpl holder = entry.getValue();
KeyFMap holder = entry.getValue();
if (holder == null) continue;
for (Key<?> sliceKey : holder.getKeys()) {
Object value = holder.getUserData(sliceKey);
Object value = holder.get(sliceKey);
f.invoke(((AbstractWritableSlice) sliceKey).getSlice(), key, value);
}
@@ -120,11 +119,11 @@ public class SlicedMapImpl implements MutableSlicedMap {
public <K, V> ImmutableMap<K, V> getSliceContents(@NotNull ReadOnlySlice<K, V> slice) {
ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
for (Map.Entry<Object, UserDataHolderImpl> entry : map.entrySet()) {
for (Map.Entry<Object, KeyFMap> entry : map.entrySet()) {
UserDataHolder holder = entry.getValue();
KeyFMap holder = entry.getValue();
V value = holder.getUserData(slice.getKey());
V value = holder.get(slice.getKey());
if (value != null) {
//noinspection unchecked