// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace growable_fixed_array {
// TODO(pwong): Support FixedTypedArrays.
struct GrowableFixedArray {
  macro Push(obj: Object) {
    this.EnsureCapacity();
    this.array.objects[this.length++] = obj;
  }
  macro ResizeFixedArray(newCapacity: intptr): FixedArray {
    assert(this.length >= 0);
    assert(newCapacity >= 0);
    assert(newCapacity >= this.length);
    const first: intptr = 0;
    return ExtractFixedArray(this.array, first, this.length, newCapacity);
  }
  macro EnsureCapacity() {
    assert(this.length <= this.capacity);
    if (this.capacity == this.length) {
      // Growth rate is analog to JSObject::NewElementsCapacity:
      // new_capacity = (current_capacity + (current_capacity >> 1)) + 16.
      this.capacity = this.capacity + (this.capacity >> 1) + 16;
      this.array = this.ResizeFixedArray(this.capacity);
    }
  }

  macro ToJSArray(implicit context: Context)(): JSArray {
    const nativeContext: NativeContext = LoadNativeContext(context);
    const map: Map =
        LoadJSArrayElementsMap(ElementsKind::PACKED_ELEMENTS, nativeContext);
    const fixedArray: FixedArray = this.ResizeFixedArray(this.length);
    const lengthSmi = Convert<Smi>(this.length);
    return AllocateJSArray(map, fixedArray, lengthSmi);
  }

  array: FixedArray;
  // TODO(v8:4153): make capacity and length uintptr
  capacity: intptr;
  length: intptr;
}

macro NewGrowableFixedArray(): GrowableFixedArray {
  return GrowableFixedArray{array: kEmptyFixedArray, capacity: 0, length: 0};
}
}
