diff options
author | Peng Wu <alexepico@gmail.com> | 2010-08-31 15:37:10 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2010-08-31 15:37:10 +0800 |
commit | 846e8ee8f62be6018a1d10d4d303f41d89e8787e (patch) | |
tree | f70bca49bbf77ed701cb24ba0262a5759f5d5c2b /src/storage/phrase_large_table.cpp | |
parent | b0ea21fda50b43d964f8ddc84f62ff3bb61043c8 (diff) | |
download | libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.tar.gz libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.tar.xz libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.zip |
fini add/remove index
Diffstat (limited to 'src/storage/phrase_large_table.cpp')
-rw-r--r-- | src/storage/phrase_large_table.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table.cpp b/src/storage/phrase_large_table.cpp index 0da55e8..a036263 100644 --- a/src/storage/phrase_large_table.cpp +++ b/src/storage/phrase_large_table.cpp @@ -265,3 +265,49 @@ int PhraseLengthIndexLevel::remove_index( int phrase_length, /* in */ utf16_t ph } #undef CASE } + +template<size_t phrase_length> +int PhraseArrayIndexLevel<phrase_length>::add_index(/* in */ utf16_t phrase[], /* in */ phrase_token_t token){ + PhraseIndexItem<phrase_length> * buf_begin, * buf_end; + + PhraseIndexItem<phrase_length> new_elem(phrase, token); + buf_begin = (PhraseIndexItem<phrase_length> *) m_chunk.begin(); + buf_end = (PhraseIndexItem<phrase_length> *) m_chunk.end(); + + std_lite::pair<PhraseIndexItem<phrase_length> *, PhraseIndexItem<phrase_length> *> range; + range = std_lite::equal_range(buf_begin, buf_end, new_elem, phrase_less_than<phrase_length>); + + assert(range.second - range.first <= 1); + if ( range.second - range.first == 1 ) + return INSERT_ITEM_EXISTS; + + PhraseIndexItem<phrase_length> * cur_elem = range.first; + int offset = (cur_elem - buf_begin) * + sizeof(PhraseIndexItem<phrase_length>); + m_chunk.insert_content(offset, &new_elem, + sizeof(PhraseIndexItem<phrase_length> )); + return INSERT_OK; +} + +template<size_t phrase_length> +int PhraseArrayIndexLevel<phrase_length>::remove_index(/* in */ utf16_t phrase[], /* out */ phrase_token_t & token){ + PhraseIndexItem<phrase_length> * buf_begin, * buf_end; + + PhraseIndexItem<phrase_length> remove_elem(phrase, -1); + buf_begin = (PhraseIndexItem<phrase_length> *) m_chunk.begin(); + buf_end = (PhraseIndexItem<phrase_length> *) m_chunk.end(); + + std_lite::pair<PhraseIndexItem<phrase_length> *, PhraseIndexItem<phrase_length> *> range; + range = std_lite::equal_range(buf_begin, buf_end, remove_elem, phrase_less_than<phrase_length>); + + assert(range.second - range.first <= 1); + PhraseIndexItem<phrase_length> * cur_elem = range.first; + if ( range.first == range.second || cur_elem == buf_end) + return REMOVE_ITEM_DONOT_EXISTS; + + token = cur_elem->m_token; + int offset = (cur_elem - buf_begin) * + sizeof(PhraseIndexItem<phrase_length>); + m_chunk.remove_content(offset, sizeof (PhraseIndexItem<phrase_length>)); + return REMOVE_OK; +} |