Skip to content

Commit

Permalink
Optimize Nbt*Array serialization by using array directly
Browse files Browse the repository at this point in the history
  • Loading branch information
BenWoodworth committed Aug 20, 2021
1 parent e5fd7a7 commit 25a9c98
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 48 deletions.
27 changes: 6 additions & 21 deletions src/commonMain/kotlin/NbtTagSerializers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,8 @@ internal object NbtByteArraySerializer : KSerializer<NbtByteArray> {

override val descriptor: SerialDescriptor = NbtByteArrayDescriptor

override fun serialize(encoder: Encoder, value: NbtByteArray) {
val composite = encoder.asNbtEncoder().beginList(descriptor, value.size)
value.forEachIndexed { index, element ->
composite.encodeByteElement(descriptor, index, element)
}
composite.endStructure(descriptor)
}
override fun serialize(encoder: Encoder, value: NbtByteArray): Unit =
encoder.asNbtEncoder().encodeByteArray(value.content)

override fun deserialize(decoder: Decoder): NbtByteArray =
NbtByteArray(decoder.asNbtDecoder().decodeByteArray())
Expand Down Expand Up @@ -157,13 +152,8 @@ internal object NbtIntArraySerializer : KSerializer<NbtIntArray> {

override val descriptor: SerialDescriptor = NbtIntArrayDescriptor

override fun serialize(encoder: Encoder, value: NbtIntArray) {
val composite = encoder.asNbtEncoder().beginList(descriptor, value.size)
value.forEachIndexed { index, element ->
composite.encodeIntElement(descriptor, index, element)
}
composite.endStructure(descriptor)
}
override fun serialize(encoder: Encoder, value: NbtIntArray): Unit =
encoder.asNbtEncoder().encodeIntArray(value.content)

override fun deserialize(decoder: Decoder): NbtIntArray =
NbtIntArray(decoder.asNbtDecoder().decodeIntArray())
Expand All @@ -177,13 +167,8 @@ internal object NbtLongArraySerializer : KSerializer<NbtLongArray> {

override val descriptor: SerialDescriptor = NbtLongArrayDescriptor

override fun serialize(encoder: Encoder, value: NbtLongArray) {
val composite = encoder.asNbtEncoder().beginList(descriptor, value.size)
value.forEachIndexed { index, element ->
composite.encodeLongElement(NbtIntArraySerializer.descriptor, index, element)
}
composite.endStructure(NbtIntArraySerializer.descriptor)
}
override fun serialize(encoder: Encoder, value: NbtLongArray): Unit =
encoder.asNbtEncoder().encodeLongArray(value.content)

override fun deserialize(decoder: Decoder): NbtLongArray =
NbtLongArray(decoder.asNbtDecoder().decodeLongArray())
Expand Down
30 changes: 3 additions & 27 deletions src/commonMain/kotlin/internal/DefaultNbtEncoder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -213,33 +213,9 @@ internal class DefaultNbtEncoder(
}
writer.endList()
}
TAG_Byte_Array -> {
val bytes = value as NbtByteArray
writer.beginByteArray(bytes.size)
bytes.forEach { byte ->
writer.beginByteArrayEntry()
writer.writeByte(byte)
}
writer.endByteArray()
}
TAG_Int_Array -> {
val ints = value as NbtIntArray
writer.beginIntArray(ints.size)
ints.forEach { int ->
writer.beginIntArrayEntry()
writer.writeInt(int)
}
writer.endIntArray()
}
TAG_Long_Array -> {
val longs = value as NbtLongArray
writer.beginLongArray(longs.size)
longs.forEach { long ->
writer.beginLongArrayEntry()
writer.writeLong(long)
}
writer.endLongArray()
}
TAG_Byte_Array -> writer.writeByteArray((value as NbtByteArray).content)
TAG_Int_Array -> writer.writeIntArray((value as NbtIntArray).content)
TAG_Long_Array -> writer.writeLongArray((value as NbtLongArray).content)
}

beginEncodingValue(value.type)
Expand Down

0 comments on commit 25a9c98

Please sign in to comment.