You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
#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<scoped_array<char> > base_blocks_;
|
|
std::size_t base_blocks_size_;
|
|
std::size_t base_blocks_capacity_;
|
|
scoped_array<scoped_array<char> > extra_blocks_;
|
|
std::size_t extra_blocks_size_;
|
|
std::size_t extra_blocks_capacity_;
|
|
scoped_array<scoped_array<Key> > 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_
|