1 // 文字列、あるいはファイルからデータを読みだすためのフロントエンドです。
2 // このフロントエンドは、文字列・ファイル等からデータを読出すだけの
3 // 機能を持つ別のインターフェースと組み合わせ、ITranscoderを適用した
5 // EncodingReaderは、特性上実装不可能であるメソッドについては実装を行いません。
9 // StringReader r("hoge");
10 // EncodingReader enc(&r, new UTF8Transcoder());
12 #ifndef _UTAKATA_SRC_ENCODING_READER_H_
13 #define _UTAKATA_SRC_ENCODING_READER_H_
16 #include "src/reader_interface.h"
17 #include "src/common/smart_ptr.h"
21 namespace transcoder {
27 class EncodingReader : public IReader {
28 // 渡されたReaderからデータを読出す際に、ITranscoder::Encodeを利用して、
29 // バイナリデータを文字列として読み出します。
30 // 文字列として読出しますが、EncodingReaderから読出された時点で、全て
31 // unicode文字列として読出されます。
33 // 利用するreaderとエンコードを行うITranscoder派生クラスを渡します。
34 // 渡されたITranscoder派生クラスのポインタは、EncodingReaderの終了時に
36 EncodingReader(reader::IReader* reader,
37 transcoder::ITranscoder* transcoder) :
38 reader_(reader), transcoder_(transcoder) {}
44 // 指定した文字数だけ読出して返します。指定されたnumよりも読出せた文字数が
46 // numが0未満である場合、サイズ0のvectorが返されます。
47 std::vector<unsigned int> Read(unsigned int num);
50 // 先読みのため、Readerの読み出し位置は更新されません。
53 // 指定された文字の分だけ先読みして返します。
54 // 先読みのため、Readerの読み出し位置は更新されません。
55 // num以下の文字しか読出せなかった場合、読出せた分だけ返されます。
56 std::vector<unsigned int> Peek(unsigned int num);
58 // 保持しているreaderが末尾に到達しているか返します。
61 void set_transcoder(transcoder::ITranscoder* transcoder) {
62 transcoder_.reset(transcoder);
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;}
71 unsigned int GetSize() const {return 0;}
75 // reader_及びtranscoder_が有効な状態であるかどうかを調査します。
76 void CheckInternal() const;
78 // データの読み込みを行うreaderを保持します。
79 reader::IReader* reader_;
81 // 読出したデータを変換するためのTranscoderです。
82 utility::smart_ptr<transcoder::ITranscoder> transcoder_;
87 #endif /* _UTAKATA_SRC_ENCODING_READER_H_ */