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