NameSpace System
NameSpace IO

Class BinaryReader

Public 'constructor
	/*!
	@date 2008/02/27
	@auther NoWest
	@brief BinaryReaderクラスの新しいインスタンスを初期化します。
	@param 対象となるストリーム
	*/
	Sub BinaryReader(input As Stream)
		stream = input
		coding = New System.Text.UTF8Encoding()
	End Sub
	/*!
	@date 2008/02/27
	@auther NoWest
	@brief BinaryReaderクラスの新しいインスタンスを初期化します。
	@param 対象となるストリーム
	@param 文字列操作時のエンコーディングを指定
	*/
	Sub BinaryReader(input As Stream, encoding As System.Text.Encoding)
		This.stream = input
		This.coding = encoding
	End Sub

	Sub ~BinaryReader()
		This.Close()
	End Sub

Public 'propaty
	/*!
	@date 2008/02/27
	@auther NoWest
	@brief BinaryReader の基になるストリームへのアクセスを公開します。
	@return 基となったストリーム
	*/	
	Function BaseStream() As System.IO.Stream
		Return stream
	End Function

Public 'method
	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のBinaryReaderの基となったストリームをクローズします。
	*/	 
	Virtual Sub Close()
		This.Dispose()
	End Sub

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief BinaryReaderクラスで使われたリソースを解放します。
	*/	 
	Virtual Sub Dispose()
		This.Dispose(True)
	End Sub

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 読み取り可能な次の文字を返します。バイトの位置または文字の位置は変化しません。
	@return 読み取り可能な次の文字
	*/
	Virtual Function PeekChar() As Long
		'TODO
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 基になるストリームからエンコーディングに従って文字を読み取り、ストリームの現在位置を進めます。
	@return 読み込んだ文字
	*/
	Virtual Function Read() As Long
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 基になるストリームからデータを読み取り、ストリームの現在位置を進めます。
	@param ストリームから読み込んだデータを格納するバッファ
	@param データを格納するバッファの読み取り開始位置
	@param 読み込むデータサイズ
	@retval 実際に読み込んだデータのバイト数
	@retval 0 ストリームの末尾に達している
	*/
	Virtual Function Read(buffer As *Byte, index As Long, count As Long) As Long
		Return This.stream.Read(buffer, index, count)
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 基になるストリームから指定されたエンコーディングに従って文字列を読み取り、ストリームの現在位置を進めます。
	@param ストリームから読み込んだ文字列を格納する文字列バッファ
	@param データを格納する文字配列の読み取り開始位置
	@param 読み込む文字の長さ
	@retval 実際に読み込んだ合計文字数
	@retval 0 ストリームの末尾に達している
	*/
	Virtual Function Read(buffer As *Char, index As Long, count As Long) As Long
		Return This.stream.Read(buffer As *Byte, index, count)
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから Boolean値を読み取り、ストリームの現在位置を 1 バイトだけ進めます。
	@return 1byteのBoolean値
	*/
	Virtual Function ReadBoolean() As Boolean
		Return This.stream.ReadByte() As Boolean
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから次のバイトを読み取り、ストリームの現在位置を 1 バイトだけ進めます。
	@return 符号無しの1バイト整数
	*/
	Virtual Function ReadByte() As Byte
		Return This.stream.ReadByte() As Byte
	End Function

	'現在のストリームからバイト配列に count で指定したバイト数分のバイトを読み取り、count で指定したバイト数だけ現在位置を進めます。
/*	Virtual Function ReadBytes() As Array<Byte>
		TODO:
	End Function*/

	'現在のストリームの次の文字を読み取り、使用した Encoding とストリームから読み取った特定の文字に従ってストリームの現在位置を進めます。
/*	Virtual Function ReadChar() As Char
	End Function*/

	'現在のストリームから count で指定した文字数分の文字を読み取り、そのデータを文字配列として返します。使用した Encoding とストリームから読み取った特定の文字に従って現在位置を進めます。
/*	Virtual Function ReadChars() As Array<Char>
		TODO:
	End Function*/

	'現在のストリームから10進数値を読み取り、ストリームの現在位置を16バイトだけ進めます。
/*	Virtual Function ReadDecimal() As ActiveBasic.COM.Decimal
		TODO:
	End Function*/

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから8バイト浮動小数点値を読み取り、ストリームの現在位置を8バイトだけ進めます。
	@return 8バイト浮動小数点値
	*/
	Virtual Function ReadDouble() As Double
		Dim buffer As Double
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 8)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから2バイト符号付き整数を読み取り、ストリームの現在位置を2バイトだけ進めます。
	@return 2バイト符号付き整数値
	*/
	Virtual Function ReadInt16() As Integer
		Dim buffer As Integer
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 2)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから4バイト符号付き整数を読み取り、ストリームの現在位置を4バイトだけ進めます。
	@return 4バイト符号付き整数値
	*/
	Virtual Function ReadInt32() As Long
		Dim buffer As Long
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 4)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから8バイト符号付き整数を読み取り、ストリームの現在位置を8バイトだけ進めます。
	@return 8バイト符号付き整数値
	*/
	Virtual Function ReadInt64() As Int64
		Dim buffer As Int64
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 8)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから符号付きバイトを読み取り、ストリームの現在位置を1バイトだけ進めます。
	@return 1バイト符号付き整数値
	*/
	Virtual Function ReadSByte() As SByte
		Dim buffer As SByte
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 1)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから4バイト浮動小数点値を読み取り、ストリームの現在位置を4バイトだけ進めます。
	@return 4バイト浮動小数点値
	*/
	Virtual Function ReadSingle() As Single
		Dim buffer As Single
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 4)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから文字列を読み取ります。文字列の先頭に長さを付け、7ビットの整数としてまとめてエンコードします。
	@return String値
	*/
	Virtual Function ReadString() As String
		Return ""
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief リトルエンディアンエンコーディングを使用して現在のストリームから2バイト符号なし整数を読み取り、ストリームの位置を2バイトだけ進めます。
	@return 2バイト符号なし整数値
	*/
	Virtual Function ReadUInt16() As Word
		Dim buffer As Word
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 2)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから4バイト符号なし整数を読み取り、ストリームの位置を4バイトだけ進めます。
	@return 4バイト符号なし整数値
	*/
	Virtual Function ReadUInt32() As DWord
		Dim buffer As DWord
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 4)
		Return buffer
	End Function

	/*!
	@date 2008/02/27
	@auther NoWest
	@brief 現在のストリームから8バイト符号なし整数を読み取り、ストリームの位置を8バイトだけ進めます。
	@return 8バイト符号なし整数値
	*/
	Virtual Function ReadUInt64() As QWord
		Dim buffer As QWord
		This.stream.Read(VarPtr(buffer) As *Byte, 0, 8)
		Return buffer
	End Function

Protected 'method
	'BinaryReader によって使用されているアンマネージ リソースを解放し、オプションでマネージリソースも解放します。
	Virtual Sub Dispose(disposing As Boolean)
		This.stream.Close()
	End Sub

	'指定したバイト数分だけストリームから読み取ったバイトを内部バッファに格納します。
	Virtual Sub FillBuffer(numBytes As Long)
		'TODO:
	End Sub

'	Read7BitEncodedInt	32 ビット整数を圧縮形式で読み取ります。

Private
	stream As Stream
	coding As System.Text.Encoding
End Class

End Namespace
End Namespace