OSDN Git Service

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