From 9c98fc93d86ab6205cb15fec14a3bc190e448ee7 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Wed, 30 Nov 2011 17:02:43 +0800 Subject: begin to write search method --- src/storage/chewing_large_table.cpp | 86 +++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/storage/chewing_large_table.cpp b/src/storage/chewing_large_table.cpp index db803ec..1dfeb3b 100644 --- a/src/storage/chewing_large_table.cpp +++ b/src/storage/chewing_large_table.cpp @@ -89,3 +89,89 @@ public: using namespace pinyin; /* class implementation */ + +ChewingBitmapIndexLevel::ChewingBitmapIndexLevel(pinyin_option_t options) + : m_options(options) { + memset(m_chewing_length_indexes, 0, sizeof(m_chewing_length_indexes)); +} + +void ChewingBitmapIndexLevel::reset() { + for (int k = CHEWING_ZERO_INITIAL; k < CHEWING_NUMBER_OF_INITIALS; ++k) + for (int l = CHEWING_ZERO_MIDDLE; l < CHEWING_NUMBER_OF_MIDDLES; ++l) + for (int m = CHEWING_ZERO_FINAL; m < CHEWING_NUMBER_OF_FINALS; ++m) + for (int n = CHEWING_ZERO_TONE; n < CHEWING_NUMBER_OF_TONES; + ++n) { + ChewingLengthIndexLevel * length_array = + m_chewing_length_indexes[k][l][m][n]; + if (length_array) + delete length_array; + } +} + + +/* search methods */ + +int ChewingBitmapIndexLevel::search(int phrase_length, + /* in */ ChewingKey keys[], + /* out */ PhraseIndexRanges ranges) const { + assert(phrase_length > 0); + return initial_level_search(phrase_length, keys, ranges); +} + +int ChewingBitmapIndexLevel::initial_level_search (int phrase_length, + /* in */ ChewingKey keys[], /* out */ PhraseIndexRanges ranges) const { + +/* macros */ +#define MATCH(AMBIGUITY, ORIGIN, ANOTHER) case ORIGIN: \ + { \ + result |= middle_and_final_level_search(ORIGIN, phrase_length, \ + keys, ranges); \ + if (m_options & AMBIGUITY) { \ + result |= middle_and_final_level_search(ANOTHER, \ + phrase_length, \ + keys, ranges); \ + } \ + return result; \ + } + + /* deal with ambiguities */ + int result = SEARCH_NONE; + const ChewingKey & first_key = keys[0]; + + switch(first_key.m_initial) { + MATCH(PINYIN_AMB_C_CH, CHEWING_C, CHEWING_CH); + MATCH(PINYIN_AMB_C_CH, CHEWING_CH, CHEWING_C); + MATCH(PINYIN_AMB_Z_ZH, CHEWING_Z, CHEWING_ZH); + MATCH(PINYIN_AMB_Z_ZH, CHEWING_ZH, CHEWING_Z); + MATCH(PINYIN_AMB_S_SH, CHEWING_S, CHEWING_SH); + MATCH(PINYIN_AMB_S_SH, CHEWING_SH, CHEWING_S); + MATCH(PINYIN_AMB_L_R, CHEWING_R, CHEWING_L); + MATCH(PINYIN_AMB_L_N, CHEWING_N, CHEWING_L); + MATCH(PINYIN_AMB_F_H, CHEWING_F, CHEWING_H); + MATCH(PINYIN_AMB_F_H, CHEWING_H, CHEWING_F); + MATCH(PINYIN_AMB_G_K, CHEWING_G, CHEWING_K); + MATCH(PINYIN_AMB_G_K, CHEWING_K, CHEWING_G); + + case CHEWING_L: + { + result |= middle_and_final_level_search + (CHEWING_L, phrase_length, keys, ranges); + + if (m_options & PINYIN_AMB_L_N) + result |= middle_and_final_level_search + (CHEWING_N, phrase_length, keys,ranges); + + if (m_options & PINYIN_AMB_L_R) + result |= middle_and_final_level_search + (CHEWING_R, phrase_length, keys, ranges); + return result; + } + default: + { + return middle_and_final_level_search + ((ChewingInitial) first_key.m_initial, + phrase_length, keys, ranges); + } + } +#undef MATCH +} -- cgit