1 // 文字列から1バイト単位での読み出しを行うクラスを定義します。
2 // StringReaderは、渡された文字列から1バイト単位での読み出し機能を
7 // StringReader reader("hoge");
8 // reader.read(); // == 'h'
9 // reader.peek(); // == 'o'
10 // reader.read(); // == 'o'
11 // reader.read(2); // == "ge"
13 // reader.begin(); reader.seek(1, IReader::kForward);
14 // reader.read(); // == 'o'
16 // reader.eof(); // == true
17 #ifndef _UTAKATA_SRC_STRING_READER_H_
18 #define _UTAKATA_SRC_STRING_READER_H_
21 #include "src/reader_interface.h"
22 #include "src/common/uncopyable.h"
28 class StringReader : public IReader, private utility::Uncopyable {
29 // 各種デバイスから読み出しを行うためのインターフェースです。
30 // このインターフェースを実装したクラスは、すべてのインターフェース
34 typedef std::string::const_iterator internal_iterator;
36 explicit inline StringReader(const std::string& string)
37 : buffer_(string), iterator_(), pos_(0) {
38 iterator_ = buffer_.begin();
41 virtual ~StringReader() {}
44 // 末尾に到達してなお読み出しが行われた場合、reader::EndOfDeviceException
46 // readでは、読み出し位置を更新します。
48 std::vector<unsigned char> Read(size_t num);
50 // デバイスから1バイトの読出しを行いますが、内部の読み出し位置は変化
52 // peekした後、readを行うと、全く同一のバイトが得られます。
54 std::vector<unsigned char> Peek(size_t num);
57 size_t GetPos() const;
59 // 現在位置から、指定された方向に指定された量だけ読み出し位置を進めます。
60 // 正しく移動できた場合、trueを返します。
61 // seek_differenceには、実際に移動した量を設定するため、有効であるポインタ
63 bool Seek(int seekpos, SeekDirection direciton);
64 bool Seek(int seekpos, SeekDirection direciton, size_t* seek_difference);
70 size_t GetSize() const;
72 // 読み出し位置が末尾であるかどうかを返します。
77 // 内部で利用されます。IsEof = trueである場合に、例外を発生
81 // 初期化された読出し用の文字列です。内部では書込みなどは行われないため、
83 const std::string buffer_;
85 // std::stringの中で現在指している位置を表すためのiteratorです。
86 internal_iterator iterator_;
94 #endif /* _UTAKATA_SRC_STRING_READER_H_ */