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
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_
|