// Multiple options: // 1. C-like with no 'length' or 'push' // 2. Descriptors that can be constructed from lower level arrays class Array<T> { readonly capacity: i32; length: i32; ptr: usize; static fromPtr<T>(ptr: usize, capacity: i32): Array<T> { assert(capacity >= 0); const arr: Array<T> = new Array(0); store<i32>(changetype<Array<T>, usize>(arr), capacity); arr.length = ptr; arr.ptr = ptr; return arr; } constructor(capacity: i32 = 0) { assert(capacity >= 0); this.capacity = this.length = capacity; if (capacity > 0) { this.ptr = Heap.allocate(<usize>capacity); } else { this.ptr = 0; } } dispose(): void { store<i64>(changetype<this,usize>(this), 0); Heap.dispose(this.ptr); this.ptr = 0; Heap.dispose(changetype<this,usize>(this)); } }