diff options
author | Peng Wu <alexepico@gmail.com> | 2012-08-27 14:31:14 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2012-08-27 14:40:39 +0800 |
commit | bf2b12a7d866efcc45659a65727ac191293dcb48 (patch) | |
tree | a077bbeb43a6d9c6f159955bbcc82f2ad50956af | |
parent | 55424dc21ff006e91533d855dd4ad98c5bdc727a (diff) | |
download | libpinyin-bf2b12a7d866efcc45659a65727ac191293dcb48.tar.gz libpinyin-bf2b12a7d866efcc45659a65727ac191293dcb48.tar.xz libpinyin-bf2b12a7d866efcc45659a65727ac191293dcb48.zip |
write search method in progress
-rw-r--r-- | src/storage/phrase_large_table2.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table2.cpp b/src/storage/phrase_large_table2.cpp index 8974d26..79351fe 100644 --- a/src/storage/phrase_large_table2.cpp +++ b/src/storage/phrase_large_table2.cpp @@ -132,3 +132,87 @@ int PhraseBitmapIndexLevel2::search(int phrase_length, return phrase_array->search(phrase_length, phrase, tokens); return result; } + +PhraseLengthIndexLevel2::PhraseLengthIndexLevel2(){ + m_phrase_array_indexes = g_array_new(FALSE, TRUE, sizeof(void *)); +} + +PhraseLengthIndexLevel2::~PhraseLengthIndexLevel2(){ +#define CASE(len) case len: \ + { \ + PhraseArrayIndexLevel2<len> * & array = g_array_index \ + (m_phrase_array_indexes, PhraseArrayIndexLevel2<len> *, len - 1); \ + if ( array ) { \ + delete array; \ + array = NULL; \ + } \ + break; \ + } + + for (size_t i = 1; i <= m_phrase_array_indexes->len; ++i){ + switch (i){ + CASE(1); + CASE(2); + CASE(3); + CASE(4); + CASE(5); + CASE(6); + CASE(7); + CASE(8); + CASE(9); + CASE(10); + CASE(11); + CASE(12); + CASE(13); + CASE(14); + CASE(15); + CASE(16); + default: + assert(false); + } + } + g_array_free(m_phrase_array_indexes, TRUE); +#undef CASE +} + +int PhraseLengthIndexLevel2::search(int phrase_length, + /* in */ ucs4_t phrase[], + /* out */ PhraseTokens tokens) const { + int result = SEARCH_NONE; + if(m_phrase_array_indexes->len < phrase_length) + return result; + if (m_phrase_array_indexes->len > phrase_length) + result |= SEARCH_CONTINUED; + +#define CASE(len) case len: \ + { \ + PhraseArrayIndexLevel2<len> * array = g_array_index \ + (m_phrase_array_indexes, PhraseArrayIndexLevel2<len> *, len - 1); \ + if ( !array ) \ + return result; \ + result |= array->search(phrase, tokens); \ + return result; \ + } + + switch ( phrase_length ){ + CASE(1); + CASE(2); + CASE(3); + CASE(4); + CASE(5); + CASE(6); + CASE(7); + CASE(8); + CASE(9); + CASE(10); + CASE(11); + CASE(12); + CASE(13); + CASE(14); + CASE(15); + CASE(16); + default: + assert(false); + } +#undef CASE +} |