105 lines
3.1 KiB
Java
105 lines
3.1 KiB
Java
package android.support.v4.util;
|
|
/* loaded from: classes.dex */
|
|
public class CircularArray<E> {
|
|
private int mCapacityBitmask;
|
|
private E[] mElements;
|
|
private int mHead;
|
|
private int mTail;
|
|
|
|
private void doubleCapacity() {
|
|
int n = this.mElements.length;
|
|
int r = n - this.mHead;
|
|
int newCapacity = n << 1;
|
|
if (newCapacity < 0) {
|
|
throw new RuntimeException("Too big");
|
|
}
|
|
Object[] a = new Object[newCapacity];
|
|
System.arraycopy(this.mElements, this.mHead, a, 0, r);
|
|
System.arraycopy(this.mElements, 0, a, r, this.mHead);
|
|
this.mElements = (E[]) a;
|
|
this.mHead = 0;
|
|
this.mTail = n;
|
|
this.mCapacityBitmask = newCapacity - 1;
|
|
}
|
|
|
|
public CircularArray() {
|
|
this(8);
|
|
}
|
|
|
|
public CircularArray(int minCapacity) {
|
|
if (minCapacity <= 0) {
|
|
throw new IllegalArgumentException("capacity must be positive");
|
|
}
|
|
int arrayCapacity = minCapacity;
|
|
arrayCapacity = Integer.bitCount(minCapacity) != 1 ? 1 << (Integer.highestOneBit(minCapacity) + 1) : arrayCapacity;
|
|
this.mCapacityBitmask = arrayCapacity - 1;
|
|
this.mElements = (E[]) new Object[arrayCapacity];
|
|
}
|
|
|
|
public final void addFirst(E e) {
|
|
this.mHead = (this.mHead - 1) & this.mCapacityBitmask;
|
|
this.mElements[this.mHead] = e;
|
|
if (this.mHead == this.mTail) {
|
|
doubleCapacity();
|
|
}
|
|
}
|
|
|
|
public final void addLast(E e) {
|
|
this.mElements[this.mTail] = e;
|
|
this.mTail = (this.mTail + 1) & this.mCapacityBitmask;
|
|
if (this.mTail == this.mHead) {
|
|
doubleCapacity();
|
|
}
|
|
}
|
|
|
|
public final E popFirst() {
|
|
if (this.mHead == this.mTail) {
|
|
throw new ArrayIndexOutOfBoundsException();
|
|
}
|
|
E result = this.mElements[this.mHead];
|
|
this.mElements[this.mHead] = null;
|
|
this.mHead = (this.mHead + 1) & this.mCapacityBitmask;
|
|
return result;
|
|
}
|
|
|
|
public final E popLast() {
|
|
if (this.mHead == this.mTail) {
|
|
throw new ArrayIndexOutOfBoundsException();
|
|
}
|
|
int t = (this.mTail - 1) & this.mCapacityBitmask;
|
|
E result = this.mElements[t];
|
|
this.mElements[t] = null;
|
|
this.mTail = t;
|
|
return result;
|
|
}
|
|
|
|
public final E getFirst() {
|
|
if (this.mHead == this.mTail) {
|
|
throw new ArrayIndexOutOfBoundsException();
|
|
}
|
|
return this.mElements[this.mHead];
|
|
}
|
|
|
|
public final E getLast() {
|
|
if (this.mHead == this.mTail) {
|
|
throw new ArrayIndexOutOfBoundsException();
|
|
}
|
|
return this.mElements[(this.mTail - 1) & this.mCapacityBitmask];
|
|
}
|
|
|
|
public final E get(int i) {
|
|
if (i < 0 || i >= size()) {
|
|
throw new ArrayIndexOutOfBoundsException();
|
|
}
|
|
int p = (this.mHead + i) & this.mCapacityBitmask;
|
|
return this.mElements[p];
|
|
}
|
|
|
|
public final int size() {
|
|
return (this.mTail - this.mHead) & this.mCapacityBitmask;
|
|
}
|
|
|
|
public final boolean isEmpty() {
|
|
return this.mHead == this.mTail;
|
|
}
|
|
}
|