You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.5 KiB

#ifndef MARISA_GRIMOIRE_TRIE_CONFIG_H_
#define MARISA_GRIMOIRE_TRIE_CONFIG_H_
#include "marisa/base.h"
namespace marisa {
namespace grimoire {
namespace trie {
class Config {
public:
Config()
: num_tries_(MARISA_DEFAULT_NUM_TRIES),
cache_level_(MARISA_DEFAULT_CACHE),
tail_mode_(MARISA_DEFAULT_TAIL),
node_order_(MARISA_DEFAULT_ORDER) {}
void parse(int config_flags) {
Config temp;
temp.parse_(config_flags);
swap(temp);
}
int flags() const {
return (int)num_tries_ | tail_mode_ | node_order_;
}
std::size_t num_tries() const {
return num_tries_;
}
CacheLevel cache_level() const {
return cache_level_;
}
TailMode tail_mode() const {
return tail_mode_;
}
NodeOrder node_order() const {
return node_order_;
}
void clear() {
Config().swap(*this);
}
void swap(Config &rhs) {
marisa::swap(num_tries_, rhs.num_tries_);
marisa::swap(cache_level_, rhs.cache_level_);
marisa::swap(tail_mode_, rhs.tail_mode_);
marisa::swap(node_order_, rhs.node_order_);
}
private:
std::size_t num_tries_;
CacheLevel cache_level_;
TailMode tail_mode_;
NodeOrder node_order_;
void parse_(int config_flags) {
MARISA_THROW_IF((config_flags & ~MARISA_CONFIG_MASK) != 0,
MARISA_CODE_ERROR);
parse_num_tries(config_flags);
parse_cache_level(config_flags);
parse_tail_mode(config_flags);
parse_node_order(config_flags);
}
void parse_num_tries(int config_flags) {
const int num_tries = config_flags & MARISA_NUM_TRIES_MASK;
if (num_tries != 0) {
num_tries_ = static_cast<std::size_t>(num_tries);
}
}
void parse_cache_level(int config_flags) {
switch (config_flags & MARISA_CACHE_LEVEL_MASK) {
case 0: {
cache_level_ = MARISA_DEFAULT_CACHE;
break;
}
case MARISA_HUGE_CACHE: {
cache_level_ = MARISA_HUGE_CACHE;
break;
}
case MARISA_LARGE_CACHE: {
cache_level_ = MARISA_LARGE_CACHE;
break;
}
case MARISA_NORMAL_CACHE: {
cache_level_ = MARISA_NORMAL_CACHE;
break;
}
case MARISA_SMALL_CACHE: {
cache_level_ = MARISA_SMALL_CACHE;
break;
}
case MARISA_TINY_CACHE: {
cache_level_ = MARISA_TINY_CACHE;
break;
}
default: {
MARISA_THROW(MARISA_CODE_ERROR, "undefined cache level");
}
}
}
void parse_tail_mode(int config_flags) {
switch (config_flags & MARISA_TAIL_MODE_MASK) {
case 0: {
tail_mode_ = MARISA_DEFAULT_TAIL;
break;
}
case MARISA_TEXT_TAIL: {
tail_mode_ = MARISA_TEXT_TAIL;
break;
}
case MARISA_BINARY_TAIL: {
tail_mode_ = MARISA_BINARY_TAIL;
break;
}
default: {
MARISA_THROW(MARISA_CODE_ERROR, "undefined tail mode");
}
}
}
void parse_node_order(int config_flags) {
switch (config_flags & MARISA_NODE_ORDER_MASK) {
case 0: {
node_order_ = MARISA_DEFAULT_ORDER;
break;
}
case MARISA_LABEL_ORDER: {
node_order_ = MARISA_LABEL_ORDER;
break;
}
case MARISA_WEIGHT_ORDER: {
node_order_ = MARISA_WEIGHT_ORDER;
break;
}
default: {
MARISA_THROW(MARISA_CODE_ERROR, "undefined node order");
}
}
}
// Disallows copy and assignment.
Config(const Config &);
Config &operator=(const Config &);
};
} // namespace trie
} // namespace grimoire
} // namespace marisa
#endif // MARISA_GRIMOIRE_TRIE_CONFIG_H_