1 #ifndef MARISA_GRIMOIRE_TRIE_CACHE_H_ 2 #define MARISA_GRIMOIRE_TRIE_CACHE_H_ 3 4 #include <cfloat> 5 6 #include "marisa/base.h" 7 8 namespace marisa { 9 namespace grimoire { 10 namespace trie { 11 12 class Cache { 13 public: Cache()14 Cache() : parent_(0), child_(0), union_() { 15 union_.weight = FLT_MIN; 16 } Cache(const Cache & cache)17 Cache(const Cache &cache) 18 : parent_(cache.parent_), child_(cache.child_), union_(cache.union_) {} 19 20 Cache &operator=(const Cache &cache) { 21 parent_ = cache.parent_; 22 child_ = cache.child_; 23 union_ = cache.union_; 24 return *this; 25 } 26 set_parent(std::size_t parent)27 void set_parent(std::size_t parent) { 28 MARISA_DEBUG_IF(parent > MARISA_UINT32_MAX, MARISA_SIZE_ERROR); 29 parent_ = (UInt32)parent; 30 } set_child(std::size_t child)31 void set_child(std::size_t child) { 32 MARISA_DEBUG_IF(child > MARISA_UINT32_MAX, MARISA_SIZE_ERROR); 33 child_ = (UInt32)child; 34 } set_base(UInt8 base)35 void set_base(UInt8 base) { 36 union_.link = (union_.link & ~0xFFU) | base; 37 } set_extra(std::size_t extra)38 void set_extra(std::size_t extra) { 39 MARISA_DEBUG_IF(extra > (MARISA_UINT32_MAX >> 8), MARISA_SIZE_ERROR); 40 union_.link = (UInt32)((union_.link & 0xFFU) | (extra << 8)); 41 } set_weight(float weight)42 void set_weight(float weight) { 43 union_.weight = weight; 44 } 45 parent()46 std::size_t parent() const { 47 return parent_; 48 } child()49 std::size_t child() const { 50 return child_; 51 } base()52 UInt8 base() const { 53 return (UInt8)(union_.link & 0xFFU); 54 } extra()55 std::size_t extra() const { 56 return union_.link >> 8; 57 } label()58 char label() const { 59 return (char)base(); 60 } link()61 std::size_t link() const { 62 return union_.link; 63 } weight()64 float weight() const { 65 return union_.weight; 66 } 67 68 private: 69 UInt32 parent_; 70 UInt32 child_; 71 union Union { 72 UInt32 link; 73 float weight; 74 } union_; 75 }; 76 77 } // namespace trie 78 } // namespace grimoire 79 } // namespace marisa 80 81 #endif // MARISA_GRIMOIRE_TRIE_CACHE_H_ 82