package com.lvrenyang.qrcode;

/**
 * BitBuffer
 * 
 * @author Kazuhiko Arase
 */
class BitBuffer {

	private byte[] buffer;
	private int length;
	private int inclements;

	public BitBuffer() {
		inclements = 32;
		buffer = new byte[inclements];
		length = 0;
	}

	public byte[] getBuffer() {
		return buffer;
	}

	public int getLengthInBits() {
		return length;
	}

	public String toString() {
		StringBuilder buffer = new StringBuilder();
		for (int i = 0; i < getLengthInBits(); i++) {
			buffer.append(get(i) ? '1' : '0');
		}
		return buffer.toString();
	}

	private boolean get(int index) {
		return ((buffer[index / 8] >>> (7 - index % 8)) & 1) == 1;
	}

	public void put(int num, int length) {
		for (int i = 0; i < length; i++) {
			put(((num >>> (length - i - 1)) & 1) == 1);
		}
	}

	public void put(boolean bit) {

		if (length == buffer.length * 8) {
			byte[] newBuffer = new byte[buffer.length + inclements];
			System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
			buffer = newBuffer;
		}

		if (bit) {
			buffer[length / 8] |= (0x80 >>> (length % 8));
		}

		length++;
	}

}
