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

  flatc version: 22.10.25

  Declared by  : 
  Rooting type : optional_scalars.ScalarStuff ()
]#

import OptionalByte as optional_scalars_OptionalByte
import flatbuffers
import std/options

type ScalarStuff* = object of FlatObj
func justI8*(self: ScalarStuff): int8 =
  let o = self.tab.Offset(4)
  if o != 0:
    return Get[int8](self.tab, self.tab.Pos + o)
  return 0
func `justI8=`*(self: var ScalarStuff, n: int8): bool =
  return self.tab.MutateSlot(4, n)
func maybeI8*(self: ScalarStuff): Option[int8] =
  let o = self.tab.Offset(6)
  if o != 0:
    return some(Get[int8](self.tab, self.tab.Pos + o))
func `maybeI8=`*(self: var ScalarStuff, n: Option[int8]): bool =
  return self.tab.MutateSlot(6, n)
func defaultI8*(self: ScalarStuff): int8 =
  let o = self.tab.Offset(8)
  if o != 0:
    return Get[int8](self.tab, self.tab.Pos + o)
  return 42
func `defaultI8=`*(self: var ScalarStuff, n: int8): bool =
  return self.tab.MutateSlot(8, n)
func justU8*(self: ScalarStuff): uint8 =
  let o = self.tab.Offset(10)
  if o != 0:
    return Get[uint8](self.tab, self.tab.Pos + o)
  return 0
func `justU8=`*(self: var ScalarStuff, n: uint8): bool =
  return self.tab.MutateSlot(10, n)
func maybeU8*(self: ScalarStuff): Option[uint8] =
  let o = self.tab.Offset(12)
  if o != 0:
    return some(Get[uint8](self.tab, self.tab.Pos + o))
func `maybeU8=`*(self: var ScalarStuff, n: Option[uint8]): bool =
  return self.tab.MutateSlot(12, n)
func defaultU8*(self: ScalarStuff): uint8 =
  let o = self.tab.Offset(14)
  if o != 0:
    return Get[uint8](self.tab, self.tab.Pos + o)
  return 42
func `defaultU8=`*(self: var ScalarStuff, n: uint8): bool =
  return self.tab.MutateSlot(14, n)
func justI16*(self: ScalarStuff): int16 =
  let o = self.tab.Offset(16)
  if o != 0:
    return Get[int16](self.tab, self.tab.Pos + o)
  return 0
func `justI16=`*(self: var ScalarStuff, n: int16): bool =
  return self.tab.MutateSlot(16, n)
func maybeI16*(self: ScalarStuff): Option[int16] =
  let o = self.tab.Offset(18)
  if o != 0:
    return some(Get[int16](self.tab, self.tab.Pos + o))
func `maybeI16=`*(self: var ScalarStuff, n: Option[int16]): bool =
  return self.tab.MutateSlot(18, n)
func defaultI16*(self: ScalarStuff): int16 =
  let o = self.tab.Offset(20)
  if o != 0:
    return Get[int16](self.tab, self.tab.Pos + o)
  return 42
func `defaultI16=`*(self: var ScalarStuff, n: int16): bool =
  return self.tab.MutateSlot(20, n)
func justU16*(self: ScalarStuff): uint16 =
  let o = self.tab.Offset(22)
  if o != 0:
    return Get[uint16](self.tab, self.tab.Pos + o)
  return 0
func `justU16=`*(self: var ScalarStuff, n: uint16): bool =
  return self.tab.MutateSlot(22, n)
func maybeU16*(self: ScalarStuff): Option[uint16] =
  let o = self.tab.Offset(24)
  if o != 0:
    return some(Get[uint16](self.tab, self.tab.Pos + o))
func `maybeU16=`*(self: var ScalarStuff, n: Option[uint16]): bool =
  return self.tab.MutateSlot(24, n)
func defaultU16*(self: ScalarStuff): uint16 =
  let o = self.tab.Offset(26)
  if o != 0:
    return Get[uint16](self.tab, self.tab.Pos + o)
  return 42
func `defaultU16=`*(self: var ScalarStuff, n: uint16): bool =
  return self.tab.MutateSlot(26, n)
func justI32*(self: ScalarStuff): int32 =
  let o = self.tab.Offset(28)
  if o != 0:
    return Get[int32](self.tab, self.tab.Pos + o)
  return 0
