///|
/// Set a bit in the data section, XOR'd with its schema default.
pub fn StructBuilder::set_bool(
  self : StructBuilder,
  bit_offset : Int,
  value : Bool,
  default? : Bool = false,
) -> Unit raise CapnpError {
  if bit_offset < 0 {
    raise Bounds("negative bit offset")
  }
  let pos = b_data(self, bit_offset / 8, 1)
  let mask : Byte = 1 << (bit_offset % 8)
  self.owner.arena[pos] = if value != default {
    self.owner.arena[pos] | mask
  } else {
    self.owner.arena[pos] & mask.lnot()
  }
}

///|
pub fn StructBuilder::set_uint8(
  self : StructBuilder,
  byte_offset : Int,
  value : Byte,
  default? : Byte = 0,
) -> Unit raise CapnpError {
  b_write(
    self.owner,
    b_data(self, byte_offset, 1),
    (value ^ default).to_uint64(),
    1,
  )
}

///|
pub fn StructBuilder::set_uint16(
  self : StructBuilder,
  byte_offset : Int,
  value : UInt,
  default? : UInt = 0,
) -> Unit raise CapnpError {
  if value > 65535U || default > 65535U {
    raise Bounds("uint16 value or default exceeds 65535")
  }
  b_write(
    self.owner,
    b_data(self, byte_offset, 2),
    UInt64::extend_uint(value ^ default),
    2,
  )
}

///|
pub fn StructBuilder::set_uint32(
  self : StructBuilder,
  byte_offset : Int,
  value : UInt,
  default? : UInt = 0,
) -> Unit raise CapnpError {
  b_write(
    self.owner,
    b_data(self, byte_offset, 4),
    UInt64::extend_uint(value ^ default),
    4,
  )
}

///|
pub fn StructBuilder::set_uint64(
  self : StructBuilder,
  byte_offset : Int,
  value : UInt64,
  default? : UInt64 = 0,
) -> Unit raise CapnpError {
  b_write(self.owner, b_data(self, byte_offset, 8), value ^ default, 8)
}

///|
pub fn StructBuilder::set_int8(
  self : StructBuilder,
  byte_offset : Int,
  value : Int,
  default? : Int = 0,
) -> Unit raise CapnpError {
  if value < -128 || value > 127 || default < -128 || default > 127 {
    raise Bounds("int8 value or default outside -128..127")
  }
  b_write(
    self.owner,
    b_data(self, byte_offset, 1),
    ((value ^ default) & 255).to_uint64(),
    1,
  )
}

///|
pub fn StructBuilder::set_int16(
  self : StructBuilder,
  byte_offset : Int,
  value : Int,
  default? : Int = 0,
) -> Unit raise CapnpError {
  if value < -32768 || value > 32767 || default < -32768 || default > 32767 {
    raise Bounds("int16 value or default outside -32768..32767")
  }
  b_write(
    self.owner,
    b_data(self, byte_offset, 2),
    ((value ^ default) & 65535).to_uint64(),
    2,
  )
}

///|
pub fn StructBuilder::set_int32(
  self : StructBuilder,
  byte_offset : Int,
  value : Int,
  default? : Int = 0,
) -> Unit raise CapnpError {
  b_write(
    self.owner,
    b_data(self, byte_offset, 4),
    UInt64::extend_uint((value ^ default).reinterpret_as_uint()),
    4,
  )
}

///|
pub fn StructBuilder::set_int64(
  self : StructBuilder,
  byte_offset : Int,
  value : Int64,
  default? : Int64 = 0,
) -> Unit raise CapnpError {
  b_write(
    self.owner,
    b_data(self, byte_offset, 8),
    (value ^ default).reinterpret_as_uint64(),
    8,
  )
}

///|
pub fn StructBuilder::set_float32(
  self : StructBuilder,
  byte_offset : Int,
  value : Float,
  default? : Float = 0.0,
) -> Unit raise CapnpError {
  self.set_uint32(
    byte_offset,
    value.reinterpret_as_uint(),
    default=default.reinterpret_as_uint(),
  )
}

///|
pub fn StructBuilder::set_float64(
  self : StructBuilder,
  byte_offset : Int,
  value : Double,
  default? : Double = 0.0,
) -> Unit raise CapnpError {
  self.set_uint64(
    byte_offset,
    value.reinterpret_as_uint64(),
    default=default.reinterpret_as_uint64(),
  )
}