package org.herac.tuxguitar.io.gpx.v6;

public class GPXByteBuffer {
	
	private static final int BUFFER_TYPE_BITS = 8;
	
	private int position;
	private byte[] buffer;
	
	public GPXByteBuffer( byte[] buffer ){
		this.buffer = buffer;
		this.position = 0;
	}
	
	public int length(){
		return ( this.buffer.length );
	}
	
	public int offset(){
		return ( this.position / BUFFER_TYPE_BITS );
	}
	
	public boolean end(){
		return ( this.offset() >= this.length() );
	}
	
	public int readBit(){
		int bit = -1;
		int byteIndex = ( this.position / BUFFER_TYPE_BITS );
		int byteOffset = ( (BUFFER_TYPE_BITS - 1) - ( this.position % BUFFER_TYPE_BITS ) );
		if( byteIndex >= 0 && byteIndex < this.buffer.length ){
			bit = ( ((this.buffer[ byteIndex ] & 0xff) >> byteOffset ) & 0x01 );
			this.position ++;
		}
		return bit;
	}
	
	public int readBits(int count){
		int bits = 0;
		for( int i = (count - 1) ; i >= 0 ; i -- ){
			bits |= ( readBit() << i  );
		}
		return bits;
	}
	
	public int readBitsReversed(int count){
		int bits = 0;
		for( int i = 0 ; i < count ; i ++ ){
			bits |= ( readBit() << i  );
		}
		return bits;
	}
	
	public byte[] readBytes(int count){
		byte[] bytes = new byte[count];
		for( int i = 0 ; i < count ; i++ ){
			bytes[i] = (byte)readBits(8);
		}
		return bytes;
	}
}
