package kha.arrays;

/**
 * Maps a byte array over a byte buffer, allowing for mixed-type access of its contents.
 * This type unifies with all typed array classes, and vice-versa.
 */
extern class ByteArray {
	/**
	 * Underlying byte buffer.
	 */
	var buffer(get, null): ByteBuffer;

	/**
	 * Length in bytes of the byte array.
	 */
	var byteLength(get, null): Int;

	/**
	 * Byte offset into the underlying byte buffer.
	 */
	var byteOffset(get, null): Int;

	/**
	 * Creates a new array over a byte buffer.
	 * @param buffer underlying byte buffer
	 * @param byteOffset offset of the first byte of the array into the byte buffer, defaults to 0
	 * @param byteLength amount of bytes to map, defaults to entire buffer 
	 */
	function new(buffer: ByteBuffer, ?byteOffset: Int, ?byteLength: Int): Void;

	/**
	 * Creates a new array from scratch.
	 * @param byteLength number of bytes to create
	 * @return ByteArray
	 */
	static function make(byteLength: Int): ByteArray;

	function getInt8(byteOffset: Int): Int;
	function getUint8(byteOffset: Int): Int;
	function getInt16(byteOffset: Int): Int;
	function getUint16(byteOffset: Int): Int;
	function getInt32(byteOffset: Int): Int;
	function getUint32(byteOffset: Int): Int;
	function getFloat32(byteOffset: Int): FastFloat;
	function getFloat64(byteOffset: Int): Float;
	function setInt8(byteOffset: Int, value: Int): Void;
	function setUint8(byteOffset: Int, value: Int): Void;
	function setInt16(byteOffset: Int, value: Int): Void;
	function setUint16(byteOffset: Int, value: Int): Void;
	function setInt32(byteOffset: Int, value: Int): Void;
	function setUint32(byteOffset: Int, value: Int): Void;
	function setFloat32(byteOffset: Int, value: FastFloat): Void;
	function setFloat64(byteOffset: Int, value: Float): Void;

	function getInt16LE(byteOffset: Int): Int;
	function getUint16LE(byteOffset: Int): Int;
	function getInt32LE(byteOffset: Int): Int;
	function getUint32LE(byteOffset: Int): Int;
	function getFloat32LE(byteOffset: Int): FastFloat;
	function getFloat64LE(byteOffset: Int): Float;
	function setInt16LE(byteOffset: Int, value: Int): Void;
	function setUint16LE(byteOffset: Int, value: Int): Void;
	function setInt32LE(byteOffset: Int, value: Int): Void;
	function setUint32LE(byteOffset: Int, value: Int): Void;
	function setFloat32LE(byteOffset: Int, value: FastFloat): Void;
	function setFloat64LE(byteOffset: Int, value: Float): Void;

	function getInt16BE(byteOffset: Int): Int;
	function getUint16BE(byteOffset: Int): Int;
	function getInt32BE(byteOffset: Int): Int;
	function getUint32BE(byteOffset: Int): Int;
	function getFloat32BE(byteOffset: Int): FastFloat;
	function getFloat64BE(byteOffset: Int): Float;
	function setInt16BE(byteOffset: Int, value: Int): Void;
	function setUint16BE(byteOffset: Int, value: Int): Void;
	function setInt32BE(byteOffset: Int, value: Int): Void;
	function setUint32BE(byteOffset: Int, value: Int): Void;
	function setFloat32BE(byteOffset: Int, value: FastFloat): Void;
	function setFloat64BE(byteOffset: Int, value: Float): Void;

	function subarray(start: Int, ?end: Int): ByteArray;
}