From b063175b8c4a8a153c2d0454a5d0832f223d3cd7 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 6 Mar 2023 18:18:02 +0700 Subject: [PATCH] Undo caching of enum value codec --- .../mc/otm/core/util/DataStreams.kt | 27 ++++--------------- .../otm/menu/input/EnumInputWithFeedback.kt | 2 +- .../mc/otm/network/FieldSynchronizer.kt | 27 +++++++++---------- 3 files changed, 19 insertions(+), 37 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt index 6916c5589..15fb51b18 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt @@ -6,7 +6,6 @@ import com.mojang.serialization.Codec import com.mojang.serialization.DataResult import com.mojang.serialization.DynamicOps import net.minecraft.nbt.NbtAccounter -import net.minecraft.util.StringRepresentable import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.core.immutableMap import ru.dbotthepony.mc.otm.core.math.readDecimal @@ -87,14 +86,14 @@ val LongValueCodec = StreamCodec(DataInputStream::readLong, 8L, DataOutputStream val FloatValueCodec = StreamCodec(DataInputStream::readFloat, 4L, DataOutputStream::writeFloat) val DoubleValueCodec = StreamCodec(DataInputStream::readDouble, 8L, DataOutputStream::writeDouble) val ItemStackValueCodec = StreamCodec(DataInputStream::readItem, DataOutputStream::writeItem, ItemStack::copy) { a, b -> a.equals(b, true) } -val ImpreciseFractionValueCodec = StreamCodec(DataInputStream::readDecimal, DataOutputStream::writeDecimal) +val DecimalValueCodec = StreamCodec(DataInputStream::readDecimal, DataOutputStream::writeDecimal) val BigDecimalValueCodec = StreamCodec(DataInputStream::readBigDecimal, DataOutputStream::writeBigDecimal) val UUIDValueCodec = StreamCodec({ s, a -> a.accountBytes(8L); UUID(s.readLong(), s.readLong()) }, { s, v -> s.writeLong(v.mostSignificantBits); s.writeLong(v.leastSignificantBits) }) val VarIntValueCodec = StreamCodec(DataInputStream::readVarIntLE, DataOutputStream::writeVarIntLE) val VarLongValueCodec = StreamCodec(DataInputStream::readVarLongLE, DataOutputStream::writeVarLongLE) val BinaryStringCodec = StreamCodec(DataInputStream::readBinaryString, DataOutputStream::writeBinaryString) -class EnumValueCodec> private constructor(clazz: Class) : IStreamCodec, Codec { +class EnumValueCodec>(clazz: Class) : IStreamCodec, Codec { val clazz = searchClass(clazz) val values: ImmutableList = ImmutableList.copyOf(this.clazz.enumConstants!!) val valuesMap = immutableMap { @@ -137,22 +136,6 @@ class EnumValueCodec> private constructor(clazz: Class) : ISt } companion object { - private val codecs = WeakHashMap, EnumValueCodec<*>>() - - fun > of(clazz: Class): EnumValueCodec { - synchronized(codecs) { - val search = searchClass(clazz) - - if (search !== clazz) { - val result = codecs.computeIfAbsent(search) { EnumValueCodec(it as Class) } as EnumValueCodec - codecs.putIfAbsent(clazz, result) - return result - } - - return codecs.computeIfAbsent(clazz) { EnumValueCodec(it as Class) } as EnumValueCodec - } - } - /** * FIXME: enums with abstract methods which get compiled to subclasses, whose DO NOT expose "parent's" enum constants array * @@ -174,8 +157,8 @@ class EnumValueCodec> private constructor(clazz: Class) : ISt } } -fun > Class.codec() = EnumValueCodec.of(this) -fun > KClass.codec() = EnumValueCodec.of(this.java) +fun > Class.codec() = EnumValueCodec(this) +fun > KClass.codec() = EnumValueCodec(this.java) fun OutputStream.writeInt(value: Int) { if (this is DataOutput) { @@ -376,7 +359,7 @@ private val codecs: List> = com.google.common.collect.Immu it.add(IndexedStreamCodec(codecID++, FloatValueCodec)) it.add(IndexedStreamCodec(codecID++, DoubleValueCodec)) it.add(IndexedStreamCodec(codecID++, ItemStackValueCodec)) - it.add(IndexedStreamCodec(codecID++, ImpreciseFractionValueCodec)) + it.add(IndexedStreamCodec(codecID++, DecimalValueCodec)) it.add(IndexedStreamCodec(codecID++, BigDecimalValueCodec)) it.add(IndexedStreamCodec(codecID++, UUIDValueCodec)) it.add(IndexedStreamCodec(codecID++, BinaryStringCodec)) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/input/EnumInputWithFeedback.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/input/EnumInputWithFeedback.kt index d066f388c..457b3674b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/input/EnumInputWithFeedback.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/input/EnumInputWithFeedback.kt @@ -10,7 +10,7 @@ inline fun > EnumInputWithFeedback(menu: MatteryMenu, state: inline fun > EnumInputWithFeedback(menu: MatteryMenu, state: GetterSetter) = EnumInputWithFeedback(menu, E::class.java, state) class EnumInputWithFeedback>(menu: MatteryMenu, clazz: Class) : AbstractPlayerInputWithFeedback() { - val codec = EnumValueCodec.of(clazz) + val codec = EnumValueCodec(clazz) private val default = codec.values.first() override val input = menu.PlayerInput(codec, false) { consumer?.invoke(it) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt index bf67dfcda..371d2f0c2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt @@ -5,7 +5,6 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.ReferenceArraySet import net.minecraft.world.item.ItemStack -import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.collect.ProxiedMap import ru.dbotthepony.mc.otm.core.math.Decimal @@ -17,7 +16,7 @@ import ru.dbotthepony.mc.otm.core.util.DoubleValueCodec import ru.dbotthepony.mc.otm.core.util.EnumValueCodec import ru.dbotthepony.mc.otm.core.util.FloatValueCodec import ru.dbotthepony.mc.otm.core.util.IStreamCodec -import ru.dbotthepony.mc.otm.core.util.ImpreciseFractionValueCodec +import ru.dbotthepony.mc.otm.core.util.DecimalValueCodec import ru.dbotthepony.mc.otm.core.util.IntValueCodec import ru.dbotthepony.mc.otm.core.util.ItemStackValueCodec import ru.dbotthepony.mc.otm.core.util.LongValueCodec @@ -148,7 +147,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa fun uuid(getter: () -> UUID) = ComputedField(getter, UUIDValueCodec) fun int(getter: () -> Int) = ComputedField(getter, VarIntValueCodec) fun fixedInt(getter: () -> Int) = ComputedField(getter, IntValueCodec) - fun fraction(getter: () -> Decimal) = ComputedField(getter, ImpreciseFractionValueCodec) + fun fraction(getter: () -> Decimal) = ComputedField(getter, DecimalValueCodec) fun bigDecimal(getter: () -> BigDecimal) = ComputedField(getter, BigDecimalValueCodec) fun item(getter: () -> ItemStack) = ComputedField(getter, ItemStackValueCodec) fun string(getter: () -> String) = ComputedField(getter, BinaryStringCodec) @@ -163,7 +162,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa fun uuid(getter: KProperty0) = ComputedField(getter, UUIDValueCodec) fun int(getter: KProperty0) = ComputedField(getter, VarIntValueCodec) fun fixedInt(getter: KProperty0) = ComputedField(getter, IntValueCodec) - fun fraction(getter: KProperty0) = ComputedField(getter, ImpreciseFractionValueCodec) + fun fraction(getter: KProperty0) = ComputedField(getter, DecimalValueCodec) fun bigDecimal(getter: KProperty0) = ComputedField(getter, BigDecimalValueCodec) fun item(getter: KProperty0) = ComputedField(getter, ItemStackValueCodec) fun string(getter: KProperty0) = ComputedField(getter, BinaryStringCodec) @@ -178,19 +177,19 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa fun uuid(getter: Supplier) = ComputedField(getter::get, UUIDValueCodec) fun int(getter: Supplier) = ComputedField(getter::get, VarIntValueCodec) fun fixedInt(getter: Supplier) = ComputedField(getter::get, IntValueCodec) - fun fraction(getter: Supplier) = ComputedField(getter::get, ImpreciseFractionValueCodec) + fun fraction(getter: Supplier) = ComputedField(getter::get, DecimalValueCodec) fun bigDecimal(getter: Supplier) = ComputedField(getter::get, BigDecimalValueCodec) fun item(getter: Supplier) = ComputedField(getter::get, ItemStackValueCodec) fun string(getter: Supplier) = ComputedField(getter::get, BinaryStringCodec) - fun > enum(type: Class, getter: () -> T) = ComputedField(getter, EnumValueCodec.of(type)) - inline fun > enum(noinline getter: () -> T) = ComputedField(getter, EnumValueCodec.of(T::class.java)) + fun > enum(type: Class, getter: () -> T) = ComputedField(getter, EnumValueCodec(type)) + inline fun > enum(noinline getter: () -> T) = ComputedField(getter, EnumValueCodec(T::class.java)) - fun > enum(type: Class, getter: KProperty0) = ComputedField(getter, EnumValueCodec.of(type)) - inline fun > enum(getter: KProperty0) = ComputedField(getter, EnumValueCodec.of(T::class.java)) + fun > enum(type: Class, getter: KProperty0) = ComputedField(getter, EnumValueCodec(type)) + inline fun > enum(getter: KProperty0) = ComputedField(getter, EnumValueCodec(T::class.java)) - fun > enum(type: Class, getter: Supplier) = ComputedField(getter::get, EnumValueCodec.of(type)) - inline fun > enum(getter: Supplier) = ComputedField(getter::get, EnumValueCodec.of(T::class.java)) + fun > enum(type: Class, getter: Supplier) = ComputedField(getter::get, EnumValueCodec(type)) + inline fun > enum(getter: Supplier) = ComputedField(getter::get, EnumValueCodec(T::class.java)) @JvmOverloads fun byte( @@ -309,7 +308,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa setter: FieldSetter? = null, ): Field { - return Field(value, ImpreciseFractionValueCodec, getter, setter) + return Field(value, DecimalValueCodec, getter, setter) } @JvmOverloads @@ -330,7 +329,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa setter: FieldSetter? = null, ): Field { - return Field(value, EnumValueCodec.of(type), getter, setter) + return Field(value, EnumValueCodec(type), getter, setter) } @JvmOverloads @@ -340,7 +339,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa setter: FieldSetter? = null, ): Field { - return Field(value, EnumValueCodec.of(value::class.java), getter, setter) + return Field(value, EnumValueCodec(value::class.java), getter, setter) } @JvmOverloads