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