OSDN Git Service

cf7bb12bf2f41a3ef8f7d91890ccdd500be26eb3
[simplecms/utakata.git] / src / encoding_reader.h
1 // 文字列、あるいはファイルからデータを読みだすためのフロントエンドです。
2 // このフロントエンドは、文字列・ファイル等からデータを読出すだけの
3 // 機能を持つ別のインターフェースと組み合わせ、ITranscoderを適用した
4 // データを取得します。
5 #ifndef _UTAKATA_SRC_READER_H_
6 #define _UTAKATA_SRC_READER_H_
7
8 #include <iostream>
9 #include <vector>
10 #include <string>
11 #include <exception>
12
13 #include "smart_ptr.h"
14
15 namespace utakata {
16
17 namespace transcoder {
18 class ITranscoder;
19 };
20
21 namespace reader {
22
23
24 class EncodingReader {
25   // 渡されたistreamから、Unicodeスカラー値を抽出する。
26   // istreamからUnicodeスカラー値を抽出するのは、全て
27   // Transcoderを介するようにする。
28  public:
29
30   // 利用するistreamを指定する。
31   StreamReader(smart_ptr<std::istream>& s,
32                const smart_ptr<transcoder::ITranscoder>& t);
33   virtual ~StreamReader() {}
34
35   virtual unsigned long read();
36   virtual std::vector<unsigned long> read(size_t num);
37
38   virtual unsigned long peek();
39
40   // 現在streamのどこまでを読んでいるのかを返す。
41   virtual size_t pos() const;
42
43   // 渡されたvectorをstreamに戻す。
44   virtual void unget(unsigned long ch);
45
46   // 現在のportが終了時点かどうかを返す。
47   virtual bool isEOF();
48
49  private:
50
51   // 内部のvalidチェックを行う。
52   // validチェックは成功しない場合にはPortExceptionが発生する。
53   void validate();
54
55   smart_ptr<std::istream> stream_;
56   smart_ptr<transcoder::ITranscoder> trans_;
57
58   // 文字の変換単位で取得した文字の個数
59   size_t pos_;
60 };
61 };
62
63 };
64
65 #endif /* __HOME_DERUI_DEVELOP_UTAKATA_SRC_READER_H_ */