// 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_;
};
};