// automatically generated by the FlatBuffers compiler, do not modify

package optional_scalars

import java.nio.*
import kotlin.math.sign
import com.google.flatbuffers.*

@Suppress("unused")
class ScalarStuff : Table() {

    fun __init(_i: Int, _bb: ByteBuffer)  {
        __reset(_i, _bb)
    }
    fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {
        __init(_i, _bb)
        return this
    }
    val justI8 : Byte
        get() {
            val o = __offset(4)
            return if(o != 0) bb.get(o + bb_pos) else 0
        }
    val maybeI8 : Byte?
        get() {
            val o = __offset(6)
            return if(o != 0) bb.get(o + bb_pos) else null
        }
    val defaultI8 : Byte
        get() {
            val o = __offset(8)
            return if(o != 0) bb.get(o + bb_pos) else 42
        }
    val justU8 : UByte
        get() {
            val o = __offset(10)
            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u
        }
    val maybeU8 : UByte?
        get() {
            val o = __offset(12)
            return if(o != 0) bb.get(o + bb_pos).toUByte() else null
        }
    val defaultU8 : UByte
        get() {
            val o = __offset(14)
            return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u
        }
    val justI16 : Short
        get() {
            val o = __offset(16)
            return if(o != 0) bb.getShort(o + bb_pos) else 0
        }
    val maybeI16 : Short?
        get() {
            val o = __offset(18)
            return if(o != 0) bb.getShort(o + bb_pos) else null
        }
    val defaultI16 : Short
        get() {
            val o = __offset(20)
            return if(o != 0) bb.getShort(o + bb_pos) else 42
        }
    val justU16 : UShort
        get() {
            val o = __offset(22)
            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
        }
    val maybeU16 : UShort?
        get() {
            val o = __offset(24)
            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null
        }
    val defaultU16 : UShort
        get() {
            val o = __offset(26)
            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u
        }
    val justI32 : Int
        get() {
            val o = __offset(28)
            return if(o != 0) bb.getInt(o + bb_pos) else 0
        }
    val maybeI32 : Int?
        get() {
            val o = __offset(30)
            return if(o != 0) bb.getInt(o + bb_pos) else null
        }
    val defaultI32 : Int
        get() {
            val o = __offset(32)
            return if(o != 0) bb.getInt(o + bb_pos) else 42
        }
    val justU32 : UInt
        get() {
            val o = __offset(34)
            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u
        }
    val maybeU32 : UInt?
        get() {
            val o = __offset(36)
            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null
        }
    val defaultU32 : UInt
        get() {
            val o = __offset(38)
            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u
        }
    val justI64 : Long
        get() {
            val o = __offset(40)
            return if(o != 0) bb.getLong(o + bb_pos) else 0L
        }
    val maybeI64 : Long?
        get() {
            val o = __offset(42)
            return if(o != 0) bb.getLong(o + bb_pos) else null
        }
    val defaultI64 : Long
        get() {
            val o = __offset(44)
            return if(o != 0) bb.getLong(o + bb_pos) else 42L
        }
    val justU64 : ULong
        get() {
            val o = __offset(46)
            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL
        }
    val maybeU64 : ULong?
        get() {
            val o = __offset(48)
            return if(o != 0) bb.getLong(o + bb_pos).toULong() else null
        }
    val defaultU64 : ULong
        get() {
            val o = __offset(50)
            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL
        }
    val justF32 : Float
        get() {
            val o = __offset(52)
            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f
        }
    val maybeF32 : Float?
        get() {
            val o = __offset(54)
            return if(o != 0) bb.getFloat(o + bb_pos) else null
        }
    val defaultF32 : Float
        get() {
            val o = __offset(56)
            return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f
        }
    val justF64 : Double
        get() {
            val o = __offset(58)
            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0
        }
    val maybeF64 : Double?
        get() {
            val o = __offset(60)
            return if(o != 0) bb.getDouble(o + bb_pos) else null
        }
    val defaultF64 : Double
        get() {
            val o = __offset(62)
            return if(o != 0) bb.getDouble(o + bb_pos) else 42.0
        }
    val justBool : Boolean
        get() {
            val o = __offset(64)
            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false
        }
    val maybeBool : Boolean?
        get() {
            val o = __offset(66)
            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null
        }
    val defaultBool : Boolean
        get() {
            val o = __offset(68)
            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true
        }
    val justEnum : Byte
        get() {
            val o = __offset(70)
            return if(o != 0) bb.get(o + bb_pos) else 0
        }
    val maybeEnum : Byte?
        get() {
            val o = __offset(72)
            return if(o != 0) bb.get(o + bb_pos) else null
        }
    val defaultEnum : Byte
        get() {
            val o = __offset(74)
            return if(o != 0) bb.get(o + bb_pos) else 1
        }
    companion object {
        fun validateVersion() = Constants.FLATBUFFERS_22_10_25()
        fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())
        fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {
            _bb.order(ByteOrder.LITTLE_ENDIAN)
            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
        }
        fun ScalarStuffBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "NULL")
        fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean, justEnum: Byte, maybeEnum: Byte?, defaultEnum: Byte) : Int {
            builder.startTable(36)
            addDefaultF64(builder, defaultF64)
            maybeF64?.run { addMaybeF64(builder, maybeF64) }
            addJustF64(builder, justF64)
            addDefaultU64(builder, defaultU64)
            maybeU64?.run { addMaybeU64(builder, maybeU64) }
            addJustU64(builder, justU64)
            addDefaultI64(builder, defaultI64)
            maybeI64?.run { addMaybeI64(builder, maybeI64) }
            addJustI64(builder, justI64)
            addDefaultF32(builder, defaultF32)
            maybeF32?.run { addMaybeF32(builder, maybeF32) }
            addJustF32(builder, justF32)
            addDefaultU32(builder, defaultU32)
            maybeU32?.run { addMaybeU32(builder, maybeU32) }
            addJustU32(builder, justU32)
            addDefaultI32(builder, defaultI32)
            maybeI32?.run { addMaybeI32(builder, maybeI32) }
            addJustI32(builder, justI32)
            addDefaultU16(builder, defaultU16)
            maybeU16?.run { addMaybeU16(builder, maybeU16) }
            addJustU16(builder, justU16)
            addDefaultI16(builder, defaultI16)
            maybeI16?.run { addMaybeI16(builder, maybeI16) }
            addJustI16(builder, justI16)
            addDefaultEnum(builder, defaultEnum)
            maybeEnum?.run { addMaybeEnum(builder, maybeEnum) }
            addJustEnum(builder, justEnum)
            addDefaultBool(builder, defaultBool)
            maybeBool?.run { addMaybeBool(builder, maybeBool) }
            addJustBool(builder, justBool)
            addDefaultU8(builder, defaultU8)
            maybeU8?.run { addMaybeU8(builder, maybeU8) }
            addJustU8(builder, justU8)
            addDefaultI8(builder, defaultI8)
            maybeI8?.run { addMaybeI8(builder, maybeI8) }
            addJustI8(builder, justI8)
            return endScalarStuff(builder)
        }
        fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(36)
        fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)
        fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)
        fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)
        fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)
        fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)
        fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)
        fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)
        fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)
        fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)
        fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)
        fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)
        fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)
        fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)
        fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)
        fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)
        fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)
        fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)
        fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)
        fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)
        fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)
        fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)
        fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)
        fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)
        fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)
        fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)
        fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)
        fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)
        fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)
        fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)
        fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)
        fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)
        fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)
        fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)
        fun addJustEnum(builder: FlatBufferBuilder, justEnum: Byte) = builder.addByte(33, justEnum, 0)
        fun addMaybeEnum(builder: FlatBufferBuilder, maybeEnum: Byte) = builder.addByte(34, maybeEnum, 0)
        fun addDefaultEnum(builder: FlatBufferBuilder, defaultEnum: Byte) = builder.addByte(35, defaultEnum, 1)
        fun endScalarStuff(builder: FlatBufferBuilder) : Int {
            val o = builder.endTable()
            return o
        }
        fun finishScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, "NULL")
        fun finishSizePrefixedScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, "NULL")
    }
}
