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 | |
parent | b0ea21fda50b43d964f8ddc84f62ff3bb61043c8 (diff) | |
download | libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.tar.gz libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.tar.xz libpinyin-846e8ee8f62be6018a1d10d4d303f41d89e8787e.zip |
fini add/remove index
Diffstat (limited to 'src')
-rw-r--r-- | src/storage/phrase_large_table.cpp | 46 | ||||
-rw-r--r-- | src/storage/pinyin_large_table.cpp | 4 |
2 files changed, 48 insertions, 2 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; +} diff --git a/src/storage/pinyin_large_table.cpp b/src/storage/pinyin_large_table.cpp index 7d0ac4a..f05317c 100644 --- a/src/storage/pinyin_large_table.cpp +++ b/src/storage/pinyin_large_table.cpp @@ -455,12 +455,12 @@ int PinyinArrayIndexLevel<phrase_length>::remove_index(/* in */ PinyinKey keys[] PhraseExactLessThan<phrase_length> m_lessthan; PinyinIndexItem<phrase_length> * buf_begin, * buf_end; - PinyinIndexItem<phrase_length> new_elem(keys, token); + PinyinIndexItem<phrase_length> remove_elem(keys, token); buf_begin = (PinyinIndexItem<phrase_length> *) m_chunk.begin(); buf_end = (PinyinIndexItem<phrase_length> *) m_chunk.end(); std_lite::pair<PinyinIndexItem<phrase_length> *, PinyinIndexItem<phrase_length> *> range; - range = std_lite::equal_range(buf_begin, buf_end, new_elem, m_lessthan); + range = std_lite::equal_range(buf_begin, buf_end, remove_elem, m_lessthan); PinyinIndexItem<phrase_length> * cur_elem; for ( cur_elem = range.first; |