#ifndef MARISA_KEYSET_H_ #define MARISA_KEYSET_H_ #include "marisa/key.h" namespace marisa { class Keyset { public: enum { BASE_BLOCK_SIZE = 4096, EXTRA_BLOCK_SIZE = 1024, KEY_BLOCK_SIZE = 256 }; Keyset(); void push_back(const Key &key); void push_back(const Key &key, char end_marker); void push_back(const char *str); void push_back(const char *ptr, std::size_t length, float weight = 1.0); const Key &operator[](std::size_t i) const { MARISA_DEBUG_IF(i >= size_, MARISA_BOUND_ERROR); return key_blocks_[i / KEY_BLOCK_SIZE][i % KEY_BLOCK_SIZE]; } Key &operator[](std::size_t i) { MARISA_DEBUG_IF(i >= size_, MARISA_BOUND_ERROR); return key_blocks_[i / KEY_BLOCK_SIZE][i % KEY_BLOCK_SIZE]; } std::size_t num_keys() const { return size_; } bool empty() const { return size_ == 0; } std::size_t size() const { return size_; } std::size_t total_length() const { return total_length_; } void reset(); void clear(); void swap(Keyset &rhs); private: scoped_array > base_blocks_; std::size_t base_blocks_size_; std::size_t base_blocks_capacity_; scoped_array > extra_blocks_; std::size_t extra_blocks_size_; std::size_t extra_blocks_capacity_; scoped_array > key_blocks_; std::size_t key_blocks_size_; std::size_t key_blocks_capacity_; char *ptr_; std::size_t avail_; std::size_t size_; std::size_t total_length_; char *reserve(std::size_t size); void append_base_block(); void append_extra_block(std::size_t size); void append_key_block(); // Disallows copy and assignment. Keyset(const Keyset &); Keyset &operator=(const Keyset &); }; } // namespace marisa #endif // MARISA_KEYSET_H_