root/SharedMemoryTree.hpp

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. next
  2. next
  3. enter_tree
  4. print_tree
  5. find_tree
  6. find_tree_set
  7. find_regex_tree_set
  8. find_adjacent_tree_set
  9. getwordtotalcount
  10. getwordproccount

   1 /* -*- coding: utf-8; mode: c++; -*-
   2  * Concordance to A. S. Pushkin's Works - Word Operation Classes
   3  * $Id: SharedMemoryTree.hpp 1 2012-06-02 08:43:50Z isao $
   4  * Copyright (C) 2012, isao yasuda
   5  */
   6 
   7 #ifndef SHARED_MEMORY_WORD_TREE
   8 #define SHARED_MEMORY_WORD_TREE
   9 
  10 #include <boost/interprocess/managed_shared_memory.hpp>
  11 #include <boost/interprocess/allocators/allocator.hpp>
  12 #include <boost/interprocess/containers/map.hpp>
  13 #include <boost/interprocess/containers/string.hpp>
  14 #include <boost/interprocess/containers/vector.hpp>
  15 #include <boost/interprocess/offset_ptr.hpp>
  16 #include <boost/regex.hpp>
  17 #include <boost/regex/icu.hpp>
  18 #include "SharedMemoryCommon.hpp"
  19 
  20 using namespace boost::interprocess;
  21 
  22 // 位置情報クラス
  23 class wpos {
  24     int genre;             // ジャンル
  25     int fname;             // ファイル名
  26     int linno;             // 行通番
  27     int linid;             // 行 id
  28     int linps;             // 行内出現アドレス(行先頭からの相対位置)
  29     int wdpos;             // 単語出現アドレス(作品先頭からの相対位置)
  30     offset_ptr<wpos> next; // 次の位置情報への相対ポインタ
  31     friend class tree;
  32 public:
  33     wpos()
  34         : genre(0), fname(0), linno(0), linid(0), linps(0), wdpos(0),
  35           next(NULL)
  36     {}
  37     wpos(int ge, int fn, int ln, int id, int lp, int wp)
  38         : genre(ge), fname(fn), linno(ln), linid(id), linps(lp), wdpos(wp),
  39           next(NULL)
  40     {}
  41     void printwpos();                          // 位置情報出力 debug
  42     void setwpos(std::vector<offset_ptr<wpos> >& wpv,
  43                  std::vector<int>& gv);    //位置情報p vectorセット
  44     int  getgenre();               // genre
  45     int  getfileno();              // fname
  46     int  getlineno();              // linno
  47     int  getlineid();              // linid
  48     int  getlinepos();             // linps
  49     int  getwordpos();             // wdpos
  50     offset_ptr<wpos> getnextptr(); // next pointer
  51     static void compadjacent(std::vector<offset_ptr<wpos> >& pv1,
  52                              std::vector<offset_ptr<wpos> >& pv2,
  53                              std::vector<offset_ptr<wpos> >& rv,
  54                              int kind, int dist);     // 位置情報比較
  55 };
  56 
  57 // 単語情報
  58 struct wordinfo {
  59     offset_ptr<char>     word;            // 単語への相対ポインタ
  60     int                  counter;         // 出現回数
  61     std::vector<offset_ptr<wpos> > wposv; // 位置情報への相対ポインタの vector
  62 };
  63 
  64 // 二分木クラス
  65 class tree {
  66 private:
  67     // 単語ノードクラス
  68     class node {
  69         offset_ptr<char> word;    // 単語への相対ポインタ
  70         int              counter; // 出現回数
  71         offset_ptr<wpos> fpos;    // 最初の位置情報への相対ポインタ
  72         offset_ptr<wpos> lpos;    // 最後の位置情報への相対ポインタ
  73         offset_ptr<node> right;   // 右ノードへの相対ポインタ
  74         offset_ptr<node> left;    // 左ノードへの相対ポインタ
  75         friend class tree;
  76     };
  77     // ルート
  78     offset_ptr<node> root;
  79     // 処理単語数(のべ数)
  80     int wordc;
  81     // 処理単語数(異なり数)
  82     int wordt;
  83     // ノード登録
  84     void enter_node(offset_ptr<node>& node, const std::string& word,
  85                     int gi, int fi, int li, int ii, int pi, int wi);
  86     // ノード印字 debug
  87     void print_node(offset_ptr<node>& top);
  88     // ノード探索 debug
  89     void find_node(const std::string& word, offset_ptr<node>& tnode);
  90     // ノード探索 vector set
  91     void find_node_set(const std::string& word, std::vector<wordinfo>& nv,
  92                        std::vector<int>& gv,
  93                        offset_ptr<node>& tnode);
  94     // ノード正規表現探索 vector set
  95     void find_regex_node_set(boost::u32regex& reg, std::vector<wordinfo>& nv,
  96                              std::vector<int>& gv,
  97                              offset_ptr<node>& tnode);
  98     // ノード近接隣接探索 vector set
  99     void find_adjacent_node_set(const std::string& adj1,
 100                                 const std::string& adj2,
 101                                 int kind, int dist, std::vector<wordinfo>& nv,
 102                                 std::vector<int>& gv,
 103                                 offset_ptr<node>& tnode);
 104     // ノード情報セット
 105     void setwordinfo(wordinfo& winfo, std::vector<int>& gv,
 106                      offset_ptr<node>& tnode);
 107 public:
 108     tree()
 109     {
 110         root = NULL;
 111         wordt = 0;
 112     }
 113     // ツリー登録
 114     void enter_tree(const std::string& new_word,
 115                     int gi, int fi, int li, int ii, int pi, int wi)
 116     {
 117         enter_node(root, new_word, gi, fi, li, ii, pi, wi);
 118         wordc++; // のべ処理単語数更新
 119     }
 120     // ツリー全ノード印字 debug
 121     void print_tree()
 122     {
 123         print_node(root);
 124     }
 125     // ツリー完全一致探索 debug
 126     void find_tree(const std::string& word)
 127     {
 128         find_node(word, root);
 129     }
 130     // ツリー完全一致探索 vector set
 131     void find_tree_set(const std::string& word,
 132                        std::vector<wordinfo>& nv,
 133                        std::vector<int>& gv)
 134     {
 135         find_node_set(word, nv, gv, root);
 136     }
 137     // ツリー正規表現探索 vector set
 138     void find_regex_tree_set(boost::u32regex& reg,
 139                              std::vector<wordinfo>& nv,
 140                              std::vector<int>& gv)
 141     {
 142         find_regex_node_set(reg, nv, gv, root);
 143     }
 144     // ツリー近接隣接探索 vector set
 145     void find_adjacent_tree_set(const std::string& adj1,
 146                                 const std::string& adj2,
 147                                 int kind, int dist,
 148                                 std::vector<wordinfo>& nv,
 149                                 std::vector<int>& gv)
 150     {
 151         find_adjacent_node_set(adj1, adj2, kind, dist, nv, gv, root);
 152     }
 153     // ツリー内総単語数取得
 154     int getwordtotalcount()
 155     {
 156         return wordt;
 157     }
 158     // ツリー総処理単語数取得
 159     int getwordproccount()
 160     {
 161         return wordc;
 162     }
 163 };
 164 
 165 #endif

/* [previous][next][first][last][top][bottom][index][help] */