#include "stdafx.h"

#include "ByteArrayOutputStream.h"

// Creates a new byte array output stream. The buffer capacity is initially 32 bytes, though its size increases if necessary.
ByteArrayOutputStream::ByteArrayOutputStream()
{
	count = 0;
	buf = byteArray( 32 );
}

//Creates a new byte array output stream, with a buffer capacity of the specified size, in bytes.
//Parameters:
//size - the initial size.
ByteArrayOutputStream::ByteArrayOutputStream(unsigned int size)
{
	count = 0;
	buf = byteArray( size );
}

ByteArrayOutputStream::~ByteArrayOutputStream()
{
	if (buf.data != NULL)
		delete[] buf.data;
}

//Writes the specified byte to this byte array output stream.
//Parameters:
//b - the byte to be written.
void ByteArrayOutputStream::write(unsigned int b)
{
	// If we will fill the buffer we need to make it bigger
	if( count + 1 >=  buf.length )
		buf.resize( buf.length * 2 );

	buf[count] = (byte) b;
	count++;
}

// Writes b.length bytes from the specified byte array to this output stream.
//The general contract for write(b) is that it should have exactly the same effect as the call write(b, 0, b.length).
void ByteArrayOutputStream::write(byteArray b)
{
	write(b, 0, b.length);
}

//Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
//Parameters:
//b - the data.
//off - the start offset in the data.
//len - the number of bytes to write.
void ByteArrayOutputStream::write(byteArray b, unsigned int offset, unsigned int length)
{
	assert( b.length >= offset + length );

	// If we will fill the buffer we need to make it bigger
	if( count + length >=  buf.length )
		buf.resize( max( count + length + 1, buf.length * 2 ) );

	XMemCpy( &buf[count], &b[offset], length );
	//std::copy( b->data+offset, b->data+offset+length, buf->data + count ); // Or this instead?

	count += length;
}

//Closing a ByteArrayOutputStream has no effect.
//The methods in this class can be called after the stream has been closed without generating an IOException.
void ByteArrayOutputStream::close()
{
}

//Creates a newly allocated byte array. Its size is the current size of this output stream and the valid contents of the buffer have been copied into it.
//Returns:
//the current contents of this output stream, as a byte array.
byteArray ByteArrayOutputStream::toByteArray()
{
	byteArray out(count);
	memcpy(out.data,buf.data,count);
	return out;
}