func `justI32=`*(self: var ScalarStuff, n: int32): bool =
  return self.tab.MutateSlot(28, n)
func maybeI32*(self: ScalarStuff): Option[int32] =
  let o = self.tab.Offset(30)
  if o != 0:
    return some(Get[int32](self.tab, self.tab.Pos + o))
func `maybeI32=`*(self: var ScalarStuff, n: Option[int32]): bool =
  return self.tab.MutateSlot(30, n)
func defaultI32*(self: ScalarStuff): int32 =
  let o = self.tab.Offset(32)
  if o != 0:
    return Get[int32](self.tab, self.tab.Pos + o)
  return 42
func `defaultI32=`*(self: var ScalarStuff, n: int32): bool =
  return self.tab.MutateSlot(32, n)
func justU32*(self: ScalarStuff): uint32 =
  let o = self.tab.Offset(34)
  if o != 0:
    return Get[uint32](self.tab, self.tab.Pos + o)
  return 0
func `justU32=`*(self: var ScalarStuff, n: uint32): bool =
  return self.tab.MutateSlot(34, n)
func maybeU32*(self: ScalarStuff): Option[uint32] =
  let o = self.tab.Offset(36)
  if o != 0:
    return some(Get[uint32](self.tab, self.tab.Pos + o))
func `maybeU32=`*(self: var ScalarStuff, n: Option[uint32]): bool =
  return self.tab.MutateSlot(36, n)
func defaultU32*(self: ScalarStuff): uint32 =
  let o = self.tab.Offset(38)
  if o != 0:
    return Get[uint32](self.tab, self.tab.Pos + o)
  return 42
func `defaultU32=`*(self: var ScalarStuff, n: uint32): bool =
  return self.tab.MutateSlot(38, n)
func justI64*(self: ScalarStuff): int64 =
  let o = self.tab.Offset(40)
  if o != 0:
    return Get[int64](self.tab, self.tab.Pos + o)
  return 0
func `justI64=`*(self: var ScalarStuff, n: int64): bool =
  return self.tab.MutateSlot(40, n)
func maybeI64*(self: ScalarStuff): Option[int64] =
  let o = self.tab.Offset(42)
  if o != 0:
    return some(Get[int64](self.tab, self.tab.Pos + o))
func `maybeI64=`*(self: var ScalarStuff, n: Option[int64]): bool =
  return self.tab.MutateSlot(42, n)
func defaultI64*(self: ScalarStuff): int64 =
  let o = self.tab.Offset(44)
  if o != 0:
    return Get[int64](self.tab, self.tab.Pos + o)
  return 42
func `defaultI64=`*(self: var ScalarStuff, n: int64): bool =
  return self.tab.MutateSlot(44, n)
func justU64*(self: ScalarStuff): uint64 =
  let o = self.tab.Offset(46)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `justU64=`*(self: var ScalarStuff, n: uint64): bool =
  return self.tab.MutateSlot(46, n)
func maybeU64*(self: ScalarStuff): Option[uint64] =
  let o = self.tab.Offset(48)
  if o != 0:
    return some(Get[uint64](self.tab, self.tab.Pos + o))
func `maybeU64=`*(self: var ScalarStuff, n: Option[uint64]): bool =
  return self.tab.MutateSlot(48, n)
func defaultU64*(self: ScalarStuff): uint64 =
  let o = self.tab.Offset(50)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 42
func `defaultU64=`*(self: var ScalarStuff, n: uint64): bool =
  return self.tab.MutateSlot(50, n)
func justF32*(self: ScalarStuff): float32 =
  let o = self.tab.Offset(52)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return 0.0
func `justF32=`*(self: var ScalarStuff, n: float32): bool =
  return self.tab.MutateSlot(52, n)
func maybeF32*(self: ScalarStuff): Option[float32] =
  let o = self.tab.Offset(54)
  if o != 0:
    return some(Get[float32](self.tab, self.tab.Pos + o))
func `maybeF32=`*(self: var ScalarStuff, n: Option[float32]): bool =
  return self.tab.MutateSlot(54, n)
func defaultF32*(self: ScalarStuff): float32 =
  let o = self.tab.Offset(56)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return 42.0
