From d9a6d97c4f3c8a65a9e3105ebfa1ff9f82cd5238 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 19 Apr 2024 15:00:29 +0700 Subject: [PATCH] Move vectors io to streams --- .../ru/dbotthepony/kstarbound/io/Streams.kt | 102 ++++++++++++++---- .../kstarbound/math/vector/VectorsIO.kt | 72 ------------- 2 files changed, 83 insertions(+), 91 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/math/vector/VectorsIO.kt diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/Streams.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/Streams.kt index dd79ba92..049da7f2 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/Streams.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/Streams.kt @@ -1,41 +1,48 @@ package ru.dbotthepony.kstarbound.io -import it.unimi.dsi.fastutil.bytes.ByteArrayList +import ru.dbotthepony.kommons.io.DelegateSyncher +import ru.dbotthepony.kommons.io.StreamCodec import ru.dbotthepony.kommons.io.readBinaryString -import ru.dbotthepony.kommons.util.IStruct2d -import ru.dbotthepony.kommons.util.IStruct2i import ru.dbotthepony.kommons.io.readDouble import ru.dbotthepony.kommons.io.readFloat -import ru.dbotthepony.kommons.io.readLong +import ru.dbotthepony.kommons.io.readInt import ru.dbotthepony.kommons.io.readSignedVarInt -import ru.dbotthepony.kstarbound.math.vector.readVector2d -import ru.dbotthepony.kstarbound.math.vector.readVector2f import ru.dbotthepony.kommons.io.writeBinaryString import ru.dbotthepony.kommons.io.writeDouble import ru.dbotthepony.kommons.io.writeFloat -import ru.dbotthepony.kommons.io.writeLong -import ru.dbotthepony.kommons.io.writeSignedVarInt import ru.dbotthepony.kommons.io.writeStruct2d import ru.dbotthepony.kommons.io.writeStruct2f +import ru.dbotthepony.kommons.io.writeStruct2i +import ru.dbotthepony.kommons.io.writeStruct3d +import ru.dbotthepony.kommons.io.writeStruct3f +import ru.dbotthepony.kommons.io.writeStruct3i +import ru.dbotthepony.kommons.io.writeStruct4d +import ru.dbotthepony.kommons.io.writeStruct4f +import ru.dbotthepony.kommons.io.writeStruct4i import ru.dbotthepony.kommons.math.RGBAColor -import ru.dbotthepony.kstarbound.math.AABB +import ru.dbotthepony.kommons.util.DelegateGetter +import ru.dbotthepony.kommons.util.DelegateSetter import ru.dbotthepony.kommons.util.Either +import ru.dbotthepony.kommons.util.IStruct2d import ru.dbotthepony.kommons.util.KOptional -import ru.dbotthepony.kstarbound.math.vector.Vector2d -import ru.dbotthepony.kstarbound.math.vector.Vector2i +import ru.dbotthepony.kommons.util.ListenableDelegate import ru.dbotthepony.kstarbound.Starbound +import ru.dbotthepony.kstarbound.math.AABB +import ru.dbotthepony.kstarbound.math.vector.Vector2d +import ru.dbotthepony.kstarbound.math.vector.Vector2f +import ru.dbotthepony.kstarbound.math.vector.Vector2i +import ru.dbotthepony.kstarbound.math.vector.Vector3d +import ru.dbotthepony.kstarbound.math.vector.Vector3f +import ru.dbotthepony.kstarbound.math.vector.Vector3i +import ru.dbotthepony.kstarbound.math.vector.Vector4d +import ru.dbotthepony.kstarbound.math.vector.Vector4f +import ru.dbotthepony.kstarbound.math.vector.Vector4i import ru.dbotthepony.kstarbound.world.ChunkPos -import java.io.DataInput -import java.io.DataOutput +import java.io.DataInputStream +import java.io.DataOutputStream import java.io.EOFException -import java.io.IOException import java.io.InputStream import java.io.OutputStream -import java.io.RandomAccessFile -import java.util.* -import java.util.function.IntConsumer -import java.util.function.IntSupplier -import kotlin.collections.ArrayList fun InputStream.readByteChar(): Char { return read().toChar() @@ -199,3 +206,60 @@ fun OutputStream.writeNullableDouble(value: Double?) = writeNullable(value) { wr fun OutputStream.writeNullableDouble(value: Double?, isLegacy: Boolean) = writeNullable(value) { if (isLegacy) writeFloat(it.toFloat()) else writeDouble(it) } fun OutputStream.writeDouble(value: Double, isLegacy: Boolean) = if (isLegacy) writeFloat(value.toFloat()) else writeDouble(value) fun OutputStream.writeStruct2d(value: IStruct2d, isLegacy: Boolean) = if (isLegacy) { writeFloat(value.component1().toFloat()); writeFloat(value.component2().toFloat()) } else { writeDouble(value.component1()); writeDouble(value.component2()) } + +private inline fun InputStream.read2(factory: (I, I) -> T, reader: (InputStream) -> I): T { + return factory(reader(this), reader(this)) +} + +private inline fun InputStream.read3(factory: (I, I, I) -> T, reader: (InputStream) -> I): T { + return factory(reader(this), reader(this), reader(this)) +} + +private inline fun InputStream.read4(factory: (I, I, I, I) -> T, reader: (InputStream) -> I): T { + return factory(reader(this), reader(this), reader(this), reader(this)) +} + +fun InputStream.readVector2i() = read2(::Vector2i) { it.readInt() } +fun InputStream.readVector2d() = read2(::Vector2d) { it.readDouble() } +fun InputStream.readVector2f() = read2(::Vector2f) { it.readFloat() } + +fun InputStream.readVector3i() = read3(::Vector3i) { it.readInt() } +fun InputStream.readVector3d() = read3(::Vector3d) { it.readDouble() } +fun InputStream.readVector3f() = read3(::Vector3f) { it.readFloat() } + +fun InputStream.readVector4i() = read4(::Vector4i) { it.readInt() } +fun InputStream.readVector4d() = read4(::Vector4d) { it.readDouble() } +fun InputStream.readVector4f() = read4(::Vector4f) { it.readFloat() } + +val Vector2iCodec = StreamCodec.Impl(DataInputStream::readVector2i, DataOutputStream::writeStruct2i) +val Vector2dCodec = StreamCodec.Impl(DataInputStream::readVector2d, DataOutputStream::writeStruct2d) +val Vector2fCodec = StreamCodec.Impl(DataInputStream::readVector2f, DataOutputStream::writeStruct2f) + +val Vector3iCodec = StreamCodec.Impl(DataInputStream::readVector3i, DataOutputStream::writeStruct3i) +val Vector3dCodec = StreamCodec.Impl(DataInputStream::readVector3d, DataOutputStream::writeStruct3d) +val Vector3fCodec = StreamCodec.Impl(DataInputStream::readVector3f, DataOutputStream::writeStruct3f) + +val Vector4iCodec = StreamCodec.Impl(DataInputStream::readVector4i, DataOutputStream::writeStruct4i) +val Vector4dCodec = StreamCodec.Impl(DataInputStream::readVector4d, DataOutputStream::writeStruct4d) +val Vector4fCodec = StreamCodec.Impl(DataInputStream::readVector4f, DataOutputStream::writeStruct4f) + +fun DelegateSyncher.vec2i(value: Vector2i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector2iCodec) +fun DelegateSyncher.vec2d(value: Vector2d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector2dCodec) +fun DelegateSyncher.vec2f(value: Vector2f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector2fCodec) + +fun DelegateSyncher.vec3i(value: Vector3i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector3iCodec) +fun DelegateSyncher.vec3d(value: Vector3d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector3dCodec) +fun DelegateSyncher.vec3f(value: Vector3f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector3fCodec) + +fun DelegateSyncher.vec4i(value: Vector4i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector4iCodec) +fun DelegateSyncher.vec4d(value: Vector4d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector4dCodec) +fun DelegateSyncher.vec4f(value: Vector4f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot( + ListenableDelegate.maskSmart(value, getter, setter), Vector4fCodec) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/math/vector/VectorsIO.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/math/vector/VectorsIO.kt deleted file mode 100644 index f828cbe7..00000000 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/math/vector/VectorsIO.kt +++ /dev/null @@ -1,72 +0,0 @@ -package ru.dbotthepony.kstarbound.math.vector - -import ru.dbotthepony.kommons.io.DelegateSyncher -import ru.dbotthepony.kommons.io.StreamCodec -import ru.dbotthepony.kommons.io.readDouble -import ru.dbotthepony.kommons.io.readFloat -import ru.dbotthepony.kommons.io.readInt -import ru.dbotthepony.kommons.io.writeStruct2d -import ru.dbotthepony.kommons.io.writeStruct2f -import ru.dbotthepony.kommons.io.writeStruct2i -import ru.dbotthepony.kommons.io.writeStruct3d -import ru.dbotthepony.kommons.io.writeStruct3f -import ru.dbotthepony.kommons.io.writeStruct3i -import ru.dbotthepony.kommons.io.writeStruct4d -import ru.dbotthepony.kommons.io.writeStruct4f -import ru.dbotthepony.kommons.io.writeStruct4i -import ru.dbotthepony.kommons.util.DelegateGetter -import ru.dbotthepony.kommons.util.DelegateSetter -import ru.dbotthepony.kommons.util.ListenableDelegate -import ru.dbotthepony.kstarbound.io.readDouble -import ru.dbotthepony.kstarbound.io.writeStruct2d -import java.io.DataInputStream -import java.io.DataOutputStream -import java.io.InputStream - -private inline fun InputStream.read2(factory: (I, I) -> T, reader: (InputStream) -> I): T { - return factory(reader(this), reader(this)) -} - -private inline fun InputStream.read3(factory: (I, I, I) -> T, reader: (InputStream) -> I): T { - return factory(reader(this), reader(this), reader(this)) -} - -private inline fun InputStream.read4(factory: (I, I, I, I) -> T, reader: (InputStream) -> I): T { - return factory(reader(this), reader(this), reader(this), reader(this)) -} - -fun InputStream.readVector2i() = read2(::Vector2i) { it.readInt() } -fun InputStream.readVector2d() = read2(::Vector2d) { it.readDouble() } -fun InputStream.readVector2f() = read2(::Vector2f) { it.readFloat() } - -fun InputStream.readVector3i() = read3(::Vector3i) { it.readInt() } -fun InputStream.readVector3d() = read3(::Vector3d) { it.readDouble() } -fun InputStream.readVector3f() = read3(::Vector3f) { it.readFloat() } - -fun InputStream.readVector4i() = read4(::Vector4i) { it.readInt() } -fun InputStream.readVector4d() = read4(::Vector4d) { it.readDouble() } -fun InputStream.readVector4f() = read4(::Vector4f) { it.readFloat() } - -val Vector2iCodec = StreamCodec.Impl(DataInputStream::readVector2i, DataOutputStream::writeStruct2i) -val Vector2dCodec = StreamCodec.Impl(DataInputStream::readVector2d, DataOutputStream::writeStruct2d) -val Vector2fCodec = StreamCodec.Impl(DataInputStream::readVector2f, DataOutputStream::writeStruct2f) - -val Vector3iCodec = StreamCodec.Impl(DataInputStream::readVector3i, DataOutputStream::writeStruct3i) -val Vector3dCodec = StreamCodec.Impl(DataInputStream::readVector3d, DataOutputStream::writeStruct3d) -val Vector3fCodec = StreamCodec.Impl(DataInputStream::readVector3f, DataOutputStream::writeStruct3f) - -val Vector4iCodec = StreamCodec.Impl(DataInputStream::readVector4i, DataOutputStream::writeStruct4i) -val Vector4dCodec = StreamCodec.Impl(DataInputStream::readVector4d, DataOutputStream::writeStruct4d) -val Vector4fCodec = StreamCodec.Impl(DataInputStream::readVector4f, DataOutputStream::writeStruct4f) - -fun DelegateSyncher.vec2i(value: Vector2i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector2iCodec) -fun DelegateSyncher.vec2d(value: Vector2d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector2dCodec) -fun DelegateSyncher.vec2f(value: Vector2f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector2fCodec) - -fun DelegateSyncher.vec3i(value: Vector3i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector3iCodec) -fun DelegateSyncher.vec3d(value: Vector3d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector3dCodec) -fun DelegateSyncher.vec3f(value: Vector3f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector3fCodec) - -fun DelegateSyncher.vec4i(value: Vector4i, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector4iCodec) -fun DelegateSyncher.vec4d(value: Vector4d, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector4dCodec) -fun DelegateSyncher.vec4f(value: Vector4f, setter: DelegateSetter = DelegateSetter.passthrough(), getter: DelegateGetter = DelegateGetter.passthrough()) = Slot(ListenableDelegate.maskSmart(value, getter, setter), Vector4fCodec)