61 lines
1.1 KiB
C++
61 lines
1.1 KiB
C++
#include "ngram-mod.h"
|
|
|
|
//
|
|
// common_ngram_mod
|
|
//
|
|
|
|
common_ngram_mod::common_ngram_mod(uint16_t n, size_t size) : n(n), used(0) {
|
|
entries.resize(size);
|
|
|
|
reset();
|
|
}
|
|
|
|
size_t common_ngram_mod::idx(const entry_t * tokens) const {
|
|
size_t res = 0;
|
|
|
|
for (size_t i = 0; i < n; ++i) {
|
|
res = res*6364136223846793005ULL + tokens[i];
|
|
}
|
|
|
|
res = res % entries.size();
|
|
|
|
return res;
|
|
}
|
|
|
|
void common_ngram_mod::add(const entry_t * tokens) {
|
|
const size_t i = idx(tokens);
|
|
|
|
if (entries[i] == EMPTY) {
|
|
used++;
|
|
}
|
|
|
|
entries[i] = tokens[n];
|
|
}
|
|
|
|
common_ngram_mod::entry_t common_ngram_mod::get(const entry_t * tokens) const {
|
|
const size_t i = idx(tokens);
|
|
|
|
return entries[i];
|
|
}
|
|
|
|
void common_ngram_mod::reset() {
|
|
std::fill(entries.begin(), entries.end(), EMPTY);
|
|
used = 0;
|
|
}
|
|
|
|
size_t common_ngram_mod::get_n() const {
|
|
return n;
|
|
}
|
|
|
|
size_t common_ngram_mod::get_used() const {
|
|
return used;
|
|
}
|
|
|
|
size_t common_ngram_mod::size() const {
|
|
return entries.size();
|
|
}
|
|
|
|
size_t common_ngram_mod::size_bytes() const {
|
|
return entries.size() * sizeof(entries[0]);
|
|
}
|