1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_GRIMOIRE_TRIE_RANGE_H_
2*ab8db090SAndroid Build Coastguard Worker #define MARISA_GRIMOIRE_TRIE_RANGE_H_
3*ab8db090SAndroid Build Coastguard Worker
4*ab8db090SAndroid Build Coastguard Worker #include "marisa/base.h"
5*ab8db090SAndroid Build Coastguard Worker
6*ab8db090SAndroid Build Coastguard Worker namespace marisa {
7*ab8db090SAndroid Build Coastguard Worker namespace grimoire {
8*ab8db090SAndroid Build Coastguard Worker namespace trie {
9*ab8db090SAndroid Build Coastguard Worker
10*ab8db090SAndroid Build Coastguard Worker class Range {
11*ab8db090SAndroid Build Coastguard Worker public:
Range()12*ab8db090SAndroid Build Coastguard Worker Range() : begin_(0), end_(0), key_pos_(0) {}
13*ab8db090SAndroid Build Coastguard Worker
set_begin(std::size_t begin)14*ab8db090SAndroid Build Coastguard Worker void set_begin(std::size_t begin) {
15*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(begin > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
16*ab8db090SAndroid Build Coastguard Worker begin_ = static_cast<UInt32>(begin);
17*ab8db090SAndroid Build Coastguard Worker }
set_end(std::size_t end)18*ab8db090SAndroid Build Coastguard Worker void set_end(std::size_t end) {
19*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(end > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
20*ab8db090SAndroid Build Coastguard Worker end_ = static_cast<UInt32>(end);
21*ab8db090SAndroid Build Coastguard Worker }
set_key_pos(std::size_t key_pos)22*ab8db090SAndroid Build Coastguard Worker void set_key_pos(std::size_t key_pos) {
23*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(key_pos > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
24*ab8db090SAndroid Build Coastguard Worker key_pos_ = static_cast<UInt32>(key_pos);
25*ab8db090SAndroid Build Coastguard Worker }
26*ab8db090SAndroid Build Coastguard Worker
begin()27*ab8db090SAndroid Build Coastguard Worker std::size_t begin() const {
28*ab8db090SAndroid Build Coastguard Worker return begin_;
29*ab8db090SAndroid Build Coastguard Worker }
end()30*ab8db090SAndroid Build Coastguard Worker std::size_t end() const {
31*ab8db090SAndroid Build Coastguard Worker return end_;
32*ab8db090SAndroid Build Coastguard Worker }
key_pos()33*ab8db090SAndroid Build Coastguard Worker std::size_t key_pos() const {
34*ab8db090SAndroid Build Coastguard Worker return key_pos_;
35*ab8db090SAndroid Build Coastguard Worker }
36*ab8db090SAndroid Build Coastguard Worker
37*ab8db090SAndroid Build Coastguard Worker private:
38*ab8db090SAndroid Build Coastguard Worker UInt32 begin_;
39*ab8db090SAndroid Build Coastguard Worker UInt32 end_;
40*ab8db090SAndroid Build Coastguard Worker UInt32 key_pos_;
41*ab8db090SAndroid Build Coastguard Worker };
42*ab8db090SAndroid Build Coastguard Worker
make_range(std::size_t begin,std::size_t end,std::size_t key_pos)43*ab8db090SAndroid Build Coastguard Worker inline Range make_range(std::size_t begin, std::size_t end,
44*ab8db090SAndroid Build Coastguard Worker std::size_t key_pos) {
45*ab8db090SAndroid Build Coastguard Worker Range range;
46*ab8db090SAndroid Build Coastguard Worker range.set_begin(begin);
47*ab8db090SAndroid Build Coastguard Worker range.set_end(end);
48*ab8db090SAndroid Build Coastguard Worker range.set_key_pos(key_pos);
49*ab8db090SAndroid Build Coastguard Worker return range;
50*ab8db090SAndroid Build Coastguard Worker }
51*ab8db090SAndroid Build Coastguard Worker
52*ab8db090SAndroid Build Coastguard Worker class WeightedRange {
53*ab8db090SAndroid Build Coastguard Worker public:
WeightedRange()54*ab8db090SAndroid Build Coastguard Worker WeightedRange() : range_(), weight_(0.0F) {}
55*ab8db090SAndroid Build Coastguard Worker
set_range(const Range & range)56*ab8db090SAndroid Build Coastguard Worker void set_range(const Range &range) {
57*ab8db090SAndroid Build Coastguard Worker range_ = range;
58*ab8db090SAndroid Build Coastguard Worker }
set_begin(std::size_t begin)59*ab8db090SAndroid Build Coastguard Worker void set_begin(std::size_t begin) {
60*ab8db090SAndroid Build Coastguard Worker range_.set_begin(begin);
61*ab8db090SAndroid Build Coastguard Worker }
set_end(std::size_t end)62*ab8db090SAndroid Build Coastguard Worker void set_end(std::size_t end) {
63*ab8db090SAndroid Build Coastguard Worker range_.set_end(end);
64*ab8db090SAndroid Build Coastguard Worker }
set_key_pos(std::size_t key_pos)65*ab8db090SAndroid Build Coastguard Worker void set_key_pos(std::size_t key_pos) {
66*ab8db090SAndroid Build Coastguard Worker range_.set_key_pos(key_pos);
67*ab8db090SAndroid Build Coastguard Worker }
set_weight(float weight)68*ab8db090SAndroid Build Coastguard Worker void set_weight(float weight) {
69*ab8db090SAndroid Build Coastguard Worker weight_ = weight;
70*ab8db090SAndroid Build Coastguard Worker }
71*ab8db090SAndroid Build Coastguard Worker
range()72*ab8db090SAndroid Build Coastguard Worker const Range &range() const {
73*ab8db090SAndroid Build Coastguard Worker return range_;
74*ab8db090SAndroid Build Coastguard Worker }
begin()75*ab8db090SAndroid Build Coastguard Worker std::size_t begin() const {
76*ab8db090SAndroid Build Coastguard Worker return range_.begin();
77*ab8db090SAndroid Build Coastguard Worker }
end()78*ab8db090SAndroid Build Coastguard Worker std::size_t end() const {
79*ab8db090SAndroid Build Coastguard Worker return range_.end();
80*ab8db090SAndroid Build Coastguard Worker }
key_pos()81*ab8db090SAndroid Build Coastguard Worker std::size_t key_pos() const {
82*ab8db090SAndroid Build Coastguard Worker return range_.key_pos();
83*ab8db090SAndroid Build Coastguard Worker }
weight()84*ab8db090SAndroid Build Coastguard Worker float weight() const {
85*ab8db090SAndroid Build Coastguard Worker return weight_;
86*ab8db090SAndroid Build Coastguard Worker }
87*ab8db090SAndroid Build Coastguard Worker
88*ab8db090SAndroid Build Coastguard Worker private:
89*ab8db090SAndroid Build Coastguard Worker Range range_;
90*ab8db090SAndroid Build Coastguard Worker float weight_;
91*ab8db090SAndroid Build Coastguard Worker };
92*ab8db090SAndroid Build Coastguard Worker
93*ab8db090SAndroid Build Coastguard Worker inline bool operator<(const WeightedRange &lhs, const WeightedRange &rhs) {
94*ab8db090SAndroid Build Coastguard Worker return lhs.weight() < rhs.weight();
95*ab8db090SAndroid Build Coastguard Worker }
96*ab8db090SAndroid Build Coastguard Worker
97*ab8db090SAndroid Build Coastguard Worker inline bool operator>(const WeightedRange &lhs, const WeightedRange &rhs) {
98*ab8db090SAndroid Build Coastguard Worker return lhs.weight() > rhs.weight();
99*ab8db090SAndroid Build Coastguard Worker }
100*ab8db090SAndroid Build Coastguard Worker
make_weighted_range(std::size_t begin,std::size_t end,std::size_t key_pos,float weight)101*ab8db090SAndroid Build Coastguard Worker inline WeightedRange make_weighted_range(std::size_t begin, std::size_t end,
102*ab8db090SAndroid Build Coastguard Worker std::size_t key_pos, float weight) {
103*ab8db090SAndroid Build Coastguard Worker WeightedRange range;
104*ab8db090SAndroid Build Coastguard Worker range.set_begin(begin);
105*ab8db090SAndroid Build Coastguard Worker range.set_end(end);
106*ab8db090SAndroid Build Coastguard Worker range.set_key_pos(key_pos);
107*ab8db090SAndroid Build Coastguard Worker range.set_weight(weight);
108*ab8db090SAndroid Build Coastguard Worker return range;
109*ab8db090SAndroid Build Coastguard Worker }
110*ab8db090SAndroid Build Coastguard Worker
111*ab8db090SAndroid Build Coastguard Worker } // namespace trie
112*ab8db090SAndroid Build Coastguard Worker } // namespace grimoire
113*ab8db090SAndroid Build Coastguard Worker } // namespace marisa
114*ab8db090SAndroid Build Coastguard Worker
115*ab8db090SAndroid Build Coastguard Worker #endif // MARISA_GRIMOIRE_TRIE_RANGE_H_
116