1*ab8db090SAndroid Build Coastguard Worker #include <cstring>
2*ab8db090SAndroid Build Coastguard Worker #include <new>
3*ab8db090SAndroid Build Coastguard Worker
4*ab8db090SAndroid Build Coastguard Worker #include "marisa-swig.h"
5*ab8db090SAndroid Build Coastguard Worker
6*ab8db090SAndroid Build Coastguard Worker namespace marisa_swig {
7*ab8db090SAndroid Build Coastguard Worker
str(const char ** ptr_out,size_t * length_out) const8*ab8db090SAndroid Build Coastguard Worker void Key::str(const char **ptr_out, size_t *length_out) const {
9*ab8db090SAndroid Build Coastguard Worker *ptr_out = key_.ptr();
10*ab8db090SAndroid Build Coastguard Worker *length_out = key_.length();
11*ab8db090SAndroid Build Coastguard Worker }
12*ab8db090SAndroid Build Coastguard Worker
id() const13*ab8db090SAndroid Build Coastguard Worker size_t Key::id() const {
14*ab8db090SAndroid Build Coastguard Worker return key_.id();
15*ab8db090SAndroid Build Coastguard Worker }
16*ab8db090SAndroid Build Coastguard Worker
weight() const17*ab8db090SAndroid Build Coastguard Worker float Key::weight() const {
18*ab8db090SAndroid Build Coastguard Worker return key_.weight();
19*ab8db090SAndroid Build Coastguard Worker }
20*ab8db090SAndroid Build Coastguard Worker
str(const char ** ptr_out,size_t * length_out) const21*ab8db090SAndroid Build Coastguard Worker void Query::str(const char **ptr_out, size_t *length_out) const {
22*ab8db090SAndroid Build Coastguard Worker *ptr_out = query_.ptr();
23*ab8db090SAndroid Build Coastguard Worker *length_out = query_.length();
24*ab8db090SAndroid Build Coastguard Worker }
25*ab8db090SAndroid Build Coastguard Worker
id() const26*ab8db090SAndroid Build Coastguard Worker size_t Query::id() const {
27*ab8db090SAndroid Build Coastguard Worker return query_.id();
28*ab8db090SAndroid Build Coastguard Worker }
29*ab8db090SAndroid Build Coastguard Worker
Keyset()30*ab8db090SAndroid Build Coastguard Worker Keyset::Keyset() : keyset_(new (std::nothrow) marisa::Keyset) {
31*ab8db090SAndroid Build Coastguard Worker MARISA_THROW_IF(keyset_ == NULL, ::MARISA_MEMORY_ERROR);
32*ab8db090SAndroid Build Coastguard Worker }
33*ab8db090SAndroid Build Coastguard Worker
~Keyset()34*ab8db090SAndroid Build Coastguard Worker Keyset::~Keyset() {
35*ab8db090SAndroid Build Coastguard Worker delete keyset_;
36*ab8db090SAndroid Build Coastguard Worker }
37*ab8db090SAndroid Build Coastguard Worker
push_back(const marisa::Key & key)38*ab8db090SAndroid Build Coastguard Worker void Keyset::push_back(const marisa::Key &key) {
39*ab8db090SAndroid Build Coastguard Worker keyset_->push_back(key);
40*ab8db090SAndroid Build Coastguard Worker }
41*ab8db090SAndroid Build Coastguard Worker
push_back(const char * ptr,size_t length,float weight)42*ab8db090SAndroid Build Coastguard Worker void Keyset::push_back(const char *ptr, size_t length, float weight) {
43*ab8db090SAndroid Build Coastguard Worker keyset_->push_back(ptr, length, weight);
44*ab8db090SAndroid Build Coastguard Worker }
45*ab8db090SAndroid Build Coastguard Worker
key(size_t i) const46*ab8db090SAndroid Build Coastguard Worker const Key &Keyset::key(size_t i) const {
47*ab8db090SAndroid Build Coastguard Worker return reinterpret_cast<const Key &>((*keyset_)[i]);
48*ab8db090SAndroid Build Coastguard Worker }
49*ab8db090SAndroid Build Coastguard Worker
key_str(size_t i,const char ** ptr_out,size_t * length_out) const50*ab8db090SAndroid Build Coastguard Worker void Keyset::key_str(size_t i,
51*ab8db090SAndroid Build Coastguard Worker const char **ptr_out, size_t *length_out) const {
52*ab8db090SAndroid Build Coastguard Worker *ptr_out = (*keyset_)[i].ptr();
53*ab8db090SAndroid Build Coastguard Worker *length_out = (*keyset_)[i].length();
54*ab8db090SAndroid Build Coastguard Worker }
55*ab8db090SAndroid Build Coastguard Worker
key_id(size_t i) const56*ab8db090SAndroid Build Coastguard Worker size_t Keyset::key_id(size_t i) const {
57*ab8db090SAndroid Build Coastguard Worker return (*keyset_)[i].id();
58*ab8db090SAndroid Build Coastguard Worker }
59*ab8db090SAndroid Build Coastguard Worker
num_keys() const60*ab8db090SAndroid Build Coastguard Worker size_t Keyset::num_keys() const {
61*ab8db090SAndroid Build Coastguard Worker return keyset_->num_keys();
62*ab8db090SAndroid Build Coastguard Worker }
63*ab8db090SAndroid Build Coastguard Worker
empty() const64*ab8db090SAndroid Build Coastguard Worker bool Keyset::empty() const {
65*ab8db090SAndroid Build Coastguard Worker return keyset_->empty();
66*ab8db090SAndroid Build Coastguard Worker }
67*ab8db090SAndroid Build Coastguard Worker
size() const68*ab8db090SAndroid Build Coastguard Worker size_t Keyset::size() const {
69*ab8db090SAndroid Build Coastguard Worker return keyset_->size();
70*ab8db090SAndroid Build Coastguard Worker }
71*ab8db090SAndroid Build Coastguard Worker
total_length() const72*ab8db090SAndroid Build Coastguard Worker size_t Keyset::total_length() const {
73*ab8db090SAndroid Build Coastguard Worker return keyset_->total_length();
74*ab8db090SAndroid Build Coastguard Worker }
75*ab8db090SAndroid Build Coastguard Worker
reset()76*ab8db090SAndroid Build Coastguard Worker void Keyset::reset() {
77*ab8db090SAndroid Build Coastguard Worker keyset_->reset();
78*ab8db090SAndroid Build Coastguard Worker }
79*ab8db090SAndroid Build Coastguard Worker
clear()80*ab8db090SAndroid Build Coastguard Worker void Keyset::clear() {
81*ab8db090SAndroid Build Coastguard Worker keyset_->clear();
82*ab8db090SAndroid Build Coastguard Worker }
83*ab8db090SAndroid Build Coastguard Worker
Agent()84*ab8db090SAndroid Build Coastguard Worker Agent::Agent()
85*ab8db090SAndroid Build Coastguard Worker : agent_(new (std::nothrow) marisa::Agent), buf_(NULL), buf_size_(0) {
86*ab8db090SAndroid Build Coastguard Worker MARISA_THROW_IF(agent_ == NULL, ::MARISA_MEMORY_ERROR);
87*ab8db090SAndroid Build Coastguard Worker }
88*ab8db090SAndroid Build Coastguard Worker
~Agent()89*ab8db090SAndroid Build Coastguard Worker Agent::~Agent() {
90*ab8db090SAndroid Build Coastguard Worker delete agent_;
91*ab8db090SAndroid Build Coastguard Worker delete [] buf_;
92*ab8db090SAndroid Build Coastguard Worker }
93*ab8db090SAndroid Build Coastguard Worker
set_query(const char * ptr,size_t length)94*ab8db090SAndroid Build Coastguard Worker void Agent::set_query(const char *ptr, size_t length) {
95*ab8db090SAndroid Build Coastguard Worker if (length > buf_size_) {
96*ab8db090SAndroid Build Coastguard Worker size_t new_buf_size = (buf_size_ != 0) ? buf_size_ : 1;
97*ab8db090SAndroid Build Coastguard Worker if (length >= (MARISA_SIZE_MAX / 2)) {
98*ab8db090SAndroid Build Coastguard Worker new_buf_size = MARISA_SIZE_MAX;
99*ab8db090SAndroid Build Coastguard Worker } else {
100*ab8db090SAndroid Build Coastguard Worker while (new_buf_size < length) {
101*ab8db090SAndroid Build Coastguard Worker new_buf_size *= 2;
102*ab8db090SAndroid Build Coastguard Worker }
103*ab8db090SAndroid Build Coastguard Worker }
104*ab8db090SAndroid Build Coastguard Worker char *new_buf = new (std::nothrow) char[new_buf_size];
105*ab8db090SAndroid Build Coastguard Worker MARISA_THROW_IF(new_buf == NULL, MARISA_MEMORY_ERROR);
106*ab8db090SAndroid Build Coastguard Worker delete [] buf_;
107*ab8db090SAndroid Build Coastguard Worker buf_ = new_buf;
108*ab8db090SAndroid Build Coastguard Worker buf_size_ = new_buf_size;
109*ab8db090SAndroid Build Coastguard Worker }
110*ab8db090SAndroid Build Coastguard Worker std::memcpy(buf_, ptr, length);
111*ab8db090SAndroid Build Coastguard Worker agent_->set_query(buf_, length);
112*ab8db090SAndroid Build Coastguard Worker }
113*ab8db090SAndroid Build Coastguard Worker
set_query(size_t id)114*ab8db090SAndroid Build Coastguard Worker void Agent::set_query(size_t id) {
115*ab8db090SAndroid Build Coastguard Worker agent_->set_query(id);
116*ab8db090SAndroid Build Coastguard Worker }
117*ab8db090SAndroid Build Coastguard Worker
key() const118*ab8db090SAndroid Build Coastguard Worker const Key &Agent::key() const {
119*ab8db090SAndroid Build Coastguard Worker return reinterpret_cast<const Key &>(agent_->key());
120*ab8db090SAndroid Build Coastguard Worker }
121*ab8db090SAndroid Build Coastguard Worker
query() const122*ab8db090SAndroid Build Coastguard Worker const Query &Agent::query() const {
123*ab8db090SAndroid Build Coastguard Worker return reinterpret_cast<const Query &>(agent_->query());
124*ab8db090SAndroid Build Coastguard Worker }
125*ab8db090SAndroid Build Coastguard Worker
key_str(const char ** ptr_out,size_t * length_out) const126*ab8db090SAndroid Build Coastguard Worker void Agent::key_str(const char **ptr_out, size_t *length_out) const {
127*ab8db090SAndroid Build Coastguard Worker *ptr_out = agent_->key().ptr();
128*ab8db090SAndroid Build Coastguard Worker *length_out = agent_->key().length();
129*ab8db090SAndroid Build Coastguard Worker }
130*ab8db090SAndroid Build Coastguard Worker
key_id() const131*ab8db090SAndroid Build Coastguard Worker size_t Agent::key_id() const {
132*ab8db090SAndroid Build Coastguard Worker return agent_->key().id();
133*ab8db090SAndroid Build Coastguard Worker }
134*ab8db090SAndroid Build Coastguard Worker
query_str(const char ** ptr_out,size_t * length_out) const135*ab8db090SAndroid Build Coastguard Worker void Agent::query_str(const char **ptr_out, size_t *length_out) const {
136*ab8db090SAndroid Build Coastguard Worker *ptr_out = agent_->query().ptr();
137*ab8db090SAndroid Build Coastguard Worker *length_out = agent_->query().length();
138*ab8db090SAndroid Build Coastguard Worker }
139*ab8db090SAndroid Build Coastguard Worker
query_id() const140*ab8db090SAndroid Build Coastguard Worker size_t Agent::query_id() const {
141*ab8db090SAndroid Build Coastguard Worker return agent_->query().id();
142*ab8db090SAndroid Build Coastguard Worker }
143*ab8db090SAndroid Build Coastguard Worker
Trie()144*ab8db090SAndroid Build Coastguard Worker Trie::Trie() : trie_(new (std::nothrow) marisa::Trie) {
145*ab8db090SAndroid Build Coastguard Worker MARISA_THROW_IF(trie_ == NULL, ::MARISA_MEMORY_ERROR);
146*ab8db090SAndroid Build Coastguard Worker }
147*ab8db090SAndroid Build Coastguard Worker
~Trie()148*ab8db090SAndroid Build Coastguard Worker Trie::~Trie() {
149*ab8db090SAndroid Build Coastguard Worker delete trie_;
150*ab8db090SAndroid Build Coastguard Worker }
151*ab8db090SAndroid Build Coastguard Worker
build(Keyset & keyset,int config_flags)152*ab8db090SAndroid Build Coastguard Worker void Trie::build(Keyset &keyset, int config_flags) {
153*ab8db090SAndroid Build Coastguard Worker trie_->build(*keyset.keyset_, config_flags);
154*ab8db090SAndroid Build Coastguard Worker }
155*ab8db090SAndroid Build Coastguard Worker
mmap(const char * filename)156*ab8db090SAndroid Build Coastguard Worker void Trie::mmap(const char *filename) {
157*ab8db090SAndroid Build Coastguard Worker trie_->mmap(filename);
158*ab8db090SAndroid Build Coastguard Worker }
159*ab8db090SAndroid Build Coastguard Worker
load(const char * filename)160*ab8db090SAndroid Build Coastguard Worker void Trie::load(const char *filename) {
161*ab8db090SAndroid Build Coastguard Worker trie_->load(filename);
162*ab8db090SAndroid Build Coastguard Worker }
163*ab8db090SAndroid Build Coastguard Worker
save(const char * filename) const164*ab8db090SAndroid Build Coastguard Worker void Trie::save(const char *filename) const {
165*ab8db090SAndroid Build Coastguard Worker trie_->save(filename);
166*ab8db090SAndroid Build Coastguard Worker }
167*ab8db090SAndroid Build Coastguard Worker
lookup(Agent & agent) const168*ab8db090SAndroid Build Coastguard Worker bool Trie::lookup(Agent &agent) const {
169*ab8db090SAndroid Build Coastguard Worker return trie_->lookup(*agent.agent_);
170*ab8db090SAndroid Build Coastguard Worker }
171*ab8db090SAndroid Build Coastguard Worker
reverse_lookup(Agent & agent) const172*ab8db090SAndroid Build Coastguard Worker void Trie::reverse_lookup(Agent &agent) const {
173*ab8db090SAndroid Build Coastguard Worker trie_->reverse_lookup(*agent.agent_);
174*ab8db090SAndroid Build Coastguard Worker }
175*ab8db090SAndroid Build Coastguard Worker
common_prefix_search(Agent & agent) const176*ab8db090SAndroid Build Coastguard Worker bool Trie::common_prefix_search(Agent &agent) const {
177*ab8db090SAndroid Build Coastguard Worker return trie_->common_prefix_search(*agent.agent_);
178*ab8db090SAndroid Build Coastguard Worker }
179*ab8db090SAndroid Build Coastguard Worker
predictive_search(Agent & agent) const180*ab8db090SAndroid Build Coastguard Worker bool Trie::predictive_search(Agent &agent) const {
181*ab8db090SAndroid Build Coastguard Worker return trie_->predictive_search(*agent.agent_);
182*ab8db090SAndroid Build Coastguard Worker }
183*ab8db090SAndroid Build Coastguard Worker
lookup(const char * ptr,size_t length) const184*ab8db090SAndroid Build Coastguard Worker size_t Trie::lookup(const char *ptr, size_t length) const {
185*ab8db090SAndroid Build Coastguard Worker marisa::Agent agent;
186*ab8db090SAndroid Build Coastguard Worker agent.set_query(ptr, length);
187*ab8db090SAndroid Build Coastguard Worker if (!trie_->lookup(agent)) {
188*ab8db090SAndroid Build Coastguard Worker return MARISA_INVALID_KEY_ID;
189*ab8db090SAndroid Build Coastguard Worker }
190*ab8db090SAndroid Build Coastguard Worker return agent.key().id();
191*ab8db090SAndroid Build Coastguard Worker }
192*ab8db090SAndroid Build Coastguard Worker
reverse_lookup(size_t id,const char ** ptr_out_to_be_deleted,size_t * length_out) const193*ab8db090SAndroid Build Coastguard Worker void Trie::reverse_lookup(size_t id,
194*ab8db090SAndroid Build Coastguard Worker const char **ptr_out_to_be_deleted, size_t *length_out) const {
195*ab8db090SAndroid Build Coastguard Worker marisa::Agent agent;
196*ab8db090SAndroid Build Coastguard Worker agent.set_query(id);
197*ab8db090SAndroid Build Coastguard Worker trie_->reverse_lookup(agent);
198*ab8db090SAndroid Build Coastguard Worker char * const buf = new (std::nothrow) char[agent.key().length()];
199*ab8db090SAndroid Build Coastguard Worker MARISA_THROW_IF(buf == NULL, MARISA_MEMORY_ERROR);
200*ab8db090SAndroid Build Coastguard Worker std::memcpy(buf, agent.key().ptr(), agent.key().length());
201*ab8db090SAndroid Build Coastguard Worker *ptr_out_to_be_deleted = buf;
202*ab8db090SAndroid Build Coastguard Worker *length_out = agent.key().length();
203*ab8db090SAndroid Build Coastguard Worker }
204*ab8db090SAndroid Build Coastguard Worker
num_tries() const205*ab8db090SAndroid Build Coastguard Worker size_t Trie::num_tries() const {
206*ab8db090SAndroid Build Coastguard Worker return trie_->num_tries();
207*ab8db090SAndroid Build Coastguard Worker }
208*ab8db090SAndroid Build Coastguard Worker
num_keys() const209*ab8db090SAndroid Build Coastguard Worker size_t Trie::num_keys() const {
210*ab8db090SAndroid Build Coastguard Worker return trie_->num_keys();
211*ab8db090SAndroid Build Coastguard Worker }
212*ab8db090SAndroid Build Coastguard Worker
num_nodes() const213*ab8db090SAndroid Build Coastguard Worker size_t Trie::num_nodes() const {
214*ab8db090SAndroid Build Coastguard Worker return trie_->num_nodes();
215*ab8db090SAndroid Build Coastguard Worker }
216*ab8db090SAndroid Build Coastguard Worker
tail_mode() const217*ab8db090SAndroid Build Coastguard Worker TailMode Trie::tail_mode() const {
218*ab8db090SAndroid Build Coastguard Worker if (trie_->tail_mode() == ::MARISA_TEXT_TAIL) {
219*ab8db090SAndroid Build Coastguard Worker return TEXT_TAIL;
220*ab8db090SAndroid Build Coastguard Worker } else {
221*ab8db090SAndroid Build Coastguard Worker return BINARY_TAIL;
222*ab8db090SAndroid Build Coastguard Worker }
223*ab8db090SAndroid Build Coastguard Worker }
224*ab8db090SAndroid Build Coastguard Worker
node_order() const225*ab8db090SAndroid Build Coastguard Worker NodeOrder Trie::node_order() const {
226*ab8db090SAndroid Build Coastguard Worker if (trie_->node_order() == ::MARISA_LABEL_ORDER) {
227*ab8db090SAndroid Build Coastguard Worker return LABEL_ORDER;
228*ab8db090SAndroid Build Coastguard Worker } else {
229*ab8db090SAndroid Build Coastguard Worker return WEIGHT_ORDER;
230*ab8db090SAndroid Build Coastguard Worker }
231*ab8db090SAndroid Build Coastguard Worker }
232*ab8db090SAndroid Build Coastguard Worker
empty() const233*ab8db090SAndroid Build Coastguard Worker bool Trie::empty() const {
234*ab8db090SAndroid Build Coastguard Worker return trie_->empty();
235*ab8db090SAndroid Build Coastguard Worker }
236*ab8db090SAndroid Build Coastguard Worker
size() const237*ab8db090SAndroid Build Coastguard Worker size_t Trie::size() const {
238*ab8db090SAndroid Build Coastguard Worker return trie_->size();
239*ab8db090SAndroid Build Coastguard Worker }
240*ab8db090SAndroid Build Coastguard Worker
total_size() const241*ab8db090SAndroid Build Coastguard Worker size_t Trie::total_size() const {
242*ab8db090SAndroid Build Coastguard Worker return trie_->total_size();
243*ab8db090SAndroid Build Coastguard Worker }
244*ab8db090SAndroid Build Coastguard Worker
io_size() const245*ab8db090SAndroid Build Coastguard Worker size_t Trie::io_size() const {
246*ab8db090SAndroid Build Coastguard Worker return trie_->io_size();
247*ab8db090SAndroid Build Coastguard Worker }
248*ab8db090SAndroid Build Coastguard Worker
clear()249*ab8db090SAndroid Build Coastguard Worker void Trie::clear() {
250*ab8db090SAndroid Build Coastguard Worker trie_->clear();
251*ab8db090SAndroid Build Coastguard Worker }
252*ab8db090SAndroid Build Coastguard Worker
253*ab8db090SAndroid Build Coastguard Worker } // namespace marisa_swig
254