/// <reference path="../../assembly.d.ts" />

@global()
class Memory {

  static allocate(size: usize): usize {
    const ptr: usize = load<usize>(sizeof<usize>());
    store<usize>(sizeof<usize>(), ptr + size);
    return ptr;
  }

  static free(ptr: usize): void {
  }

  static copy(src: usize, dst: usize, count: usize): void {
    for (let i: usize = 0; i < count; ++i)
      store<u8>(dst + i, load<u8>(src + i));
  }

  static compare(src: usize, dst: usize, count: usize): i32 {
    for (let i: usize = 0; i < count; ++i) {
      const d: i32 = (load<u8>(src + i) as i32) - (load<u8>(dst + i) as i32);
      if (d) return d;
    }
    return 0;
  }
}