From 4654b690fe7e0d7bcf170f8200ddb00b14223dca Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Wed, 29 Nov 2023 15:49:09 +0100 Subject: [PATCH] Improve immutable wrapped array list performance --- .../plugin/classgen/GenSerializerArrayX.java | 4 ++-- .../nativedata/ImmutableWrappedArrayList.java | 17 +++++++++++++++-- .../datagen/nativedata/UpgradeUtil.java | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java index bc168cc..d0f60f0 100644 --- a/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java +++ b/datagen-plugin/src/main/java/it/cavallium/datagen/plugin/classgen/GenSerializerArrayX.java @@ -125,9 +125,9 @@ public class GenSerializerArrayX extends ClassGenerator { method.addCode("\n"); if (USE_NATIVE_TYPED_ARRAYS) { - method.addStatement("return new $T(a)", ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class), arrayComponentTypeName)); + method.addStatement("return $T.of(a)", ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class), arrayComponentTypeName)); } else { - method.addStatement("return ($T) new $T(a)", + method.addStatement("return ($T) $T.of(a)", ParameterizedTypeName.get(ClassName.get(ImmutableWrappedArrayList.class), arrayComponentTypeName), ClassName.get(ImmutableWrappedArrayList.class) ); diff --git a/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java b/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java index 71bd3ab..bbe4963 100644 --- a/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java +++ b/datagen/src/main/java/it/cavallium/datagen/nativedata/ImmutableWrappedArrayList.java @@ -32,6 +32,8 @@ import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; public class ImmutableWrappedArrayList extends AbstractObjectList implements RandomAccess { + + private static final ImmutableWrappedArrayList EMPTY = new ImmutableWrappedArrayList<>(new Object[0]); /** The backing array. */ protected final K[] a; /** The current actual size of the list (never greater than the backing-array length). */ @@ -42,7 +44,7 @@ public class ImmutableWrappedArrayList extends AbstractObjectList implemen * * @param a an array whose elements will be used to fill the array list. */ - public ImmutableWrappedArrayList(final K[] a) { + private ImmutableWrappedArrayList(final K[] a) { this.a = a; this.size = a.length; } @@ -55,7 +57,18 @@ public class ImmutableWrappedArrayList extends AbstractObjectList implemen */ @SafeVarargs public static ImmutableWrappedArrayList of(final K... init) { - return new ImmutableWrappedArrayList<>(init); + return init.length == 0 ? of() : new ImmutableWrappedArrayList<>(init); + } + + /** + * Creates an array list using an array of elements. + * + * @param init a the array the will become the new backing array of the array list. + * @return a new array list backed by the given array. + */ + public static ImmutableWrappedArrayList of() { + //noinspection unchecked + return (ImmutableWrappedArrayList) EMPTY; } private UnsupportedOperationException ex() { diff --git a/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java b/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java index ef00f5d..5e48ea8 100644 --- a/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java +++ b/datagen/src/main/java/it/cavallium/datagen/nativedata/UpgradeUtil.java @@ -16,7 +16,7 @@ public class UpgradeUtil { for (int i = 0; i < array.length; i++) { array[i] = (B) upgrader.upgrade((A) array[i]); } - return (ImmutableWrappedArrayList) new ImmutableWrappedArrayList<>(array); + return (ImmutableWrappedArrayList) ImmutableWrappedArrayList.of(array); } public static B upgradeNullable(A nullableValue, DataUpgrader upgrader) {