Refactor registry data into a custom object

This commit is contained in:
embeddedt 2023-04-28 19:22:38 -04:00
parent 3f24f50744
commit 599bdee173
No known key found for this signature in database
GPG Key ID: A69433EC199B5613

View File

@ -2,14 +2,12 @@ package org.embeddedt.modernfix.registry;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.Iterators; import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry;
import org.apache.commons.lang3.tuple.MutablePair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -25,20 +23,20 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
private ResourceKey<Registry<V>> registryKey; private ResourceKey<Registry<V>> registryKey;
private ObjectArrayList<V> valuesById; private ObjectArrayList<V> valuesById;
private Map<V, MutablePair<ResourceKey<V>, Integer>> infoByValue; private Map<V, RegistryValueData> infoByValue;
private Map<ResourceKey<V>, V> valuesByKey = new Object2ObjectOpenHashMap<>(); private Map<ResourceKey<V>, V> valuesByKey = new Object2ObjectOpenHashMap<>();
private void storeId(V value, int id) { private void storeId(V value, int id) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.computeIfAbsent(value, k -> new MutablePair<>(null, null)); RegistryValueData pair = infoByValue.computeIfAbsent(value, k -> new RegistryValueData());
pair.setRight(id); pair.id = id;
} }
private void updateInfoPairAndClearIfNull(V v, Consumer<MutablePair<ResourceKey<V>, Integer>> consumer) { private void updateInfoPairAndClearIfNull(V v, Consumer<RegistryValueData> consumer) {
infoByValue.compute(v, (oldValue, oldPair) -> { infoByValue.compute(v, (oldValue, oldPair) -> {
if(oldPair == null) if(oldPair == null)
oldPair = new MutablePair<>(null, null); oldPair = new RegistryValueData();
consumer.accept(oldPair); consumer.accept(oldPair);
if(oldPair.getLeft() == null && oldPair.getRight() == null) if(oldPair.isEmpty())
return null; return null;
else else
return oldPair; return oldPair;
@ -75,7 +73,7 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
ensureArrayCanFitId(key); ensureArrayCanFitId(key);
V oldValue = valuesById.set(key, value); V oldValue = valuesById.set(key, value);
if(oldValue != null) { if(oldValue != null) {
updateInfoPairAndClearIfNull(oldValue, pair -> pair.setRight(null)); updateInfoPairAndClearIfNull(oldValue, pair -> pair.id = null);
} }
storeId(value, key); storeId(value, key);
return oldValue; return oldValue;
@ -143,20 +141,20 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
@Override @Override
public Integer get(Object key) { public Integer get(Object key) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.get(key); RegistryValueData pair = infoByValue.get(key);
if(pair == null) if(pair == null)
return null; return null;
return pair.getRight(); return pair.id;
} }
@Override @Override
public Integer remove(Object key) { public Integer remove(Object key) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.get(key); RegistryValueData pair = infoByValue.get(key);
if(pair == null) if(pair == null)
return null; return null;
int id = pair.getRight(); int id = pair.id;
valuesById.set(id, null); valuesById.set(id, null);
updateInfoPairAndClearIfNull((V)key, p -> p.setRight(null)); updateInfoPairAndClearIfNull((V)key, p -> p.id = null);
return id; return id;
} }
@ -217,8 +215,8 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
public void clear() { public void clear() {
valuesById.clear(); valuesById.clear();
infoByValue.values().removeIf(pair -> { infoByValue.values().removeIf(pair -> {
pair.setRight(null); pair.id = null;
return pair.getLeft() == null && pair.getRight() == null; return pair.isEmpty();
}); });
} }
@ -257,9 +255,9 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
public V forcePut(@Nullable ResourceKey<V> key, @Nullable V value) { public V forcePut(@Nullable ResourceKey<V> key, @Nullable V value) {
V oldValue = valuesByKey.put(key, value); V oldValue = valuesByKey.put(key, value);
if(oldValue != null) { if(oldValue != null) {
updateInfoPairAndClearIfNull(oldValue, p -> p.setLeft(null)); updateInfoPairAndClearIfNull(oldValue, p -> p.key = null);
} }
updateInfoPairAndClearIfNull(value, p -> p.setLeft(key)); updateInfoPairAndClearIfNull(value, p -> p.key = key);
return oldValue; return oldValue;
} }
@ -325,22 +323,22 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
@Override @Override
public ResourceKey<V> get(Object key) { public ResourceKey<V> get(Object key) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.get(key); RegistryValueData pair = infoByValue.get(key);
if(pair == null) if(pair == null)
return null; return null;
else else
return pair.getLeft(); return (ResourceKey<V>)pair.key;
} }
@Override @Override
public ResourceKey<V> remove(Object key) { public ResourceKey<V> remove(Object key) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.get(key); RegistryValueData pair = infoByValue.get(key);
if(pair == null) if(pair == null)
return null; return null;
else { else {
ResourceKey<V> rk = pair.getLeft(); ResourceKey<V> rk = (ResourceKey<V>)pair.key;
valuesByKey.remove(rk); valuesByKey.remove(rk);
updateInfoPairAndClearIfNull((V)key, p -> p.setLeft(null)); updateInfoPairAndClearIfNull((V)key, p -> p.key = null);
return rk; return rk;
} }
} }
@ -396,7 +394,7 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
@Override @Override
public void clear() { public void clear() {
valuesByKey.values().forEach(v -> updateInfoPairAndClearIfNull(v, p -> p.setLeft(null))); valuesByKey.values().forEach(v -> updateInfoPairAndClearIfNull(v, p -> p.key = null));
valuesByKey.clear(); valuesByKey.clear();
} }
@ -488,11 +486,11 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
@Override @Override
public ResourceLocation get(Object key) { public ResourceLocation get(Object key) {
MutablePair<ResourceKey<V>, Integer> pair = infoByValue.get(key); RegistryValueData pair = infoByValue.get(key);
if(pair == null || pair.getLeft() == null) if(pair == null || pair.key == null)
return null; return null;
else else
return pair.getLeft().location(); return pair.key.location();
} }
@Override @Override
@ -671,4 +669,13 @@ public class FastForgeRegistry<V extends IForgeRegistryEntry<V>> {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }
static class RegistryValueData {
public ResourceKey<?> key;
public Integer id;
boolean isEmpty() {
return key == null && id == null;
}
}
} }