#pragma once

#include "CmPrerequisitesUtil.h"

namespace CamelotEngine
{
	/**
	 * @brief	Data block holding an array of bytes, usually used in serialization.
	 */
	class CM_UTILITY_EXPORT ManagedDataBlock
	{
	public:
		/**
		 * @brief	Constructor
		 *
		 * @param [in]	data		Array of bytes to store. Direct pointer to the provided
		 * 							array will be stored, no copying will be done. Data won't be modified
		 * 							unless "managed" is true.
		 * @param	size			Size of the array, in bytes.
		 * @param	managed			If true then the provided data array will be deleted once
		 * 							it is no longer being used. When serializing it is always faster to provide direct
		 * 							pointer to the data, but sometimes you need to provide a copy of the data
		 * 							instead (e.g. maybe it's needed in a different format). 
		 * 							In that case set managed to true so it can be properly freed.
		 */
		ManagedDataBlock(UINT8* data, UINT32 size, bool managed);
		ManagedDataBlock(const ManagedDataBlock& source);

		~ManagedDataBlock();

		/**
		 * @brief	Destroy underlying buffers for unmanaged data blocks.
		 */
		void destroy();

		UINT8* getData() { return mData; }
		UINT32 getSize() { return mData ? mSize : 0; }

	private:
		UINT8* mData;
		UINT32 mSize;
		bool mManaged;
		mutable bool mIsDataOwner;
	};
}