summaryrefslogtreecommitdiffstats
path: root/src/storage/phrase_large_table3.cpp
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-01-25 14:08:00 +0800
committerPeng Wu <alexepico@gmail.com>2016-01-25 14:09:13 +0800
commitcbc65ce11de0b735aeba598357a5b25ad026de6e (patch)
treec1c5b66c5b2f02567026a95948945d60126b2ccf /src/storage/phrase_large_table3.cpp
parentaaf6de3afa7f1289c1d5a6adb115bfe5ad232c93 (diff)
downloadlibpinyin-cbc65ce11de0b735aeba598357a5b25ad026de6e.tar.gz
libpinyin-cbc65ce11de0b735aeba598357a5b25ad026de6e.tar.xz
libpinyin-cbc65ce11de0b735aeba598357a5b25ad026de6e.zip
write PhraseTableEntry::search method
Diffstat (limited to 'src/storage/phrase_large_table3.cpp')
-rw-r--r--src/storage/phrase_large_table3.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3.cpp b/src/storage/phrase_large_table3.cpp
index 1ab5c0a..2e1c188 100644
--- a/src/storage/phrase_large_table3.cpp
+++ b/src/storage/phrase_large_table3.cpp
@@ -24,6 +24,49 @@
namespace pinyin{
+table_entry_header_t PhraseTableEntry::get_header() const {
+ table_entry_header_t * head = (table_entry_header_t *) m_chunk.begin();
+ return *head;
+}
+
+void PhraseTableEntry::set_header(table_entry_header_t header) {
+ table_entry_header_t * head = (table_entry_header_t *) m_chunk.begin();
+ *head = header;
+}
+
+int PhraseTableEntry::search(/* out */ PhraseTokens tokens) const {
+ int result = SEARCH_NONE;
+
+ const char * content = (char *) m_chunk.begin() +
+ sizeof(table_entry_header_t);
+ const phrase_token_t * begin = (phrase_token_t *) content;
+ const phrase_token_t * end = (phrase_token_t *) m_chunk.end();
+
+ const phrase_token_t * iter = NULL;
+ GArray * array = NULL;
+
+ for (iter = begin; iter != end; ++iter) {
+ phrase_token_t token = *iter;
+
+ /* filter out disabled sub phrase indices. */
+ array = tokens[PHRASE_INDEX_LIBRARY_INDEX(token)];
+ if (NULL == array)
+ continue;
+
+ result |= SEARCH_OK;
+
+ g_array_append_val(array, token);
+ }
+
+ /* check SEARCH_CONTINUED flag in header */
+ table_entry_header_t header = get_header();
+ if (header & SEARCH_CONTINUED)
+ result |= SEARCH_CONTINUED;
+
+ return result;
+}
+
+
/* load text method */
bool PhraseLargeTable3::load_text(FILE * infile){