/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.common; /** * Object wrapping an auto-expanding long[]. Like an ArrayList<Long> but without the autoboxing. */ public class LongArray { private static final double INNER_ARRAY_GROWTH_FACTOR = 1.8; private long[] mArray; private int mLength; public static LongArray createWithInitialCapacity(int initialCapacity) { return new LongArray(initialCapacity); } private LongArray(int initialCapacity) { mArray = new long[initialCapacity]; mLength = 0; } public void add(long value) { growArrayIfNeeded(); mArray[mLength++] = value; } public long get(int index) { if (index >= mLength) { throw new IndexOutOfBoundsException("" + index + " >= " + mLength); } return mArray[index]; } public void set(int index, long value) { if (index >= mLength) { throw new IndexOutOfBoundsException("" + index + " >= " + mLength); } mArray[index] = value; } public int size() { return mLength; } public boolean isEmpty() { return mLength == 0; } /** * Removes the *last* n items of the array all at once. */ public void dropTail(int n) { if (n > mLength) { throw new IndexOutOfBoundsException( "Trying to drop " + n + " items from array of length " + mLength); } mLength -= n; } private void growArrayIfNeeded() { if (mLength == mArray.length) { // If the initial capacity was 1 we need to ensure it at least grows by 1. int newSize = Math.max(mLength + 1, (int)(mLength * INNER_ARRAY_GROWTH_FACTOR)); long[] newArray = new long[newSize]; System.arraycopy(mArray, 0, newArray, 0, mLength); mArray = newArray; } } }