OSDN Git Service

8feeed7a40cfbf3fbc4971eda9cddecf4918be26
[simplecms/utakata.git] / src / string_reader.h
1 // 文字列から1バイト単位での読み出しを行うクラスを定義します。
2 // StringReaderは、渡された文字列から1バイト単位での読み出し機能を
3 // 提供します。
4 //
5 // example
6 // -------
7 // StringReader reader("hoge");
8 // reader.read(); // == 'h'
9 // reader.peek(); // == 'o'
10 // reader.read(); // == 'o'
11 // reader.read(2); // == "ge"
12 //
13 // reader.begin(); reader.seek(1, IReader::kForward);
14 // reader.read(); // == 'o'
15 // reader.read(2);
16 // reader.eof(); // == true
17 #ifndef _UTAKATA_SRC_STRING_READER_H_
18 #define _UTAKATA_SRC_STRING_READER_H_
19
20 #include <string>
21 #include "src/reader_interface.h"
22 #include "src/common/uncopyable.h"
23
24 namespace utakata {
25
26 namespace reader {
27
28 class StringReader : public IReader, private utility::Uncopyable {
29   // 各種デバイスから読み出しを行うためのインターフェースです。
30   // このインターフェースを実装したクラスは、すべてのインターフェース
31   // を実装する必要があります。
32  public:
33
34   typedef std::string::const_iterator internal_iterator;
35
36   explicit inline StringReader(const std::string& string)
37       : buffer_(string), iterator_(), pos_(0) {
38     iterator_ = buffer_.begin();
39   }
40
41   virtual ~StringReader() {}
42
43   // 各種デバイスから一文字読出します。
44   // 末尾に到達してなお読み出しが行われた場合、reader::EndOfDeviceException
45   // 例外を投げなければなりません。
46   // readでは、読み出し位置を更新します。
47   unsigned char Read();
48   std::vector<unsigned char> Read(size_t num);
49
50   // デバイスから1バイトの読出しを行いますが、内部の読み出し位置は変化
51   // しません。
52   // peekした後、readを行うと、全く同一のバイトが得られます。
53   unsigned char Peek();
54   std::vector<unsigned char> Peek(size_t num);
55
56   // 現在の読み出し位置を返します。
57   size_t GetPos() const;
58
59   // 現在位置から、指定された方向に指定された量だけ読み出し位置を進めます。
60   // 正しく移動できた場合、trueを返します。
61   // seek_differenceには、実際に移動した量を設定するため、有効であるポインタ
62   // を渡さなければなりません。
63   bool Seek(int seekpos, SeekDirection direciton);
64   bool Seek(int seekpos, SeekDirection direciton, size_t* seek_difference);
65
66   // 読み出し位置を先頭に戻します。
67   void Begin();
68
69   // 読み出し対象のサイズを返します。
70   size_t GetSize() const;
71
72   // 読み出し位置が末尾であるかどうかを返します。
73   bool IsEof() const;
74
75  private:
76
77   // 内部で利用されます。IsEof = trueである場合に、例外を発生
78   // させます。
79   void CheckInternal();
80
81   // 初期化された読出し用の文字列です。内部では書込みなどは行われないため、
82   // constです。
83   const std::string buffer_;
84
85   // std::stringの中で現在指している位置を表すためのiteratorです。
86   internal_iterator iterator_;
87
88   // 内部文字列中で現在の位置を表します。
89   size_t pos_;
90 };
91 };
92 };
93
94 #endif /* _UTAKATA_SRC_STRING_READER_H_ */