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
8namespace dawgdic {
9
10class 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