xref: /aosp_15_r20/external/marisa-trie/lib/marisa/grimoire/trie/cache.h (revision ab8db090fce404b23716c4c9194221ee27efe31c)
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