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

package MyGame.Example

import com.google.flatbuffers.BaseVector
import com.google.flatbuffers.BooleanVector
import com.google.flatbuffers.ByteVector
import com.google.flatbuffers.Constants
import com.google.flatbuffers.DoubleVector
import com.google.flatbuffers.FlatBufferBuilder
import com.google.flatbuffers.FloatVector
import com.google.flatbuffers.LongVector
import com.google.flatbuffers.StringVector
import com.google.flatbuffers.Struct
import com.google.flatbuffers.Table
import com.google.flatbuffers.UnionVector
import java.nio.ByteBuffer
import java.nio.ByteOrder
import kotlin.math.sign

@Suppress("unused")
class StructOfStructs : Struct() {

    fun __init(_i: Int, _bb: ByteBuffer)  {
        __reset(_i, _bb)
    }
    fun __assign(_i: Int, _bb: ByteBuffer) : StructOfStructs {
        __init(_i, _bb)
        return this
    }
    val a : MyGame.Example.Ability? get() = a(MyGame.Example.Ability())
    fun a(obj: MyGame.Example.Ability) : MyGame.Example.Ability? = obj.__assign(bb_pos + 0, bb)
    val b : MyGame.Example.Test? get() = b(MyGame.Example.Test())
    fun b(obj: MyGame.Example.Test) : MyGame.Example.Test? = obj.__assign(bb_pos + 8, bb)
    val c : MyGame.Example.Ability? get() = c(MyGame.Example.Ability())
    fun c(obj: MyGame.Example.Ability) : MyGame.Example.Ability? = obj.__assign(bb_pos + 12, bb)
    companion object {
        fun createStructOfStructs(builder: FlatBufferBuilder, a_id: UInt, a_distance: UInt, b_a: Short, b_b: Byte, c_id: UInt, c_distance: UInt) : Int {
            builder.prep(4, 20)
            builder.prep(4, 8)
            builder.putInt(c_distance.toInt())
            builder.putInt(c_id.toInt())
            builder.prep(2, 4)
            builder.pad(1)
            builder.putByte(b_b)
            builder.putShort(b_a)
            builder.prep(4, 8)
            builder.putInt(a_distance.toInt())
            builder.putInt(a_id.toInt())
            return builder.offset()
        }
    }
}
