#[ MoreDefaults
  Automatically generated by the FlatBuffers compiler, do not modify.
  Or modify. I'm a message, not a cop.

  flatc version: 24.3.7

  Declared by  : 
]#

import Abc as Abc
import flatbuffers

type MoreDefaults* = object of FlatObj
func intsLength*(self: MoreDefaults): int = 
  let o = self.tab.Offset(4)
  if o != 0:
    return self.tab.VectorLen(o)
func ints*(self: MoreDefaults, j: int): int32 = 
  let o = self.tab.Offset(4)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return Get[int32](self.tab, x)
func ints*(self: MoreDefaults): seq[int32] = 
  let len = self.intsLength
  for i in countup(0, len - 1):
    result.add(self.ints(i))
func floatsLength*(self: MoreDefaults): int = 
  let o = self.tab.Offset(6)
  if o != 0:
    return self.tab.VectorLen(o)
func floats*(self: MoreDefaults, j: int): float32 = 
  let o = self.tab.Offset(6)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return Get[float32](self.tab, x)
func floats*(self: MoreDefaults): seq[float32] = 
  let len = self.floatsLength
  for i in countup(0, len - 1):
    result.add(self.floats(i))
func emptyString*(self: MoreDefaults): string =
  let o = self.tab.Offset(8)
  if o != 0:
    return self.tab.String(self.tab.Pos + o)
  return ""
func someString*(self: MoreDefaults): string =
  let o = self.tab.Offset(10)
  if o != 0:
    return self.tab.String(self.tab.Pos + o)
  return ""
func abcsLength*(self: MoreDefaults): int = 
  let o = self.tab.Offset(12)
  if o != 0:
    return self.tab.VectorLen(o)
func abcs*(self: MoreDefaults, j: int): Abc.Abc = 
  let o = self.tab.Offset(12)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return Abc.Abc(Get[int32](self.tab, x))
func abcs*(self: MoreDefaults): seq[Abc.Abc] = 
  let len = self.abcsLength
  for i in countup(0, len - 1):
    result.add(self.abcs(i))
func boolsLength*(self: MoreDefaults): int = 
  let o = self.tab.Offset(14)
  if o != 0:
    return self.tab.VectorLen(o)
func bools*(self: MoreDefaults, j: int): bool = 
  let o = self.tab.Offset(14)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[bool](self.tab, x)
func bools*(self: MoreDefaults): seq[bool] = 
  let len = self.boolsLength
  for i in countup(0, len - 1):
    result.add(self.bools(i))
proc MoreDefaultsStart*(builder: var Builder) =
  builder.StartObject(6)
proc MoreDefaultsAddints*(builder: var Builder, ints: uoffset) =
  builder.PrependSlot(0, ints, default(uoffset))
proc MoreDefaultsStartintsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MoreDefaultsAddfloats*(builder: var Builder, floats: uoffset) =
  builder.PrependSlot(1, floats, default(uoffset))
proc MoreDefaultsStartfloatsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MoreDefaultsAddemptyString*(builder: var Builder, emptyString: uoffset) =
  builder.PrependSlot(2, emptyString, default(uoffset))
proc MoreDefaultsAddsomeString*(builder: var Builder, someString: uoffset) =
  builder.PrependSlot(3, someString, default(uoffset))
proc MoreDefaultsAddabcs*(builder: var Builder, abcs: uoffset) =
  builder.PrependSlot(4, abcs, default(uoffset))
proc MoreDefaultsStartabcsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MoreDefaultsAddbools*(builder: var Builder, bools: uoffset) =
  builder.PrependSlot(5, bools, default(uoffset))
proc MoreDefaultsStartboolsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MoreDefaultsEnd*(builder: var Builder): uoffset =
  return builder.EndObject()
