package org.andengine.util.adt.io.out;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
/**
* TODO Instead of having mMaximumGrow there could be some kind of AllocationStrategy object.
*
* (c) Zynga 2011
*
* @author Nicolas Gramlich <ngramlich@zynga.com>
* @since 02:19:02 - 14.08.2011
*/
public class ByteBufferOutputStream extends OutputStream {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
protected final int mMaximumGrow;
protected byte mData[];
protected int mCount;
// ===========================================================
// Constructors
// ===========================================================
public ByteBufferOutputStream(final int pInitialCapacity, final int pMaximumGrow) {
this.mMaximumGrow = pMaximumGrow;
this.mData = new byte[pInitialCapacity];
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void write(final int pByte) {
this.ensureCapacity(this.mCount + 1);
this.mData[this.mCount] = (byte) pByte;
this.mCount++;
}
@Override
public void write(final byte pData[], final int pOffset, final int pLength) {
this.ensureCapacity(this.mCount + pLength);
System.arraycopy(pData, pOffset, this.mData, this.mCount, pLength);
this.mCount += pLength;
}
@Override
public void close() throws IOException {
}
// ===========================================================
// Methods
// ===========================================================
private void ensureCapacity(final int pDesiredCapacity) {
if(pDesiredCapacity - this.mData.length > 0) {
this.grow(pDesiredCapacity);
}
}
private void grow(final int pDesiredCapacity) {
final int oldCapacity = this.mData.length;
final int grow = Math.min(this.mMaximumGrow, oldCapacity);
int newCapacity = oldCapacity + grow;
if(newCapacity - pDesiredCapacity < 0) {
newCapacity = pDesiredCapacity;
}
if(newCapacity < 0) {
if(pDesiredCapacity < 0) {
throw new OutOfMemoryError();
} else {
newCapacity = Integer.MAX_VALUE;
}
}
final byte[] data = new byte[newCapacity];
System.arraycopy(this.mData, 0, data, 0, this.mCount);
this.mData = data;
}
public ByteBuffer toByteBuffer() {
return ByteBuffer.wrap(this.mData, 0, this.mCount).slice();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}