package org.jcodec.common;
import static java.lang.System.arraycopy;
import java.util.Arrays;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class LongArrayList {
private static final int DEFAULT_GROW_AMOUNT = 128;
private long[] storage;
private int limit;
private int start;
private int growAmount;
public static LongArrayList createLongArrayList() {
return new LongArrayList(DEFAULT_GROW_AMOUNT);
}
public LongArrayList(int growAmount) {
this.growAmount = growAmount;
this.storage = new long[growAmount];
}
public long[] toArray() {
long[] result = new long[limit - start];
arraycopy(storage, start, result, 0, limit - start);
return result;
}
public void add(long val) {
if (limit > storage.length - 1) {
long[] ns = new long[storage.length + growAmount - start];
arraycopy(storage, start, ns, 0, storage.length - start);
storage = ns;
limit -= start;
start = 0;
}
storage[limit++] = val;
}
public void push(long id) {
this.add(id);
}
public long pop() {
if (limit <= start)
throw new IllegalStateException();
return storage[limit--];
}
public void set(int index, int value) {
storage[index + start] = value;
}
public long get(int index) {
return storage[index + start];
}
public long shift() {
if(start >= limit)
throw new IllegalStateException();
return storage[start++];
}
public void fill(int from, int to, int val) {
if (to > storage.length) {
long[] ns = new long[to + growAmount - start];
arraycopy(storage, start, ns, 0, storage.length - start);
storage = ns;
}
Arrays.fill(storage, from, to, val);
limit = Math.max(limit, to);
}
public int size() {
return limit - start;
}
public void addAll(long[] other) {
if (limit + other.length >= storage.length) {
long[] ns = new long[limit + growAmount + other.length - start];
arraycopy(storage, start, ns, 0, limit);
storage = ns;
}
arraycopy(other, 0, storage, limit, other.length);
limit += other.length;
}
public void clear() {
limit = 0;
start = 0;
}
public boolean contains(long needle) {
for (int i = start; i < limit; i++)
if (storage[i] == needle)
return true;
return false;
}
}