///|
fn reverse(xs : Memory, start : Int, end : Int) -> Unit {
  let mut i = start
  let mut j = end - 1
  while i < j {
    let temp = xs[i]
    xs[i] = xs[j]
    xs[j] = temp
    i += 1
    j -= 1
  }
}

///|
pub impl Format for UInt with write(value, buffer, start) {
  if value == 0 {
    buffer[start + 0] = '0'
    return 1
  }
  let mut value = value
  let mut offset = start
  while value > 0 {
    let rem = value % 10
    buffer[offset] = UInt::to_byte(rem + b'0'.to_uint())
    value /= 10
    offset += 1
  }
  reverse(buffer, start, offset)
  offset - start
}

///|
/// supremum
pub impl Format for UInt with count(_) -> Int {
  UInt_Digits10
}

///|
pub impl LittleEndianFormat for UInt with write(value, buffer, start) {
  let b0 = (value & 0xFF).to_byte()
  let b1 = ((value >> 8) & 0xFF).to_byte()
  let b2 = ((value >> 16) & 0xFF).to_byte()
  let b3 = ((value >> 24) & 0xFF).to_byte()
  buffer[start + 0] = b0
  buffer[start + 1] = b1
  buffer[start + 2] = b2
  buffer[start + 3] = b3
  4
}

///|
/// supremum
pub impl LittleEndianFormat for UInt with count(_) -> Int {
  4
}

///|
pub impl BigEndianFormat for UInt with write(value, buffer, start) {
  let b0 = ((value >> 24) & 0xFF).to_byte()
  let b1 = ((value >> 16) & 0xFF).to_byte()
  let b2 = ((value >> 8) & 0xFF).to_byte()
  let b3 = (value & 0xFF).to_byte()
  buffer[start + 0] = b0
  buffer[start + 1] = b1
  buffer[start + 2] = b2
  buffer[start + 3] = b3
  4
}

///|
/// supremum
pub impl BigEndianFormat for UInt with count(_) -> Int {
  4
}

///|
pub impl HexLowerFormat for UInt with write(value, buffer, start) {
  if value == 0 {
    buffer[start + 0] = '0'
    return 1
  }
  let mut value = value
  let mut offset = start
  while value > 0 {
    let rem = value & 0xF
    buffer[offset] = lower_digit_table[rem.reinterpret_as_int()]
    value = value >> 4
    offset += 1
  }
  reverse(buffer, start, offset)
  offset - start
}

///|
/// supremum
pub impl HexLowerFormat for UInt with count(_) -> Int {
  8
}

///|
pub impl HexUpperFormat for UInt with write(value, buffer, start) {
  if value == 0 {
    buffer[start + 0] = '0'
    return 1
  }
  let mut value = value
  let mut offset = start
  while value > 0 {
    let rem = value & 0xF
    buffer[offset] = upper_digit_table[rem.reinterpret_as_int()]
    value = value >> 4
    offset += 1
  }
  reverse(buffer, start, offset)
  offset - start
}

///|
/// supremum
pub impl HexUpperFormat for UInt with count(_) -> Int {
  8
}