[概要]
Doarは、DoubleArrayの構築・検索を行うためのC++ライブラリです。

現在(2009/10/08)で実装されている機能は以下の通りです。
 ・ソート済みのキーセットから、DoubleArrayを構築し、ファイルに保存する
 ・上で作成したDoubleArrayデータから、キーを検索する
 ・各キーを、0から始まるユニークなIDにマッピング


[環境]
・現在(2009/10/08)は、unix,32bit(sizeof(int)==4)、環境を前提としています


[使い方]
・makeでサンプルコマンドをコンパイル
　・mkdoar:    DoubleArray構築コマンド
　・doar:      簡易検索コマンド (通常検索, common-prefix検索)
　・doar_test: 構築したDoubleArrayのテスト & ベンチマークコマンド
・具体的な使い方は、src/comman/以下のファイルを参照してください


[簡易API]
namespace Doar {
  //=== ファイル: src/doar/builder.h ===
  class Builder {
    // 引数のファイル(ソート済み)から、DoubleArrayを構築する
    bool build(const char* filepath);
    // 引数の文字列配列(ソート済み)から、DoubleArrayを構築する
    bool build(const char** strs, unsigned str_count);
    
    // 引数のファイルにDoubleArrayを保存する
    bool save(const char* filepath);    
  };

  //=== ファイル: src/doar/node.h ===
  struct Node {
    // IDを取得する
    unsigned id() const;

    // ノードが有効化どうかを返す
    bool valid() const;
  }

  //=== ファイル: src/doar/searcher.h ===
  class Searcher {
    // DoubleArrayを引数のファイルから読み込む
    Searcher(cosnt char* filepath);

    // DoubleArrayに格納されているキー数を取得する
    unsigned size() const;

    // ルートノードを取得する
    Node root_node() const;

    // キーに対応するNodeを探す
    // 検索に失敗した場合は、Node.valid()==falseとなる
    Node search(const char* key) const;
    Node search(const char* key, Node root_node) const;
    Node search(char* key, unsigned len) const;
    Node search(char* key, unsigned len, Node root_node) const;

    // common-prefix searchを行うためのメソッド
    // キーに対応するNodeを返す
    // searchメソッドとは異なり、キーの途中にに一致するノードがある場合は、そこで検索が中断される
    // 検索は、key+key_offsetから開始される。また、key_offsetには最後に使われたキーの位置が格納される。
    // 検索は、root_node以下のノードを対象に行われる。また、検索が中断された場合には、戻り値のNodeの親ノードが格納される。
    // 検索に失敗した場合には、Node.valid()==falseとなる
    // 一致する全てのノードが見つかった場合、root_node.valid()==falseとなる 
    //   ※ 後者の場合、strlen(key)==key_offsetとは限らない
    Node non_greedy_search(const char* key, unsigned& key_offset, Node& root_node) const;
    
    // parentの子ノード(のindex)を、resultに集める
    // 戻り値は、子ノードの数
    unsigned children(Node parent, NodeIndexList& result) const;
    
    // idxから遷移に使用した文字を取得する
    char get_arc(NodeIndex idx) const;
    // idxからNodeを取得する
    Node get_node(NodeIndex idx) const;
  };
}


[TODO]
・要素の動的更新(追加・削除)に対応  ※ namespaceは現状のものとは分ける?
・ポータビリティ向上