/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.db;

/**
 * User: fmike  Date: 12.03.2003  Time: 17:33:57
 */
final class DbByteBuffer {

	byte[] data;
	private int size;

	public DbByteBuffer(final int capacity) {
		data = new byte[capacity];
	}

	public DbByteBuffer() {
		data = new byte[16];
	}

	public DbByteBuffer(final byte[] data) {
		this.data = data;
	}

	public void prepareToAdd(final int nElementsToAdd) {
		ensureCapacity(size + nElementsToAdd);
	}

	private void ensureCapacity(int newCapacity) {
		if (newCapacity > data.length) {
			newCapacity = newCapacity > (data.length * 2) ? newCapacity : data.length * 2;
			final byte[] newArr = new byte[newCapacity];
			System.arraycopy(data, 0, newArr, 0, size);
			data = newArr;
		}
	}

	final byte[] toArray() {
		final byte[] result = new byte[size];
		System.arraycopy(data, 0, result, 0, size);
		return result;
	}

	public void add(final byte[] addData) {
		ensureCapacity(size + addData.length);
		_add(addData);
	}

	private void _add(final byte[] addData) {
		System.arraycopy(addData, 0, data, size, addData.length);
		size += addData.length;
	}


	public void add(final byte[] addData, final int from, final int length) {
		ensureCapacity(size + length);
		System.arraycopy(addData, from, data, size, length);
		size += length;
	}

	public void addFromTo(final byte[] addData, final int from, final int to) {
		ensureCapacity(size + (to - from));
		System.arraycopy(addData, from, data, size, to - from);
		size += to - from;
	}


	public void add(final byte v) {
		ensureCapacity(size + 1);
		data[size] = v;
		size++;
	}

	public void add(final short v) {
		ensureCapacity(size + 2);
		DbPacker.pack2(data, size, v);
		size += 2;
	}

	public void add(final char v) {
		ensureCapacity(size + 2);
		_add(v);
	}

	private void _add(final char v) {
		DbPacker.pack2(data, size, (short) v);
		size += 2;
	}

	public void add(final int v) {
		ensureCapacity(size + 4);
		_add(v);
	}

	void _add(final int v) {
		DbPacker.pack4(data, size, v);
		size += 4;
	}

	public void add(final long v) {
		ensureCapacity(size + 8);
		_add(v);
	}

	private void _add(final long v) {
		DbPacker.pack8(data, size, v);
		size += 8;
	}

	public int getSize() {
		return size;
	}

	public void add(final int[] v) {
		final int len = v.length;
		ensureCapacity(size + (len << 2));
		for (int i = 0; i < len; i++) {
			DbPacker.pack4(data, size + (i << 2), v[i]);
		}
		size += len << 2;
	}

	public void clear() {
		size = 0;
	}

	public void add(final char[] charBuf, final int from, final int length) {
		ensureCapacity(size + (length << 1));
		for (int i = from; i < length; i++) {
			_add(charBuf[i]);
		}
	}

	public void add(final char[] chars) {
		add(chars, 0, chars.length);
	}


}