func `defaultF32=`*(self: var ScalarStuff, n: float32): bool =
  return self.tab.MutateSlot(56, n)
func justF64*(self: ScalarStuff): float64 =
  let o = self.tab.Offset(58)
  if o != 0:
    return Get[float64](self.tab, self.tab.Pos + o)
  return 0.0
func `justF64=`*(self: var ScalarStuff, n: float64): bool =
  return self.tab.MutateSlot(58, n)
func maybeF64*(self: ScalarStuff): Option[float64] =
  let o = self.tab.Offset(60)
  if o != 0:
    return some(Get[float64](self.tab, self.tab.Pos + o))
func `maybeF64=`*(self: var ScalarStuff, n: Option[float64]): bool =
  return self.tab.MutateSlot(60, n)
func defaultF64*(self: ScalarStuff): float64 =
  let o = self.tab.Offset(62)
  if o != 0:
    return Get[float64](self.tab, self.tab.Pos + o)
  return 42.0
func `defaultF64=`*(self: var ScalarStuff, n: float64): bool =
  return self.tab.MutateSlot(62, n)
func justBool*(self: ScalarStuff): bool =
  let o = self.tab.Offset(64)
  if o != 0:
    return Get[bool](self.tab, self.tab.Pos + o)
  return false
func `justBool=`*(self: var ScalarStuff, n: bool): bool =
  return self.tab.MutateSlot(64, n)
func maybeBool*(self: ScalarStuff): Option[bool] =
  let o = self.tab.Offset(66)
  if o != 0:
    return some(Get[bool](self.tab, self.tab.Pos + o))
func `maybeBool=`*(self: var ScalarStuff, n: Option[bool]): bool =
  return self.tab.MutateSlot(66, n)
func defaultBool*(self: ScalarStuff): bool =
  let o = self.tab.Offset(68)
  if o != 0:
    return Get[bool](self.tab, self.tab.Pos + o)
  return true
func `defaultBool=`*(self: var ScalarStuff, n: bool): bool =
  return self.tab.MutateSlot(68, n)
func justEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =
  let o = self.tab.Offset(70)
  if o != 0:
    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))
  return type(result)(0)
func `justEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =
  return self.tab.MutateSlot(70, n)
func maybeEnum*(self: ScalarStuff): Option[optional_scalars_OptionalByte.OptionalByte] =
  let o = self.tab.Offset(72)
  if o != 0:
    return some(optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o)))
func `maybeEnum=`*(self: var ScalarStuff, n: Option[optional_scalars_OptionalByte.OptionalByte]): bool =
  return self.tab.MutateSlot(72, n)
func defaultEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =
  let o = self.tab.Offset(74)
  if o != 0:
    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))
  return type(result)(1)
func `defaultEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =
  return self.tab.MutateSlot(74, n)
proc ScalarStuffStart*(builder: var Builder) =
  builder.StartObject(36)
proc ScalarStuffAddjustI8*(builder: var Builder, justI8: int8) =
  builder.PrependSlot(0, justI8, default(int8))
proc ScalarStuffAddmaybeI8*(builder: var Builder, maybeI8: int8) =
  builder.PrependSlot(1, maybeI8, default(int8))
proc ScalarStuffAdddefaultI8*(builder: var Builder, defaultI8: int8) =
  builder.PrependSlot(2, defaultI8, default(int8))
proc ScalarStuffAddjustU8*(builder: var Builder, justU8: uint8) =
  builder.PrependSlot(3, justU8, default(uint8))
proc ScalarStuffAddmaybeU8*(builder: var Builder, maybeU8: uint8) =
  builder.PrependSlot(4, maybeU8, default(uint8))
proc ScalarStuffAdddefaultU8*(builder: var Builder, defaultU8: uint8) =
  builder.PrependSlot(5, defaultU8, default(uint8))
proc ScalarStuffAddjustI16*(builder: var Builder, justI16: int16) =
  builder.PrependSlot(6, justI16, default(int16))
proc ScalarStuffAddmaybeI16*(builder: var Builder, maybeI16: int16) =
  builder.PrependSlot(7, maybeI16, default(int16))
proc ScalarStuffAdddefaultI16*(builder: var Builder, defaultI16: int16) =
  builder.PrependSlot(8, defaultI16, default(int16))
