1 | #ifndef DAWGDIC_DAWG_H |
2 | #define DAWGDIC_DAWG_H |
3 | |
4 | #include "base-unit.h" |
5 | #include "bit-pool.h" |
6 | #include "object-pool.h" |
7 | |
8 | namespace dawgdic { |
9 | |
10 | class Dawg { |
11 | public: |
12 | Dawg() |
13 | : base_pool_(), label_pool_(), flag_pool_(), |
14 | num_of_states_(0), num_of_merged_transitions_(0), |
15 | num_of_merged_states_(0), num_of_merging_states_(0) {} |
16 | |
17 | // The root index. |
18 | BaseType root() const { |
19 | return 0; |
20 | } |
21 | |
22 | // Number of units. |
23 | SizeType size() const { |
24 | return base_pool_.size(); |
25 | } |
26 | // Number of transitions. |
27 | SizeType num_of_transitions() const { |
28 | return base_pool_.size() - 1; |
29 | } |
30 | // Number of states. |
31 | SizeType num_of_states() const { |
32 | return num_of_states_; |
33 | } |
34 | // Number of merged transitions. |
35 | SizeType num_of_merged_transitions() const { |
36 | return num_of_merged_transitions_; |
37 | } |
38 | // Number of merged states. |
39 | SizeType num_of_merged_states() const { |
40 | return num_of_merged_states_; |
41 | } |
42 | // Number of merging states. |
43 | SizeType num_of_merging_states() const { |
44 | return num_of_merging_states_; |
45 | } |
46 | |
47 | // Reads values. |
48 | BaseType child(BaseType index) const { |
49 | return base_pool_[index].child(); |
50 | } |
51 | BaseType sibling(BaseType index) const { |
52 | return base_pool_[index].has_sibling() ? (index + 1) : 0; |
53 | } |
54 | ValueType value(BaseType index) const { |
55 | return base_pool_[index].value(); |
56 | } |
57 | |
58 | bool is_leaf(BaseType index) const { |
59 | return label(index) == '\0'; |
60 | } |
61 | UCharType label(BaseType index) const { |
62 | return label_pool_[index]; |
63 | } |
64 | bool is_merging(BaseType index) const { |
65 | return flag_pool_.get(index); |
66 | } |
67 | |
68 | // Clears object pools. |
69 | void Clear() { |
70 | base_pool_.Clear(); |
71 | label_pool_.Clear(); |
72 | flag_pool_.Clear(); |
73 | num_of_states_ = 0; |
74 | num_of_merged_states_ = 0; |
75 | } |
76 | |
77 | // Swaps dawgs. |
78 | void Swap(Dawg *dawg) { |
79 | base_pool_.Swap(&dawg->base_pool_); |
80 | label_pool_.Swap(&dawg->label_pool_); |
81 | flag_pool_.Swap(&dawg->flag_pool_); |
82 | std::swap(num_of_states_, dawg->num_of_states_); |
83 | std::swap(num_of_merged_transitions_, dawg->num_of_merged_transitions_); |
84 | std::swap(num_of_merged_states_, dawg->num_of_merged_states_); |
85 | std::swap(num_of_merging_states_, dawg->num_of_merging_states_); |
86 | } |
87 | |
88 | public: |
89 | // Following member functions are called from DawgBuilder. |
90 | |
91 | // Sets the number of states. |
92 | void set_num_of_states(SizeType num_of_states) { |
93 | num_of_states_ = num_of_states; |
94 | } |
95 | // Sets the number of merged transitions. |
96 | void set_num_of_merged_transitions(SizeType num_of_merged_transitions) { |
97 | num_of_merged_transitions_ = num_of_merged_transitions; |
98 | } |
99 | // Sets the number of merged states. |
100 | void set_num_of_merged_states(SizeType num_of_merged_states) { |
101 | num_of_merged_states_ = num_of_merged_states; |
102 | } |
103 | // Sets the number of merging states. |
104 | void set_num_of_merging_states(SizeType num_of_merging_states) { |
105 | num_of_merging_states_ = num_of_merging_states; |
106 | } |
107 | |
108 | // Swaps base pools. |
109 | void SwapBasePool(ObjectPool<BaseUnit> *base_pool) { |
110 | base_pool_.Swap(base_pool); |
111 | } |
112 | // Swaps label pools. |
113 | void SwapLabelPool(ObjectPool<UCharType> *label_pool) { |
114 | label_pool_.Swap(label_pool); |
115 | } |
116 | // Swaps flag pools. |
117 | void SwapFlagPool(BitPool<> *flag_pool) { |
118 | flag_pool_.Swap(flag_pool); |
119 | } |
120 | |
121 | private: |
122 | ObjectPool<BaseUnit> base_pool_; |
123 | ObjectPool<UCharType> label_pool_; |
124 | BitPool<> flag_pool_; |
125 | SizeType num_of_states_; |
126 | SizeType num_of_merged_transitions_; |
127 | SizeType num_of_merged_states_; |
128 | SizeType num_of_merging_states_; |
129 | |
130 | // Disallows copies. |
131 | Dawg(const Dawg &); |
132 | Dawg &operator=(const Dawg &); |
133 | }; |
134 | |
135 | } // namespace dawgdic |
136 | |
137 | #endif // DAWGDIC_DAWG_H |
138 | |