#pragma once

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

namespace Mix{ namespace Plugin{

	//! @class IReader
	//! @brief リーダーインターフェース
	class IReader
	{
	public:
		//! @enum SEEK_METHOD
		//! @brief シークメソッド列挙定数
		enum SEEK_METHOD
		{
			BEGIN	= 0,	//!< ソースの先頭から終端に向かって移動
			CURRENT	= 1,	//!< 現在の位置から移動
			END		= 2,	//!< ソースの終端から先頭に向かって移動
		};

	protected:
		//! @brief デストラクタ
		virtual ~IReader( void ) {}

	public:
		//! @brief サイズを取得します
		//! @return サイズを返します
		virtual unsigned long long GetSize( void ) const = 0;
		//! @brief 読み取り位置を取得します
		//! @return 読み取り位置を返します
		virtual unsigned long long GetPosition( void ) const = 0;
		//! @brief バッファに指定したサイズだけ読み取ります
		//! @param[in] pBuffer 読み取り先のバッファ
		//! @param[in] readSize バッファに読み込むサイズ( バイト単位 )
		//! @return 実際に読み取ったサイズを返します
		virtual unsigned int Read( void* pBuffer, unsigned int readSize ) = 0;
		//! @brief 指定したサイズだけ読み取ります
		//! @param[in] readSize 読み取るサイズ( バイト単位 )
		//! @param[out] result 実際に読み取ったサイズ( バイト単位 )
		//! @return 読み取りを開始するメモリのポインタを返します
		virtual const void* Read( unsigned int readSize, unsigned int& result ) = 0;
		//! @brief 読み取り位置を移動します
		//! @param[in] method 移動の基点を表す Mix::Plugin::IReader::SEEK_METHOD 列挙定数
		//! @param[in] distance 基点からの移動距離( バイト単位 )
		//! @return 移動後の読み取り位置を返します。
		virtual unsigned long long Seek( Mix::Plugin::IReader::SEEK_METHOD method, unsigned long long distance ) = 0;
	};

}}