From bc3bbe3d84f3b0d08f2d3f697f16bb6b45aea19e Mon Sep 17 00:00:00 2001 From: mezz Date: Thu, 18 Jan 2018 12:46:05 -0800 Subject: [PATCH] Avoid copying Forge Registry keys, values, and entries (#4545) --- .../minecraftforge/common/ForgeModContainer.java | 2 +- .../minecraftforge/registries/ForgeRegistry.java | 16 ++++++++++++++-- .../registries/IForgeRegistry.java | 7 +++++++ .../registries/NamespacedDefaultedWrapper.java | 7 +++---- .../registries/NamespacedWrapper.java | 8 ++++---- .../minecraftforge/debug/FluidHandlerTest.java | 2 +- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeModContainer.java b/src/main/java/net/minecraftforge/common/ForgeModContainer.java index 805d304c66..5b3251f471 100644 --- a/src/main/java/net/minecraftforge/common/ForgeModContainer.java +++ b/src/main/java/net/minecraftforge/common/ForgeModContainer.java @@ -494,7 +494,7 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC private static void registerAllBiomesAndGenerateEvents() { - for (Biome biome : ForgeRegistries.BIOMES.getValues()) + for (Biome biome : ForgeRegistries.BIOMES.getValuesCollection()) { if (biome.decorator instanceof DeferredBiomeDecorator) { diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java index a63e62595d..bfb7dc3962 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.apache.commons.lang3.Validate; @@ -188,19 +189,30 @@ public class ForgeRegistry> implements IForgeRe @Override public Set getKeys() { - return ImmutableSet.copyOf(this.names.keySet()); + return Collections.unmodifiableSet(this.names.keySet()); } + /** + * @deprecated use {@link #getValuesCollection} to avoid copying + */ + @Deprecated @Override public List getValues() { return ImmutableList.copyOf(this.names.values()); } + @Nonnull + @Override + public Collection getValuesCollection() + { + return Collections.unmodifiableSet(this.names.values()); + } + @Override public Set> getEntries() { - return ImmutableSet.copyOf(this.names.entrySet()); + return Collections.unmodifiableSet(this.names.entrySet()); } @SuppressWarnings("unchecked") diff --git a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java index a2bd3b7a74..767c7774de 100644 --- a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java @@ -19,6 +19,7 @@ package net.minecraftforge.registries; +import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.Set; @@ -48,7 +49,13 @@ public interface IForgeRegistry> extends Iterab @Nullable ResourceLocation getKey(V value); @Nonnull Set getKeys(); + /** @deprecated use {@link #getValuesCollection} */ + @Deprecated // TODO: remove in 1.13 @Nonnull List getValues(); + @Nonnull + default Collection getValuesCollection() { // TODO rename this to getValues in 1.13 + return getValues(); + } @Nonnull Set> getEntries(); /** diff --git a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java index de4e5fb6ec..5257083be2 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java @@ -1,5 +1,6 @@ package net.minecraftforge.registries; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -104,10 +105,8 @@ class NamespacedDefaultedWrapper> extends Regis @Nullable public V getRandomObject(Random random) { - List lst = this.delegate.getValues(); - if (lst.isEmpty()) - return null; - return lst.get(random.nextInt(lst.size())); + Collection values = this.delegate.getValuesCollection(); + return values.stream().skip(random.nextInt(values.size())).findFirst().orElse(null); } //internal diff --git a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java index b501509ac9..1580263941 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java @@ -1,5 +1,7 @@ package net.minecraftforge.registries; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -97,10 +99,8 @@ class NamespacedWrapper> extends RegistryNamesp @Nullable public V getRandomObject(Random random) { - List lst = this.delegate.getValues(); - if (lst.isEmpty()) - return null; - return lst.get(random.nextInt(lst.size())); + Collection values = this.delegate.getValuesCollection(); + return values.stream().skip(random.nextInt(values.size())).findFirst().orElse(null); } //internal diff --git a/src/test/java/net/minecraftforge/debug/FluidHandlerTest.java b/src/test/java/net/minecraftforge/debug/FluidHandlerTest.java index e1cebe19fd..48a7301cb1 100644 --- a/src/test/java/net/minecraftforge/debug/FluidHandlerTest.java +++ b/src/test/java/net/minecraftforge/debug/FluidHandlerTest.java @@ -130,7 +130,7 @@ public class FluidHandlerTest private static List getAllItems() { NonNullList list = NonNullList.create(); - for (Item item : ForgeRegistries.ITEMS.getValues()) + for (Item item : ForgeRegistries.ITEMS.getValuesCollection()) { for (CreativeTabs tab : item.getCreativeTabs()) {