OSDN Git Service

・textarrayformat.*をsrc/commonに移動した。
[simplecms/utakata.git] / src / encoding_reader.h
diff --git a/src/encoding_reader.h b/src/encoding_reader.h
new file mode 100644 (file)
index 0000000..cf7bb12
--- /dev/null
@@ -0,0 +1,65 @@
+// 文字列、あるいはファイルからデータを読みだすためのフロントエンドです。
+// このフロントエンドは、文字列・ファイル等からデータを読出すだけの
+// 機能を持つ別のインターフェースと組み合わせ、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_ */