OSDN Git Service

lexerに関係するソースをsrc/lexer配下に移動。
[simplecms/utakata.git] / src / common / textarrayformat.h
index 231480f..32b39e2 100644 (file)
 // TextArrayFormatは、TextArrayGeneratorにて文字列からの生成を行い
 // TextArrayReaderによって、テキストブロックを取得することができます。
 // 
-// ã\81\93ã\82\8cã\82\89ã\81¯柔軟に行うことができるため、テキストを扱うテストデータを
+// ã\81\93ã\82\8cã\82\89ã\82\92柔軟に行うことができるため、テキストを扱うテストデータを
 // 複数作成したい場合に有用です。
 #ifndef _UTAKATA_SRC_COMMON_TEXTARRAYFORMAT_H_
 #define _UTAKATA_SRC_COMMON_TEXTARRAYFORMAT_H_
 
 #include <string>
 #include <vector>
-#include <exception>
+#include "src/common/scoped_ptr.h"
 
 namespace utility {
 
 namespace textarrayformat {
 
+class TextArrayGenerator {
+  // 渡された文字列から、TextArrayFormatとなるような文字列のブロックを
+  // 作成します。
+  // あくまでTextArrayFormatのデータをGenerateするだけなので、読み込み媒体
+  // は問いません。
+ public:
+  explicit TextArrayGenerator(const std::string& separator)
+      : separator_(separator), now_block_(), construct_text_() {
+    construct_text_ = separator + "\n";
+    separator_ += "\n";
+  }
+  TextArrayGenerator(const TextArrayGenerator& generator)
+      : separator_(generator.separator_),
+        now_block_(generator.now_block_),
+        construct_text_(generator.construct_text_) {}
+  virtual ~TextArrayGenerator() {}
+
+  // 文字列をブロックとして追加します。渡された文字列がseparatorと一致する
+  // 場合、その時点まで追加された文字列がブロックとして設定されます。
+  // ブロックとして追加された場合、次に追加された文字列は新しい文字列と
+  // されます。
+  // ここで追加されたデータは、ブロック中の一行として取り扱われ、末尾
+  // に改行が付与されます。
+  // ここでの改行は\nで固定とされます。
+  void Append(const std::string& parts);
+
+  // 現在のブロックを、一つのブロックとして強制的に区切ります。
+  // 区切りにはseparatorが利用されます。ブロックが空文字であっても、
+  // 空文字のブロックとして登録が行われます。
+  void Punctuate();
+
+  // 構築済の文字列を返します。ここで返される文字列は、
+  // 先頭行がseparatorであり、それ以降の各ブロックがseparator行で
+  // 区切られたブロックとなっています。
+  const std::string& construct_text() const {return construct_text_;}
+
+  // 初期設定されたseparatorを返します。
+  const std::string& separator() const {return separator_;}
+
+ private:
+  // 生成するTextArrayFormatのセパレータです。
+  std::string separator_;
+
+  // 現在構築中のブロック文字列です。
+  std::string now_block_;
+
+  // 最終的にTextArrayReaderに渡されるブロック文字列です。
+  // この文字列については追加のみが行われます。
+  std::string construct_text_;
+};
+
 class TextArrayReader {
+  // TextArrayGeneratorから取得した構築済文字列を元に、
+  // text arrayを読み出して作成します。
  public:
 
-  explicit TextArrayReader(const TextArrayGenerator& is);
+  explicit TextArrayReader(const TextArrayGenerator& generator) {
+    SplitBlock(generator);
+  }
+
   virtual ~TextArrayReader() {}
 
-  // 指定したストリームの先頭からフォーマットに従ってブロック単位
-  // への切り出しを行う。
-  // この関数が成功した場合、以前のブロックなどは保存されない。
-  void open(std::istream& is);
+  // 指定した位置のテキストブロックを取得します。
+  // ここで取得されるテキストブロックは、改行などもそのまま付与されている
+  // 形式になります。
+  // posの指定が不正である場合、std::out_of_range例外が送出されます。
+  const std::string& GetBlockAt(int pos) const {return text_blocks_.at(pos);}
 
-  // 指定したブロックを取得する。
-  // 番号を指定しない場合には、最初に取得したブロックが取得される
-  std::string get(int = 0);
+  // 分解されたブロックのリストを取得します。ブロックのリストには
+  // splitterは存在しません
+  const std::vector<std::string>& text_blocks() const {return text_blocks_;}
 
-  // ブロックのリストを取得する。
-  const std::vector<std::string>& getBlock() const {return blocks_;}
+  // Generatorから取得した構築済ブロック文字列を、それぞれのブロック文字列に
+  // 分解します。Generatorが変化しない限り、何度実行しても同一の結果が
+  // 得られます。
+  void SplitBlock(const TextArrayGenerator& generator);
 
  private:
 
-  // ファイル中のスプリッタを行ごと退避する
-  std::string splitter_;
+  // Generatorで構築されたブロック文字列です
+  std::string construct_text_;
 
-  // テキストのブロックを退避しておくリスト
-  std::vector<std::string> blocks_;
+  // Generatorより取得したテキストを単位で保持します。
+  std::vector<std::string> text_blocks_;
 };
 
 };