/* */
This source file includes following definitions.
- next
- next
- enter_tree
- print_tree
- find_tree
- find_tree_set
- find_regex_tree_set
- find_adjacent_tree_set
- getwordtotalcount
- 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
/* */