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_
22 #include "src/reader_interface.h"
23 #include "src/common/uncopyable.h"
29 class StringReader : public IReader, private utility::Uncopyable {
30 // 各種デバイスから読み出しを行うためのインターフェースです。
31 // このインターフェースを実装したクラスは、すべてのインターフェース
35 typedef std::string::const_iterator internal_iterator;
37 explicit inline StringReader(const std::string& string)
38 : buffer_(string), iterator_(), pos_(0) {
39 iterator_ = buffer_.begin();
42 virtual ~StringReader() {}
45 // 末尾に到達してなお読み出しが行われた場合、reader::EndOfDeviceException
47 // readでは、読み出し位置を更新します。
49 std::vector<unsigned int> Read(size_t num);
51 // デバイスから1バイトの読出しを行いますが、内部の読み出し位置は変化
53 // peekした後、readを行うと、全く同一のバイトが得られます。
55 std::vector<unsigned int> Peek(size_t num);
58 size_t GetPos() const;
60 // 現在位置から、指定された方向に指定された量だけ読み出し位置を進めます。
61 // 正しく移動できた場合、trueを返します。
62 // seek_differenceには、実際に移動した量を設定するため、有効であるポインタ
64 bool Seek(int seekpos, SeekDirection direciton);
65 bool Seek(int seekpos, SeekDirection direciton, size_t* seek_difference);
71 size_t GetSize() const;
73 // 読み出し位置が末尾であるかどうかを返します。
78 // 内部で利用されます。IsEof = trueである場合に、例外を発生
82 // 初期化された読出し用の文字列です。内部では書込みなどは行われないため、
84 const std::string buffer_;
86 // std::stringの中で現在指している位置を表すためのiteratorです。
87 internal_iterator iterator_;
95 #endif /* _UTAKATA_SRC_STRING_READER_H_ */