OSDN Git Service

utakataの標準となる例外クラス及びマクロを定義した。
[simplecms/utakata.git] / src / encoding_reader.h
1 // 文字列、あるいはファイルからデータを読みだすためのフロントエンドです。
2 // このフロントエンドは、文字列・ファイル等からデータを読出すだけの
3 // 機能を持つ別のインターフェースと組み合わせ、ITranscoderを適用した
4 // データを取得します。
5 // EncodingReaderは、特性上実装不可能であるメソッドについては実装を行いません。
6 //
7 // example
8 // -------
9 // StringReader r("hoge");
10 // EncodingReader enc(&r, new UTF8Transcoder());
11 // enc.Read();
12 #ifndef _UTAKATA_SRC_ENCODING_READER_H_
13 #define _UTAKATA_SRC_ENCODING_READER_H_
14
15 #include <vector>
16 #include "src/reader_interface.h"
17 #include "src/common/smart_ptr.h"
18
19 namespace utakata {
20
21 namespace transcoder {
22 class ITranscoder;
23 };
24
25 namespace reader {
26
27 class EncodingReader : public IReader {
28   // 渡されたReaderからデータを読出す際に、ITranscoder::Encodeを利用して、
29   // バイナリデータを文字列として読み出します。
30   // 文字列として読出しますが、EncodingReaderから読出された時点で、全て
31   // unicode文字列として読出されます。
32  public:
33   // 利用するreaderとエンコードを行うITranscoder派生クラスを渡します。
34   // 渡されたITranscoder派生クラスのポインタは、EncodingReaderの終了時に
35   // 破棄されます。
36   EncodingReader(reader::IReader* reader,
37                  transcoder::ITranscoder* transcoder) :
38       reader_(reader), transcoder_(transcoder) {}
39   ~EncodingReader() {}
40
41   // 一文字分だけ読出して返します。
42   unsigned int Read();
43
44   // 指定した文字数だけ読出して返します。指定されたnumよりも読出せた文字数が
45   // 読出せた分だけ返されます。
46   // numが0未満である場合、サイズ0のvectorが返されます。
47   std::vector<unsigned int> Read(unsigned int num);
48
49   // 一文字分だけ先読みして返します。
50   // 先読みのため、Readerの読み出し位置は更新されません。
51   unsigned int Peek();
52
53   // 指定された文字の分だけ先読みして返します。
54   // 先読みのため、Readerの読み出し位置は更新されません。
55   // num以下の文字しか読出せなかった場合、読出せた分だけ返されます。
56   std::vector<unsigned int> Peek(unsigned int num);
57
58   // 保持しているreaderが末尾に到達しているか返します。
59   bool IsEof() const;
60
61   void set_transcoder(transcoder::ITranscoder* transcoder) {
62     transcoder_.reset(transcoder);
63   }
64
65   // 以下のメソッドについては、全て実装されません。
66   unsigned int GetPos() const {return 0;}
67   bool Seek(int seekpos, reader::SeekDirection direction) {return false;}
68   bool Seek(int seekpos, reader::SeekDirection direction,
69             size_t* seek_difference) {return false;}
70   void Begin() {}
71   unsigned int GetSize() const {return 0;}
72
73  private:
74
75   // reader_及びtranscoder_が有効な状態であるかどうかを調査します。
76   void CheckInternal() const;
77
78   // データの読み込みを行うreaderを保持します。
79   reader::IReader* reader_;
80
81   // 読出したデータを変換するためのTranscoderです。
82   utility::smart_ptr<transcoder::ITranscoder> transcoder_;
83 };
84 };
85 };
86
87 #endif /* _UTAKATA_SRC_ENCODING_READER_H_ */