mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 10:55:01 -04:00
improved enum set reading
This commit is contained in:
parent
395adb930c
commit
72fd654b44
@ -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.input.key.manager.binding.actions.keysPressed
|
||||||
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
|
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
|
||||||
import de.bixilon.minosoft.test.IT
|
import de.bixilon.minosoft.test.IT
|
||||||
|
import de.bixilon.minosoft.util.KUtil.set
|
||||||
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
|
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
object InputTestUtil {
|
object InputTestUtil {
|
||||||
private val profile = BindingsManager::class.java.getDeclaredField("profile").apply { isAccessible = true }
|
private val profile = BindingsManager::class.java.getDeclaredField("profile").apply { isAccessible = true }
|
||||||
@ -50,7 +50,7 @@ object InputTestUtil {
|
|||||||
manager::bindings.forceSet(bindings)
|
manager::bindings.forceSet(bindings)
|
||||||
manager::handler.forceSet(handler)
|
manager::handler.forceSet(handler)
|
||||||
this.times.forceSet(manager, Object2LongOpenHashMap<KeyCodes>().apply { defaultReturnValue(-1L) })
|
this.times.forceSet(manager, Object2LongOpenHashMap<KeyCodes>().apply { defaultReturnValue(-1L) })
|
||||||
keysPressed[manager] = EnumSet.noneOf(KeyCodes::class.java)
|
keysPressed[manager] = KeyCodes.set()
|
||||||
|
|
||||||
return manager
|
return manager
|
||||||
}
|
}
|
||||||
|
@ -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.KeyBindingFilterState
|
||||||
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingState
|
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingState
|
||||||
import de.bixilon.minosoft.test.IT.OBJENESIS
|
import de.bixilon.minosoft.test.IT.OBJENESIS
|
||||||
|
import de.bixilon.minosoft.util.KUtil.set
|
||||||
import org.testng.Assert.assertFalse
|
import org.testng.Assert.assertFalse
|
||||||
import org.testng.Assert.assertTrue
|
import org.testng.Assert.assertTrue
|
||||||
import org.testng.annotations.Test
|
import org.testng.annotations.Test
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
|
||||||
val keysPressed = InputManager::class.java.getDeclaredField("pressed").apply { isAccessible = true }
|
val keysPressed = InputManager::class.java.getDeclaredField("pressed").apply { isAccessible = true }
|
||||||
@ -41,7 +41,7 @@ fun input(): InputManager {
|
|||||||
bindingsPressed[bindings] = mutableSetOf<ResourceLocation>()
|
bindingsPressed[bindings] = mutableSetOf<ResourceLocation>()
|
||||||
manager::bindings.forceSet(bindings)
|
manager::bindings.forceSet(bindings)
|
||||||
|
|
||||||
keysPressed[manager] = EnumSet.noneOf(KeyCodes::class.java)
|
keysPressed[manager] = KeyCodes.set()
|
||||||
|
|
||||||
return manager
|
return manager
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.config.key
|
package de.bixilon.minosoft.config.key
|
||||||
|
|
||||||
|
import de.bixilon.kutil.enums.EnumUtil
|
||||||
|
import de.bixilon.kutil.enums.ValuesEnum
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
enum class KeyCodes {
|
enum class KeyCodes {
|
||||||
@ -159,8 +161,9 @@ enum class KeyCodes {
|
|||||||
val keyName = name.uppercase(Locale.getDefault()).removePrefix("KEY_")
|
val keyName = name.uppercase(Locale.getDefault()).removePrefix("KEY_")
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object : ValuesEnum<KeyCodes> {
|
||||||
val VALUES = values()
|
override val VALUES = values()
|
||||||
|
override val NAME_MAP = EnumUtil.getEnumValues(VALUES)
|
||||||
val KEY_CODE_MAP: Map<String, KeyCodes>
|
val KEY_CODE_MAP: Map<String, KeyCodes>
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -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.EventPriorities
|
||||||
import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen
|
import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen
|
||||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
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.Object2LongMap
|
||||||
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
|
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -45,7 +46,7 @@ class InputManager(
|
|||||||
val interaction = InteractionManagerKeys(this, connection.camera.interactions)
|
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) }
|
private val times: Object2LongMap<KeyCodes> = Object2LongOpenHashMap<KeyCodes>().apply { defaultReturnValue(-1L) }
|
||||||
|
|
||||||
var mousePosition: Vec2d = Vec2d.EMPTY
|
var mousePosition: Vec2d = Vec2d.EMPTY
|
||||||
|
@ -52,7 +52,7 @@ class TabListS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
|||||||
this.entries = entries
|
this.entries = entries
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun EnumSet<Actions>.actions(): Array<AbstractAction> {
|
private fun Set<Actions>.actions(): Array<AbstractAction> {
|
||||||
val array = arrayOfNulls<AbstractAction>(this.size)
|
val array = arrayOfNulls<AbstractAction>(this.size)
|
||||||
for ((index, entry) in this.withIndex()) {
|
for ((index, entry) in this.withIndex()) {
|
||||||
array[index] = entry.action
|
array[index] = entry.action
|
||||||
|
@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol.buffers.play
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3d
|
import de.bixilon.kotlinglm.vec3.Vec3d
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3i
|
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.asJsonObject
|
||||||
import de.bixilon.kutil.json.JsonUtil.toMutableJsonObject
|
import de.bixilon.kutil.json.JsonUtil.toMutableJsonObject
|
||||||
import de.bixilon.minosoft.config.DebugOptions
|
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.protocol.protocol.encryption.CryptManager
|
||||||
import de.bixilon.minosoft.recipes.Ingredient
|
import de.bixilon.minosoft.recipes.Ingredient
|
||||||
import de.bixilon.minosoft.util.KUtil
|
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.Log
|
||||||
import de.bixilon.minosoft.util.logging.LogLevels
|
import de.bixilon.minosoft.util.logging.LogLevels
|
||||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||||
@ -298,15 +300,33 @@ class PlayInByteBuffer : InByteBuffer {
|
|||||||
return MessageHeader(readOptional { readByteArray() }, readUUID())
|
return MessageHeader(readOptional { readByteArray() }, readUUID())
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T : Enum<T>> readEnumSet(values: Array<T>): EnumSet<T> {
|
inline fun <reified T : Enum<T>> readEnumSet(enum: ValuesEnum<T>): Set<T> {
|
||||||
val bitset = readBitSet(values.size)
|
val bitset = readBitSet(enum.VALUES.size)
|
||||||
val set = EnumSet.noneOf(T::class.java)
|
if (bitset.isEmpty) {
|
||||||
for (index in values.indices) {
|
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)) {
|
if (!bitset.get(index)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
set += values[index]
|
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
|
return set
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf
|
|||||||
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedSet
|
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedSet
|
||||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
||||||
import de.bixilon.kutil.concurrent.schedule.TaskScheduler
|
import de.bixilon.kutil.concurrent.schedule.TaskScheduler
|
||||||
|
import de.bixilon.kutil.enums.ValuesEnum
|
||||||
import de.bixilon.kutil.latch.AbstractLatch
|
import de.bixilon.kutil.latch.AbstractLatch
|
||||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
||||||
import de.bixilon.kutil.primitive.DoubleUtil
|
import de.bixilon.kutil.primitive.DoubleUtil
|
||||||
@ -350,4 +351,13 @@ object KUtil {
|
|||||||
waitForChange(timeout)
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user