proc ScalarStuffAddjustU16*(builder: var Builder, justU16: uint16) =
  builder.PrependSlot(9, justU16, default(uint16))
proc ScalarStuffAddmaybeU16*(builder: var Builder, maybeU16: uint16) =
  builder.PrependSlot(10, maybeU16, default(uint16))
proc ScalarStuffAdddefaultU16*(builder: var Builder, defaultU16: uint16) =
  builder.PrependSlot(11, defaultU16, default(uint16))
proc ScalarStuffAddjustI32*(builder: var Builder, justI32: int32) =
  builder.PrependSlot(12, justI32, default(int32))
proc ScalarStuffAddmaybeI32*(builder: var Builder, maybeI32: int32) =
  builder.PrependSlot(13, maybeI32, default(int32))
proc ScalarStuffAdddefaultI32*(builder: var Builder, defaultI32: int32) =
  builder.PrependSlot(14, defaultI32, default(int32))
proc ScalarStuffAddjustU32*(builder: var Builder, justU32: uint32) =
  builder.PrependSlot(15, justU32, default(uint32))
proc ScalarStuffAddmaybeU32*(builder: var Builder, maybeU32: uint32) =
  builder.PrependSlot(16, maybeU32, default(uint32))
proc ScalarStuffAdddefaultU32*(builder: var Builder, defaultU32: uint32) =
  builder.PrependSlot(17, defaultU32, default(uint32))
proc ScalarStuffAddjustI64*(builder: var Builder, justI64: int64) =
  builder.PrependSlot(18, justI64, default(int64))
proc ScalarStuffAddmaybeI64*(builder: var Builder, maybeI64: int64) =
  builder.PrependSlot(19, maybeI64, default(int64))
proc ScalarStuffAdddefaultI64*(builder: var Builder, defaultI64: int64) =
  builder.PrependSlot(20, defaultI64, default(int64))
proc ScalarStuffAddjustU64*(builder: var Builder, justU64: uint64) =
  builder.PrependSlot(21, justU64, default(uint64))
proc ScalarStuffAddmaybeU64*(builder: var Builder, maybeU64: uint64) =
  builder.PrependSlot(22, maybeU64, default(uint64))
proc ScalarStuffAdddefaultU64*(builder: var Builder, defaultU64: uint64) =
  builder.PrependSlot(23, defaultU64, default(uint64))
proc ScalarStuffAddjustF32*(builder: var Builder, justF32: float32) =
  builder.PrependSlot(24, justF32, default(float32))
proc ScalarStuffAddmaybeF32*(builder: var Builder, maybeF32: float32) =
  builder.PrependSlot(25, maybeF32, default(float32))
proc ScalarStuffAdddefaultF32*(builder: var Builder, defaultF32: float32) =
  builder.PrependSlot(26, defaultF32, default(float32))
proc ScalarStuffAddjustF64*(builder: var Builder, justF64: float64) =
  builder.PrependSlot(27, justF64, default(float64))
proc ScalarStuffAddmaybeF64*(builder: var Builder, maybeF64: float64) =
  builder.PrependSlot(28, maybeF64, default(float64))
proc ScalarStuffAdddefaultF64*(builder: var Builder, defaultF64: float64) =
  builder.PrependSlot(29, defaultF64, default(float64))
proc ScalarStuffAddjustBool*(builder: var Builder, justBool: bool) =
  builder.PrependSlot(30, justBool, default(bool))
proc ScalarStuffAddmaybeBool*(builder: var Builder, maybeBool: bool) =
  builder.PrependSlot(31, maybeBool, default(bool))
proc ScalarStuffAdddefaultBool*(builder: var Builder, defaultBool: bool) =
  builder.PrependSlot(32, defaultBool, default(bool))
proc ScalarStuffAddjustEnum*(builder: var Builder, justEnum: int8) =
  builder.PrependSlot(33, justEnum, default(int8))
proc ScalarStuffAddmaybeEnum*(builder: var Builder, maybeEnum: int8) =
  builder.PrependSlot(34, maybeEnum, default(int8))
proc ScalarStuffAdddefaultEnum*(builder: var Builder, defaultEnum: int8) =
  builder.PrependSlot(35, defaultEnum, default(int8))
proc ScalarStuffEnd*(builder: var Builder): uoffset =
  return builder.EndObject()
