82 lines
1.7 KiB
C++
82 lines
1.7 KiB
C++
#ifndef MARISA_GRIMOIRE_TRIE_CACHE_H_
|
|
#define MARISA_GRIMOIRE_TRIE_CACHE_H_
|
|
|
|
#include <cfloat>
|
|
|
|
#include "marisa/base.h"
|
|
|
|
namespace marisa {
|
|
namespace grimoire {
|
|
namespace trie {
|
|
|
|
class Cache {
|
|
public:
|
|
Cache() : parent_(0), child_(0), union_() {
|
|
union_.weight = FLT_MIN;
|
|
}
|
|
Cache(const Cache &cache)
|
|
: parent_(cache.parent_), child_(cache.child_), union_(cache.union_) {}
|
|
|
|
Cache &operator=(const Cache &cache) {
|
|
parent_ = cache.parent_;
|
|
child_ = cache.child_;
|
|
union_ = cache.union_;
|
|
return *this;
|
|
}
|
|
|
|
void set_parent(std::size_t parent) {
|
|
MARISA_DEBUG_IF(parent > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
|
|
parent_ = (UInt32)parent;
|
|
}
|
|
void set_child(std::size_t child) {
|
|
MARISA_DEBUG_IF(child > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
|
|
child_ = (UInt32)child;
|
|
}
|
|
void set_base(UInt8 base) {
|
|
union_.link = (union_.link & ~0xFFU) | base;
|
|
}
|
|
void set_extra(std::size_t extra) {
|
|
MARISA_DEBUG_IF(extra > (MARISA_UINT32_MAX >> 8), MARISA_SIZE_ERROR);
|
|
union_.link = (UInt32)((union_.link & 0xFFU) | (extra << 8));
|
|
}
|
|
void set_weight(float weight) {
|
|
union_.weight = weight;
|
|
}
|
|
|
|
std::size_t parent() const {
|
|
return parent_;
|
|
}
|
|
std::size_t child() const {
|
|
return child_;
|
|
}
|
|
UInt8 base() const {
|
|
return (UInt8)(union_.link & 0xFFU);
|
|
}
|
|
std::size_t extra() const {
|
|
return union_.link >> 8;
|
|
}
|
|
char label() const {
|
|
return (char)base();
|
|
}
|
|
std::size_t link() const {
|
|
return union_.link;
|
|
}
|
|
float weight() const {
|
|
return union_.weight;
|
|
}
|
|
|
|
private:
|
|
UInt32 parent_;
|
|
UInt32 child_;
|
|
union Union {
|
|
UInt32 link;
|
|
float weight;
|
|
} union_;
|
|
};
|
|
|
|
} // namespace trie
|
|
} // namespace grimoire
|
|
} // namespace marisa
|
|
|
|
#endif // MARISA_GRIMOIRE_TRIE_CACHE_H_
|