--- /dev/null
+// 文字列、あるいはファイルからデータを読みだすためのフロントエンドです。
+// このフロントエンドは、文字列・ファイル等からデータを読出すだけの
+// 機能を持つ別のインターフェースと組み合わせ、ITranscoderを適用した
+// データを取得します。
+#ifndef _UTAKATA_SRC_READER_H_
+#define _UTAKATA_SRC_READER_H_
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <exception>
+
+#include "smart_ptr.h"
+
+namespace utakata {
+
+namespace transcoder {
+class ITranscoder;
+};
+
+namespace reader {
+
+
+class EncodingReader {
+ // 渡されたistreamから、Unicodeスカラー値を抽出する。
+ // istreamからUnicodeスカラー値を抽出するのは、全て
+ // Transcoderを介するようにする。
+ public:
+
+ // 利用するistreamを指定する。
+ StreamReader(smart_ptr<std::istream>& s,
+ const smart_ptr<transcoder::ITranscoder>& t);
+ virtual ~StreamReader() {}
+
+ virtual unsigned long read();
+ virtual std::vector<unsigned long> read(size_t num);
+
+ virtual unsigned long peek();
+
+ // 現在streamのどこまでを読んでいるのかを返す。
+ virtual size_t pos() const;
+
+ // 渡されたvectorをstreamに戻す。
+ virtual void unget(unsigned long ch);
+
+ // 現在のportが終了時点かどうかを返す。
+ virtual bool isEOF();
+
+ private:
+
+ // 内部のvalidチェックを行う。
+ // validチェックは成功しない場合にはPortExceptionが発生する。
+ void validate();
+
+ smart_ptr<std::istream> stream_;
+ smart_ptr<transcoder::ITranscoder> trans_;
+
+ // 文字の変換単位で取得した文字の個数
+ size_t pos_;
+};
+};
+
+};
+
+#endif /* __HOME_DERUI_DEVELOP_UTAKATA_SRC_READER_H_ */