All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.ensarsarajcic.kotlinx.serialization.msgpack.unsigned.UnsignedCoders.kt Maven / Gradle / Ivy

package com.ensarsarajcic.kotlinx.serialization.msgpack.unsigned

import com.ensarsarajcic.kotlinx.serialization.msgpack.exceptions.MsgPackSerializationException
import com.ensarsarajcic.kotlinx.serialization.msgpack.internal.InlineDecoderHelper
import com.ensarsarajcic.kotlinx.serialization.msgpack.internal.InlineEncoderHelper
import com.ensarsarajcic.kotlinx.serialization.msgpack.unsigned.utils.joinToNumber
import com.ensarsarajcic.kotlinx.serialization.msgpack.unsigned.utils.splitToByteArray
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.AbstractDecoder
import kotlinx.serialization.encoding.AbstractEncoder

private object UnsignedTypes {
    const val UINT8 = 0xcc.toByte()
    const val UINT16 = 0xcd.toByte()
    const val UINT32 = 0xce.toByte()
    const val UINT64 = 0xcf.toByte()
}

class UByteEncoder(private val encoderHelper: InlineEncoderHelper) : AbstractEncoder() {
    override val serializersModule = encoderHelper.serializersModule

    override fun encodeByte(value: Byte) {
        encoderHelper.outputBuffer.add(UnsignedTypes.UINT8)
        encoderHelper.outputBuffer.add(value)
    }
}

class UShortEncoder(private val encoderHelper: InlineEncoderHelper) : AbstractEncoder() {
    override val serializersModule = encoderHelper.serializersModule

    override fun encodeShort(value: Short) {
        encoderHelper.outputBuffer.add(UnsignedTypes.UINT16)
        encoderHelper.outputBuffer.addAll(value.splitToByteArray())
    }
}

class UIntEncoder(private val encoderHelper: InlineEncoderHelper) : AbstractEncoder() {
    override val serializersModule = encoderHelper.serializersModule

    override fun encodeInt(value: Int) {
        encoderHelper.outputBuffer.add(UnsignedTypes.UINT32)
        encoderHelper.outputBuffer.addAll(value.splitToByteArray())
    }
}

class ULongEncoder(private val encoderHelper: InlineEncoderHelper) : AbstractEncoder() {
    override val serializersModule = encoderHelper.serializersModule

    override fun encodeLong(value: Long) {
        encoderHelper.outputBuffer.add(UnsignedTypes.UINT64)
        encoderHelper.outputBuffer.addAll(value.splitToByteArray())
    }
}

class UByteDecoder(private val decoderHelper: InlineDecoderHelper) : AbstractDecoder() {
    override val serializersModule = decoderHelper.serializersModule

    override fun decodeElementIndex(descriptor: SerialDescriptor): Int = 0

    override fun decodeByte(): Byte {
        val type = decoderHelper.inputBuffer.requireNextByte()
        if (type != UnsignedTypes.UINT8) throw MsgPackSerializationException.deserialization(decoderHelper.inputBuffer, "Expected UINT8 type, but found $type")
        return decoderHelper.inputBuffer.requireNextByte()
    }
}

class UShortDecoder(private val decoderHelper: InlineDecoderHelper) : AbstractDecoder() {
    override val serializersModule = decoderHelper.serializersModule

    override fun decodeElementIndex(descriptor: SerialDescriptor): Int = 0

    override fun decodeShort(): Short {
        val type = decoderHelper.inputBuffer.requireNextByte()
        if (type != UnsignedTypes.UINT16) throw MsgPackSerializationException.deserialization(decoderHelper.inputBuffer, "Expected UINT16 type, but found $type")
        return decoderHelper.inputBuffer.takeNext(2).joinToNumber()
    }
}

class UIntDecoder(private val decoderHelper: InlineDecoderHelper) : AbstractDecoder() {
    override val serializersModule = decoderHelper.serializersModule

    override fun decodeElementIndex(descriptor: SerialDescriptor): Int = 0

    override fun decodeInt(): Int {
        val type = decoderHelper.inputBuffer.requireNextByte()
        if (type != UnsignedTypes.UINT32) throw MsgPackSerializationException.deserialization(decoderHelper.inputBuffer, "Expected UINT32 type, but found $type")
        return decoderHelper.inputBuffer.takeNext(4).joinToNumber()
    }
}

class ULongDecoder(private val decoderHelper: InlineDecoderHelper) : AbstractDecoder() {
    override val serializersModule = decoderHelper.serializersModule

    override fun decodeElementIndex(descriptor: SerialDescriptor): Int = 0

    override fun decodeLong(): Long {
        val type = decoderHelper.inputBuffer.requireNextByte()
        if (type != UnsignedTypes.UINT64) throw MsgPackSerializationException.deserialization(decoderHelper.inputBuffer, "Expected UINT64 type, but found $type")
        return decoderHelper.inputBuffer.takeNext(8).joinToNumber()
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy