fix enums

This commit is contained in:
DBotThePony 2023-01-29 23:19:40 +07:00
parent 45ec6d1428
commit a99dab51b4
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -76,7 +76,7 @@ val VarLongValueCodec = StreamCodec(DataInputStream::readVarLongLE, DataOutputSt
val BinaryStringCodec = StreamCodec(DataInputStream::readBinaryString, DataOutputStream::writeBinaryString)
class EnumValueCodec<V : Enum<V>>(clazz: Class<out V>, val writeByIndices: Boolean = false) : IStreamCodec<V> {
private val values = clazz.enumConstants ?: throw ClassCastException("$clazz does not have enum constants. Not an enum?")
private val values = search(clazz) ?: throw ClassCastException("$clazz does not have enum constants. Not an enum?")
override fun read(stream: DataInputStream): V {
if (writeByIndices) {
@ -102,6 +102,23 @@ class EnumValueCodec<V : Enum<V>>(clazz: Class<out V>, val writeByIndices: Boole
override fun compare(a: V, b: V): Boolean {
return a === b
}
companion object {
/**
* FIXME: enums with abstract methods which get compiled to subclasses, whose DO NOT expose "parent's" enum constants array
*
* is there an already existing solution?
*/
fun <V : Enum<V>> search(clazz: Class<out V>): Array<V>? {
var search: Class<*> = clazz
while (search.enumConstants == null && search.superclass != null) {
search = search.superclass
}
return search.enumConstants as? Array<V>
}
}
}
fun OutputStream.writeInt(value: Int) {