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

  flatc version: 24.3.25

  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()
