#pragma once

//! @file Mix/IO/IReader.h
//! @brief リーダーインターフェースインクルードファイル

#include "Mix/IO/IStream.h"

namespace Mix{ namespace IO{

	//! @class IReader
	//! @brief リーダーインターフェース
	//! @note
	//! リーダーにはファイルを直接操作する「ファイルリーダー」と、メモリ内のファイルを操作する「バッファドリーダー」があります。<br>
	//! 前者はファイルを直接操作するため、メモリ消費は少ないですが、リーダーを解放(ファイルを閉じる)するまで、新たにリーダーを作成することができません。<br>
	//! 後者はメモリ内のファイルを操作するため、メモリ消費は多いですが、複数のリーダーを作成することができ、また複製することもできます。<br>
	//! 複製はファイルが格納されているメモリを共有するため、必要以上にメモリを消費することはありません。
	class IReader : public Mix::IO::IStream
	{
	protected:
		//! @brief デストラクタ
		virtual ~IReader( void ){}

	public:
		//! @brief 現在の位置から指定されたバッファに読み込みます
		//! @param[in] pReadBuffer 読み込み先バッファ
		//! @param[in] readSize 読み込むサイズ
		//! @return 実際に読み込んだサイズを返します
		virtual UInt32 Read( void* pReadBuffer, UInt32 readSize ) = 0;
		//! @brief 指定された位置にシークします
		//! @param[in] seekMethod シーク方式を表す Mix::IO::SEEK_METHOD 列挙定数
		//! @param[in] offset オフセット
		//! @return シーク後の位置を返します
		virtual UInt64 Seek( Mix::IO::SEEK_METHOD seekMethod, Int64 offset ) = 0;
		//! @brief 現在の位置を取得します
		//! @return 現在の位置を返します
		virtual UInt64 GetPos( void ) const = 0;
		//! @brief サイズを取得します
		//! @return サイズを返します
		virtual UInt64 GetSize( void ) const = 0;
		//! @brief ファイルパスを取得します
		//! @return ファイルパスを返します
		virtual const wchar_t* GetFilePath( void ) const = 0;

		//! @brief クローンを作成します
		//! @param[out] ppClone 作成したクローンを渡す Mix::IO::IReader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note クローンが作成できるのは、アクセスタイプが A_READ、ソースタイプが S_BUFFER に限定されます。
		virtual Boolean Clone( Mix::IO::IReader** ppClone ) = 0;
	};

}}
