xref: /aosp_15_r20/external/marisa-trie/include/marisa/keyset.h (revision ab8db090fce404b23716c4c9194221ee27efe31c)
1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_KEYSET_H_
2*ab8db090SAndroid Build Coastguard Worker #define MARISA_KEYSET_H_
3*ab8db090SAndroid Build Coastguard Worker 
4*ab8db090SAndroid Build Coastguard Worker #include "marisa/key.h"
5*ab8db090SAndroid Build Coastguard Worker 
6*ab8db090SAndroid Build Coastguard Worker namespace marisa {
7*ab8db090SAndroid Build Coastguard Worker 
8*ab8db090SAndroid Build Coastguard Worker class Keyset {
9*ab8db090SAndroid Build Coastguard Worker  public:
10*ab8db090SAndroid Build Coastguard Worker   enum {
11*ab8db090SAndroid Build Coastguard Worker     BASE_BLOCK_SIZE  = 4096,
12*ab8db090SAndroid Build Coastguard Worker     EXTRA_BLOCK_SIZE = 1024,
13*ab8db090SAndroid Build Coastguard Worker     KEY_BLOCK_SIZE   = 256
14*ab8db090SAndroid Build Coastguard Worker   };
15*ab8db090SAndroid Build Coastguard Worker 
16*ab8db090SAndroid Build Coastguard Worker   Keyset();
17*ab8db090SAndroid Build Coastguard Worker 
18*ab8db090SAndroid Build Coastguard Worker   void push_back(const Key &key);
19*ab8db090SAndroid Build Coastguard Worker   void push_back(const Key &key, char end_marker);
20*ab8db090SAndroid Build Coastguard Worker 
21*ab8db090SAndroid Build Coastguard Worker   void push_back(const char *str);
22*ab8db090SAndroid Build Coastguard Worker   void push_back(const char *ptr, std::size_t length, float weight = 1.0);
23*ab8db090SAndroid Build Coastguard Worker 
24*ab8db090SAndroid Build Coastguard Worker   const Key &operator[](std::size_t i) const {
25*ab8db090SAndroid Build Coastguard Worker     MARISA_DEBUG_IF(i >= size_, MARISA_BOUND_ERROR);
26*ab8db090SAndroid Build Coastguard Worker     return key_blocks_[i / KEY_BLOCK_SIZE][i % KEY_BLOCK_SIZE];
27*ab8db090SAndroid Build Coastguard Worker   }
28*ab8db090SAndroid Build Coastguard Worker   Key &operator[](std::size_t i) {
29*ab8db090SAndroid Build Coastguard Worker     MARISA_DEBUG_IF(i >= size_, MARISA_BOUND_ERROR);
30*ab8db090SAndroid Build Coastguard Worker     return key_blocks_[i / KEY_BLOCK_SIZE][i % KEY_BLOCK_SIZE];
31*ab8db090SAndroid Build Coastguard Worker   }
32*ab8db090SAndroid Build Coastguard Worker 
num_keys()33*ab8db090SAndroid Build Coastguard Worker   std::size_t num_keys() const {
34*ab8db090SAndroid Build Coastguard Worker     return size_;
35*ab8db090SAndroid Build Coastguard Worker   }
36*ab8db090SAndroid Build Coastguard Worker 
empty()37*ab8db090SAndroid Build Coastguard Worker   bool empty() const {
38*ab8db090SAndroid Build Coastguard Worker     return size_ == 0;
39*ab8db090SAndroid Build Coastguard Worker   }
size()40*ab8db090SAndroid Build Coastguard Worker   std::size_t size() const {
41*ab8db090SAndroid Build Coastguard Worker     return size_;
42*ab8db090SAndroid Build Coastguard Worker   }
total_length()43*ab8db090SAndroid Build Coastguard Worker   std::size_t total_length() const {
44*ab8db090SAndroid Build Coastguard Worker     return total_length_;
45*ab8db090SAndroid Build Coastguard Worker   }
46*ab8db090SAndroid Build Coastguard Worker 
47*ab8db090SAndroid Build Coastguard Worker   void reset();
48*ab8db090SAndroid Build Coastguard Worker 
49*ab8db090SAndroid Build Coastguard Worker   void clear();
50*ab8db090SAndroid Build Coastguard Worker   void swap(Keyset &rhs);
51*ab8db090SAndroid Build Coastguard Worker 
52*ab8db090SAndroid Build Coastguard Worker  private:
53*ab8db090SAndroid Build Coastguard Worker   scoped_array<scoped_array<char> > base_blocks_;
54*ab8db090SAndroid Build Coastguard Worker   std::size_t base_blocks_size_;
55*ab8db090SAndroid Build Coastguard Worker   std::size_t base_blocks_capacity_;
56*ab8db090SAndroid Build Coastguard Worker   scoped_array<scoped_array<char> > extra_blocks_;
57*ab8db090SAndroid Build Coastguard Worker   std::size_t extra_blocks_size_;
58*ab8db090SAndroid Build Coastguard Worker   std::size_t extra_blocks_capacity_;
59*ab8db090SAndroid Build Coastguard Worker   scoped_array<scoped_array<Key> > key_blocks_;
60*ab8db090SAndroid Build Coastguard Worker   std::size_t key_blocks_size_;
61*ab8db090SAndroid Build Coastguard Worker   std::size_t key_blocks_capacity_;
62*ab8db090SAndroid Build Coastguard Worker   char *ptr_;
63*ab8db090SAndroid Build Coastguard Worker   std::size_t avail_;
64*ab8db090SAndroid Build Coastguard Worker   std::size_t size_;
65*ab8db090SAndroid Build Coastguard Worker   std::size_t total_length_;
66*ab8db090SAndroid Build Coastguard Worker 
67*ab8db090SAndroid Build Coastguard Worker   char *reserve(std::size_t size);
68*ab8db090SAndroid Build Coastguard Worker 
69*ab8db090SAndroid Build Coastguard Worker   void append_base_block();
70*ab8db090SAndroid Build Coastguard Worker   void append_extra_block(std::size_t size);
71*ab8db090SAndroid Build Coastguard Worker   void append_key_block();
72*ab8db090SAndroid Build Coastguard Worker 
73*ab8db090SAndroid Build Coastguard Worker   // Disallows copy and assignment.
74*ab8db090SAndroid Build Coastguard Worker   Keyset(const Keyset &);
75*ab8db090SAndroid Build Coastguard Worker   Keyset &operator=(const Keyset &);
76*ab8db090SAndroid Build Coastguard Worker };
77*ab8db090SAndroid Build Coastguard Worker 
78*ab8db090SAndroid Build Coastguard Worker }  // namespace marisa
79*ab8db090SAndroid Build Coastguard Worker 
80*ab8db090SAndroid Build Coastguard Worker #endif  // MARISA_KEYSET_H_
81