#pragma once

#include "Buffer.h"
#include "Definitions.h"

class IntBuffer;
class FloatBuffer;

class ByteBuffer : public Buffer
{
protected:
	byte *buffer;
	ByteOrder byteOrder;

public:
	ByteBuffer(unsigned int capacity);
	static ByteBuffer *allocateDirect(int capacity);
	ByteBuffer( unsigned int capacity, byte *backingArray );
	virtual ~ByteBuffer();

	static ByteBuffer *wrap(byteArray &b);
	static ByteBuffer *allocate(unsigned int capacity);
	void order(ByteOrder a);
	ByteBuffer *flip();
	byte *getBuffer();
	int getSize();
	int getInt();
	int getInt(unsigned int index);
	void get(byteArray) {}	// 4J - TODO
	byte get(int index);
	__int64 getLong();
	short getShort();
	void getShortArray(shortArray &s);
	ByteBuffer *put(int index, byte b);
	ByteBuffer *putInt(int value);
	ByteBuffer *putInt(unsigned int index, int value);
	ByteBuffer *putShort(short value);
	ByteBuffer *putShortArray(shortArray &s);
	ByteBuffer *putLong(__int64 value);
	ByteBuffer *put(byteArray inputArray);
	byteArray array();
	IntBuffer *asIntBuffer();
	FloatBuffer *asFloatBuffer();

};


#ifdef __PS3__
// we're using the RSX now to upload textures to vram, so we need th main ram textures allocated from io space
class ByteBuffer_IO : public ByteBuffer
{
public:
	ByteBuffer_IO(unsigned int capacity);
	~ByteBuffer_IO();
};

#endif // __PS3__