/// private utility functions for memory manipulation

///|
fn memory_copy_forward(
  dst~ : @fmt.Memory,
  dst_start~ : Int,
  src~ : @fmt.Memory,
  src_start~ : Int,
  len~ : Int,
) -> Unit {
  let dst_end = dst_start + len
  for dst_ofs = dst_start, src_ofs = src_start
      dst_ofs < dst_end
      dst_ofs = dst_ofs + 1, src_ofs = src_ofs + 1 {
    dst[dst_ofs] = src[src_ofs]
  }
}

///|
fn memory_copy_backward(
  dst~ : @fmt.Memory,
  dst_start~ : Int,
  src~ : @fmt.Memory,
  src_start~ : Int,
  len~ : Int,
) -> Unit {
  for dst_ofs = dst_start + len - 1, src_ofs = src_start + len - 1
      dst_ofs >= dst_start
      dst_ofs = dst_ofs - 1, src_ofs = src_ofs - 1 {
    dst[dst_ofs] = src[src_ofs]
  }
}

///|
fn memory_fill(
  memory~ : @fmt.Memory,
  start~ : Int,
  len~ : Int,
  value~ : Byte,
) -> Unit {
  for ofs = start; ofs < start + len; ofs = ofs + 1 {
    memory[ofs] = value
  }
}