xref: /aosp_15_r20/external/marisa-trie/lib/marisa/grimoire/trie/config.h (revision ab8db090fce404b23716c4c9194221ee27efe31c)
1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_GRIMOIRE_TRIE_CONFIG_H_
2*ab8db090SAndroid Build Coastguard Worker #define MARISA_GRIMOIRE_TRIE_CONFIG_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 Config {
11*ab8db090SAndroid Build Coastguard Worker  public:
Config()12*ab8db090SAndroid Build Coastguard Worker   Config()
13*ab8db090SAndroid Build Coastguard Worker       : num_tries_(MARISA_DEFAULT_NUM_TRIES),
14*ab8db090SAndroid Build Coastguard Worker         cache_level_(MARISA_DEFAULT_CACHE),
15*ab8db090SAndroid Build Coastguard Worker         tail_mode_(MARISA_DEFAULT_TAIL),
16*ab8db090SAndroid Build Coastguard Worker         node_order_(MARISA_DEFAULT_ORDER) {}
17*ab8db090SAndroid Build Coastguard Worker 
parse(int config_flags)18*ab8db090SAndroid Build Coastguard Worker   void parse(int config_flags) {
19*ab8db090SAndroid Build Coastguard Worker     Config temp;
20*ab8db090SAndroid Build Coastguard Worker     temp.parse_(config_flags);
21*ab8db090SAndroid Build Coastguard Worker     swap(temp);
22*ab8db090SAndroid Build Coastguard Worker   }
23*ab8db090SAndroid Build Coastguard Worker 
flags()24*ab8db090SAndroid Build Coastguard Worker   int flags() const {
25*ab8db090SAndroid Build Coastguard Worker     return (int)num_tries_ | tail_mode_ | node_order_;
26*ab8db090SAndroid Build Coastguard Worker   }
27*ab8db090SAndroid Build Coastguard Worker 
num_tries()28*ab8db090SAndroid Build Coastguard Worker   std::size_t num_tries() const {
29*ab8db090SAndroid Build Coastguard Worker     return num_tries_;
30*ab8db090SAndroid Build Coastguard Worker   }
cache_level()31*ab8db090SAndroid Build Coastguard Worker   CacheLevel cache_level() const {
32*ab8db090SAndroid Build Coastguard Worker     return cache_level_;
33*ab8db090SAndroid Build Coastguard Worker   }
tail_mode()34*ab8db090SAndroid Build Coastguard Worker   TailMode tail_mode() const {
35*ab8db090SAndroid Build Coastguard Worker     return tail_mode_;
36*ab8db090SAndroid Build Coastguard Worker   }
node_order()37*ab8db090SAndroid Build Coastguard Worker   NodeOrder node_order() const {
38*ab8db090SAndroid Build Coastguard Worker     return node_order_;
39*ab8db090SAndroid Build Coastguard Worker   }
40*ab8db090SAndroid Build Coastguard Worker 
clear()41*ab8db090SAndroid Build Coastguard Worker   void clear() {
42*ab8db090SAndroid Build Coastguard Worker     Config().swap(*this);
43*ab8db090SAndroid Build Coastguard Worker   }
swap(Config & rhs)44*ab8db090SAndroid Build Coastguard Worker   void swap(Config &rhs) {
45*ab8db090SAndroid Build Coastguard Worker     marisa::swap(num_tries_, rhs.num_tries_);
46*ab8db090SAndroid Build Coastguard Worker     marisa::swap(cache_level_, rhs.cache_level_);
47*ab8db090SAndroid Build Coastguard Worker     marisa::swap(tail_mode_, rhs.tail_mode_);
48*ab8db090SAndroid Build Coastguard Worker     marisa::swap(node_order_, rhs.node_order_);
49*ab8db090SAndroid Build Coastguard Worker   }
50*ab8db090SAndroid Build Coastguard Worker 
51*ab8db090SAndroid Build Coastguard Worker  private:
52*ab8db090SAndroid Build Coastguard Worker   std::size_t num_tries_;
53*ab8db090SAndroid Build Coastguard Worker   CacheLevel cache_level_;
54*ab8db090SAndroid Build Coastguard Worker   TailMode tail_mode_;
55*ab8db090SAndroid Build Coastguard Worker   NodeOrder node_order_;
56*ab8db090SAndroid Build Coastguard Worker 
parse_(int config_flags)57*ab8db090SAndroid Build Coastguard Worker   void parse_(int config_flags) {
58*ab8db090SAndroid Build Coastguard Worker     MARISA_THROW_IF((config_flags & ~MARISA_CONFIG_MASK) != 0,
59*ab8db090SAndroid Build Coastguard Worker         MARISA_CODE_ERROR);
60*ab8db090SAndroid Build Coastguard Worker 
61*ab8db090SAndroid Build Coastguard Worker     parse_num_tries(config_flags);
62*ab8db090SAndroid Build Coastguard Worker     parse_cache_level(config_flags);
63*ab8db090SAndroid Build Coastguard Worker     parse_tail_mode(config_flags);
64*ab8db090SAndroid Build Coastguard Worker     parse_node_order(config_flags);
65*ab8db090SAndroid Build Coastguard Worker   }
66*ab8db090SAndroid Build Coastguard Worker 
parse_num_tries(int config_flags)67*ab8db090SAndroid Build Coastguard Worker   void parse_num_tries(int config_flags) {
68*ab8db090SAndroid Build Coastguard Worker     const int num_tries = config_flags & MARISA_NUM_TRIES_MASK;
69*ab8db090SAndroid Build Coastguard Worker     if (num_tries != 0) {
70*ab8db090SAndroid Build Coastguard Worker       num_tries_ = static_cast<std::size_t>(num_tries);
71*ab8db090SAndroid Build Coastguard Worker     }
72*ab8db090SAndroid Build Coastguard Worker   }
73*ab8db090SAndroid Build Coastguard Worker 
parse_cache_level(int config_flags)74*ab8db090SAndroid Build Coastguard Worker   void parse_cache_level(int config_flags) {
75*ab8db090SAndroid Build Coastguard Worker     switch (config_flags & MARISA_CACHE_LEVEL_MASK) {
76*ab8db090SAndroid Build Coastguard Worker       case 0: {
77*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_DEFAULT_CACHE;
78*ab8db090SAndroid Build Coastguard Worker         break;
79*ab8db090SAndroid Build Coastguard Worker       }
80*ab8db090SAndroid Build Coastguard Worker       case MARISA_HUGE_CACHE: {
81*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_HUGE_CACHE;
82*ab8db090SAndroid Build Coastguard Worker         break;
83*ab8db090SAndroid Build Coastguard Worker       }
84*ab8db090SAndroid Build Coastguard Worker       case MARISA_LARGE_CACHE: {
85*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_LARGE_CACHE;
86*ab8db090SAndroid Build Coastguard Worker         break;
87*ab8db090SAndroid Build Coastguard Worker       }
88*ab8db090SAndroid Build Coastguard Worker       case MARISA_NORMAL_CACHE: {
89*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_NORMAL_CACHE;
90*ab8db090SAndroid Build Coastguard Worker         break;
91*ab8db090SAndroid Build Coastguard Worker       }
92*ab8db090SAndroid Build Coastguard Worker       case MARISA_SMALL_CACHE: {
93*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_SMALL_CACHE;
94*ab8db090SAndroid Build Coastguard Worker         break;
95*ab8db090SAndroid Build Coastguard Worker       }
96*ab8db090SAndroid Build Coastguard Worker       case MARISA_TINY_CACHE: {
97*ab8db090SAndroid Build Coastguard Worker         cache_level_ = MARISA_TINY_CACHE;
98*ab8db090SAndroid Build Coastguard Worker         break;
99*ab8db090SAndroid Build Coastguard Worker       }
100*ab8db090SAndroid Build Coastguard Worker       default: {
101*ab8db090SAndroid Build Coastguard Worker         MARISA_THROW(MARISA_CODE_ERROR, "undefined cache level");
102*ab8db090SAndroid Build Coastguard Worker       }
103*ab8db090SAndroid Build Coastguard Worker     }
104*ab8db090SAndroid Build Coastguard Worker   }
105*ab8db090SAndroid Build Coastguard Worker 
parse_tail_mode(int config_flags)106*ab8db090SAndroid Build Coastguard Worker   void parse_tail_mode(int config_flags) {
107*ab8db090SAndroid Build Coastguard Worker     switch (config_flags & MARISA_TAIL_MODE_MASK) {
108*ab8db090SAndroid Build Coastguard Worker       case 0: {
109*ab8db090SAndroid Build Coastguard Worker         tail_mode_ = MARISA_DEFAULT_TAIL;
110*ab8db090SAndroid Build Coastguard Worker         break;
111*ab8db090SAndroid Build Coastguard Worker       }
112*ab8db090SAndroid Build Coastguard Worker       case MARISA_TEXT_TAIL: {
113*ab8db090SAndroid Build Coastguard Worker         tail_mode_ = MARISA_TEXT_TAIL;
114*ab8db090SAndroid Build Coastguard Worker         break;
115*ab8db090SAndroid Build Coastguard Worker       }
116*ab8db090SAndroid Build Coastguard Worker       case MARISA_BINARY_TAIL: {
117*ab8db090SAndroid Build Coastguard Worker         tail_mode_ = MARISA_BINARY_TAIL;
118*ab8db090SAndroid Build Coastguard Worker         break;
119*ab8db090SAndroid Build Coastguard Worker       }
120*ab8db090SAndroid Build Coastguard Worker       default: {
121*ab8db090SAndroid Build Coastguard Worker         MARISA_THROW(MARISA_CODE_ERROR, "undefined tail mode");
122*ab8db090SAndroid Build Coastguard Worker       }
123*ab8db090SAndroid Build Coastguard Worker     }
124*ab8db090SAndroid Build Coastguard Worker   }
125*ab8db090SAndroid Build Coastguard Worker 
parse_node_order(int config_flags)126*ab8db090SAndroid Build Coastguard Worker   void parse_node_order(int config_flags) {
127*ab8db090SAndroid Build Coastguard Worker     switch (config_flags & MARISA_NODE_ORDER_MASK) {
128*ab8db090SAndroid Build Coastguard Worker       case 0: {
129*ab8db090SAndroid Build Coastguard Worker         node_order_ = MARISA_DEFAULT_ORDER;
130*ab8db090SAndroid Build Coastguard Worker         break;
131*ab8db090SAndroid Build Coastguard Worker       }
132*ab8db090SAndroid Build Coastguard Worker       case MARISA_LABEL_ORDER: {
133*ab8db090SAndroid Build Coastguard Worker         node_order_ = MARISA_LABEL_ORDER;
134*ab8db090SAndroid Build Coastguard Worker         break;
135*ab8db090SAndroid Build Coastguard Worker       }
136*ab8db090SAndroid Build Coastguard Worker       case MARISA_WEIGHT_ORDER: {
137*ab8db090SAndroid Build Coastguard Worker         node_order_ = MARISA_WEIGHT_ORDER;
138*ab8db090SAndroid Build Coastguard Worker         break;
139*ab8db090SAndroid Build Coastguard Worker       }
140*ab8db090SAndroid Build Coastguard Worker       default: {
141*ab8db090SAndroid Build Coastguard Worker         MARISA_THROW(MARISA_CODE_ERROR, "undefined node order");
142*ab8db090SAndroid Build Coastguard Worker       }
143*ab8db090SAndroid Build Coastguard Worker     }
144*ab8db090SAndroid Build Coastguard Worker   }
145*ab8db090SAndroid Build Coastguard Worker 
146*ab8db090SAndroid Build Coastguard Worker   // Disallows copy and assignment.
147*ab8db090SAndroid Build Coastguard Worker   Config(const Config &);
148*ab8db090SAndroid Build Coastguard Worker   Config &operator=(const Config &);
149*ab8db090SAndroid Build Coastguard Worker };
150*ab8db090SAndroid Build Coastguard Worker 
151*ab8db090SAndroid Build Coastguard Worker }  // namespace trie
152*ab8db090SAndroid Build Coastguard Worker }  // namespace grimoire
153*ab8db090SAndroid Build Coastguard Worker }  // namespace marisa
154*ab8db090SAndroid Build Coastguard Worker 
155*ab8db090SAndroid Build Coastguard Worker #endif  // MARISA_GRIMOIRE_TRIE_CONFIG_H_
156