112a9d9c8Sopenharmony_ci// bindgen-flags: --rustified-enum ".*"
212a9d9c8Sopenharmony_ci
312a9d9c8Sopenharmony_citemplate<typename T>
412a9d9c8Sopenharmony_ciclass nsTArray {
512a9d9c8Sopenharmony_ci    T* mBuff;
612a9d9c8Sopenharmony_ci};
712a9d9c8Sopenharmony_ci
812a9d9c8Sopenharmony_citemplate<typename T>
912a9d9c8Sopenharmony_ciclass nsStyleAutoArray
1012a9d9c8Sopenharmony_ci{
1112a9d9c8Sopenharmony_cipublic:
1212a9d9c8Sopenharmony_ci  // This constructor places a single element in mFirstElement.
1312a9d9c8Sopenharmony_ci  enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT };
1412a9d9c8Sopenharmony_ci  explicit nsStyleAutoArray(WithSingleInitialElement) {}
1512a9d9c8Sopenharmony_ci  nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; }
1612a9d9c8Sopenharmony_ci  nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) {
1712a9d9c8Sopenharmony_ci    mFirstElement = aOther.mFirstElement;
1812a9d9c8Sopenharmony_ci    mOtherElements = aOther.mOtherElements;
1912a9d9c8Sopenharmony_ci    return *this;
2012a9d9c8Sopenharmony_ci  }
2112a9d9c8Sopenharmony_ci
2212a9d9c8Sopenharmony_ci  bool operator==(const nsStyleAutoArray& aOther) const {
2312a9d9c8Sopenharmony_ci    return Length() == aOther.Length() &&
2412a9d9c8Sopenharmony_ci           mFirstElement == aOther.mFirstElement &&
2512a9d9c8Sopenharmony_ci           mOtherElements == aOther.mOtherElements;
2612a9d9c8Sopenharmony_ci  }
2712a9d9c8Sopenharmony_ci  bool operator!=(const nsStyleAutoArray& aOther) const {
2812a9d9c8Sopenharmony_ci    return !(*this == aOther);
2912a9d9c8Sopenharmony_ci  }
3012a9d9c8Sopenharmony_ci
3112a9d9c8Sopenharmony_ci  unsigned long Length() const {
3212a9d9c8Sopenharmony_ci    return mOtherElements.Length() + 1;
3312a9d9c8Sopenharmony_ci  }
3412a9d9c8Sopenharmony_ci  const T& operator[](unsigned long aIndex) const {
3512a9d9c8Sopenharmony_ci    return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
3612a9d9c8Sopenharmony_ci  }
3712a9d9c8Sopenharmony_ci  T& operator[](unsigned long aIndex) {
3812a9d9c8Sopenharmony_ci    return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
3912a9d9c8Sopenharmony_ci  }
4012a9d9c8Sopenharmony_ci
4112a9d9c8Sopenharmony_ci  void EnsureLengthAtLeast(unsigned long aMinLen) {
4212a9d9c8Sopenharmony_ci    if (aMinLen > 0) {
4312a9d9c8Sopenharmony_ci      mOtherElements.EnsureLengthAtLeast(aMinLen - 1);
4412a9d9c8Sopenharmony_ci    }
4512a9d9c8Sopenharmony_ci  }
4612a9d9c8Sopenharmony_ci
4712a9d9c8Sopenharmony_ci  void SetLengthNonZero(unsigned long aNewLen) {
4812a9d9c8Sopenharmony_ci    mOtherElements.SetLength(aNewLen - 1);
4912a9d9c8Sopenharmony_ci  }
5012a9d9c8Sopenharmony_ci
5112a9d9c8Sopenharmony_ci  void TruncateLengthNonZero(unsigned long aNewLen) {
5212a9d9c8Sopenharmony_ci    mOtherElements.TruncateLength(aNewLen - 1);
5312a9d9c8Sopenharmony_ci  }
5412a9d9c8Sopenharmony_ci
5512a9d9c8Sopenharmony_ciprivate:
5612a9d9c8Sopenharmony_ci  T mFirstElement;
5712a9d9c8Sopenharmony_ci  nsTArray<T> mOtherElements;
5812a9d9c8Sopenharmony_ci};
59