improved enum set reading

This commit is contained in:
Bixilon 2023-06-29 20:41:32 +02:00
parent 395adb930c
commit 72fd654b44
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 46 additions and 12 deletions

View File

@ -25,8 +25,8 @@ import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.actions.bindi
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.actions.keysPressed
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.test.IT
import de.bixilon.minosoft.util.KUtil.set
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
import java.util.*
object InputTestUtil {
private val profile = BindingsManager::class.java.getDeclaredField("profile").apply { isAccessible = true }
@ -50,7 +50,7 @@ object InputTestUtil {
manager::bindings.forceSet(bindings)
manager::handler.forceSet(handler)
this.times.forceSet(manager, Object2LongOpenHashMap<KeyCodes>().apply { defaultReturnValue(-1L) })
keysPressed[manager] = EnumSet.noneOf(KeyCodes::class.java)
keysPressed[manager] = KeyCodes.set()
return manager
}

View File

@ -25,10 +25,10 @@ import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.BindingsManag
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingFilterState
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingState
import de.bixilon.minosoft.test.IT.OBJENESIS
import de.bixilon.minosoft.util.KUtil.set
import org.testng.Assert.assertFalse
import org.testng.Assert.assertTrue
import org.testng.annotations.Test
import java.util.*
val keysPressed = InputManager::class.java.getDeclaredField("pressed").apply { isAccessible = true }
@ -41,7 +41,7 @@ fun input(): InputManager {
bindingsPressed[bindings] = mutableSetOf<ResourceLocation>()
manager::bindings.forceSet(bindings)
keysPressed[manager] = EnumSet.noneOf(KeyCodes::class.java)
keysPressed[manager] = KeyCodes.set()
return manager
}

View File

@ -13,6 +13,8 @@
package de.bixilon.minosoft.config.key
import de.bixilon.kutil.enums.EnumUtil
import de.bixilon.kutil.enums.ValuesEnum
import java.util.*
enum class KeyCodes {
@ -159,8 +161,9 @@ enum class KeyCodes {
val keyName = name.uppercase(Locale.getDefault()).removePrefix("KEY_")
companion object {
val VALUES = values()
companion object : ValuesEnum<KeyCodes> {
override val VALUES = values()
override val NAME_MAP = EnumUtil.getEnumValues(VALUES)
val KEY_CODE_MAP: Map<String, KeyCodes>
init {

View File

@ -31,6 +31,7 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2dUtil.EMPTY
import de.bixilon.minosoft.modding.EventPriorities
import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.util.KUtil.set
import it.unimi.dsi.fastutil.objects.Object2LongMap
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
import java.util.*
@ -45,7 +46,7 @@ class InputManager(
val interaction = InteractionManagerKeys(this, connection.camera.interactions)
private val pressed: EnumSet<KeyCodes> = EnumSet.noneOf(KeyCodes::class.java)
private val pressed: EnumSet<KeyCodes> = KeyCodes.set()
private val times: Object2LongMap<KeyCodes> = Object2LongOpenHashMap<KeyCodes>().apply { defaultReturnValue(-1L) }
var mousePosition: Vec2d = Vec2d.EMPTY

View File

@ -52,7 +52,7 @@ class TabListS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
this.entries = entries
}
private fun EnumSet<Actions>.actions(): Array<AbstractAction> {
private fun Set<Actions>.actions(): Array<AbstractAction> {
val array = arrayOfNulls<AbstractAction>(this.size)
for ((index, entry) in this.withIndex()) {
array[index] = entry.action

View File

@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol.buffers.play
import de.bixilon.kotlinglm.vec3.Vec3d
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.kutil.enums.ValuesEnum
import de.bixilon.kutil.json.JsonUtil.asJsonObject
import de.bixilon.kutil.json.JsonUtil.toMutableJsonObject
import de.bixilon.minosoft.config.DebugOptions
@ -48,6 +49,7 @@ import de.bixilon.minosoft.protocol.protocol.buffers.InByteBuffer
import de.bixilon.minosoft.protocol.protocol.encryption.CryptManager
import de.bixilon.minosoft.recipes.Ingredient
import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.KUtil.set
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@ -298,15 +300,33 @@ class PlayInByteBuffer : InByteBuffer {
return MessageHeader(readOptional { readByteArray() }, readUUID())
}
inline fun <reified T : Enum<T>> readEnumSet(values: Array<T>): EnumSet<T> {
val bitset = readBitSet(values.size)
val set = EnumSet.noneOf(T::class.java)
for (index in values.indices) {
inline fun <reified T : Enum<T>> readEnumSet(enum: ValuesEnum<T>): Set<T> {
val bitset = readBitSet(enum.VALUES.size)
if (bitset.isEmpty) {
return emptySet()
}
val set = enum.set()
readEnumSet(bitset, set, enum.VALUES)
return set
}
fun <T : Enum<T>> readEnumSet(bitset: BitSet, set: MutableSet<T>, values: Array<T>) {
for (index in 0 until minOf(bitset.length(), values.size)) {
if (!bitset.get(index)) {
continue
}
set += values[index]
}
}
@Deprecated("use values enum")
inline fun <reified T : Enum<T>> readEnumSet(values: Array<T>): Set<T> {
val bitset = readBitSet(values.size)
if (bitset.isEmpty) {
return emptySet()
}
val set = EnumSet.noneOf(T::class.java)
readEnumSet(bitset, set, values)
return set
}

View File

@ -28,6 +28,7 @@ import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedSet
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.schedule.TaskScheduler
import de.bixilon.kutil.enums.ValuesEnum
import de.bixilon.kutil.latch.AbstractLatch
import de.bixilon.kutil.primitive.BooleanUtil.decide
import de.bixilon.kutil.primitive.DoubleUtil
@ -350,4 +351,13 @@ object KUtil {
waitForChange(timeout)
}
}
val REGULAR_ENUM_SET = Class.forName("java.util.RegularEnumSet").declaredConstructors.first().apply { isAccessible = true }
val JUMBO_ENUM_SET = Class.forName("java.util.RegularEnumSet").declaredConstructors.first().apply { isAccessible = true }
@Deprecated("kutil 1.24")
inline fun <reified T : Enum<T>> ValuesEnum<T>.set(): EnumSet<T> {
val clazz = if (VALUES.size <= 64) REGULAR_ENUM_SET else JUMBO_ENUM_SET
return clazz.newInstance(T::class.java, VALUES).unsafeCast()
}
}