begin to write search method
[platform/upstream/libpinyin.git] / src / storage / phrase_large_table2.cpp
1 /* 
2  *  libpinyin
3  *  Library to deal with pinyin.
4  *  
5  *  Copyright (C) 2012 Peng Wu <alexepico@gmail.com>
6  *  
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  * 
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *  
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  */
21
22 #include <assert.h>
23 #include <string.h>
24 #include "phrase_large_table2.h"
25
26
27 /* class definition */
28
29 namespace pinyin{
30
31 class PhraseLengthIndexLevel2{
32 protected:
33     GArray * m_phrase_array_indexes;
34 public:
35     PhraseLengthIndexLevel2();
36     ~PhraseLengthIndexLevel2();
37
38     /* load/store method */
39     bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end);
40     bool store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end);
41
42     /* search method */
43     int search(int phrase_length, /* in */ ucs4_t phrase[],
44                /* out */ PhraseTokens tokens) const;
45
46     /* add_index/remove_index method */
47     int add_index(int phrase_length, /* in */ ucs4_t phrase[],
48                   /* in */ phrase_token_t token);
49     int remove_index(int phrase_length, /* in */ ucs4_t phrase[],
50                      /* in */ phrase_token_t token);
51 };
52
53
54 template<size_t phrase_length>
55 struct PhraseIndexItem2{
56     phrase_token_t m_token;
57     ucs4_t m_phrase[phrase_length];
58 public:
59     PhraseIndexItem2<phrase_length>(ucs4_t phrase[], phrase_token_t token){
60         memmove(m_phrase, phrase, sizeof(ucs4_t) * phrase_length);
61         m_token = token;
62     }
63 };
64
65
66 template<size_t phrase_length>
67 class PhraseArrayIndexLevel2{
68 protected:
69     typedef PhraseIndexItem2<phrase_length> IndexItem;
70
71 protected:
72     MemoryChunk m_chunk;
73 public:
74     bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end);
75     bool store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end);
76
77     /* search method */
78     int search(/* in */ ucs4_t phrase[], /* out */ PhraseTokens tokens) const;
79
80     /* add_index/remove_index method */
81     int add_index(/* in */ ucs4_t phrase[], /* in */ phrase_token_t token);
82     int remove_index(/* in */ ucs4_t phrase[], /* in */ phrase_token_t token);
83 };
84
85 };
86
87 using namespace pinyin;
88
89 /* class implementation */
90
91 template<size_t phrase_length>
92 static int phrase_compare(const PhraseIndexItem2<phrase_length> &lhs,
93                           const PhraseIndexItem2<phrase_length> &rhs){
94     ucs4_t * phrase_lhs = (ucs4_t *) lhs.m_phrase;
95     ucs4_t * phrase_rhs = (ucs4_t *) rhs.m_phrase;
96
97     return memcmp(phrase_lhs, phrase_rhs, sizeof(ucs4_t) * phrase_length);
98 }
99
100 template<size_t phrase_length>
101 static bool phrase_less_than(const PhraseIndexItem2<phrase_length> & lhs,
102                              const PhraseIndexItem2<phrase_length> & rhs){
103     return 0 > phrase_compare(lhs, rhs);
104 }
105
106 PhraseBitmapIndexLevel2::PhraseBitmapIndexLevel2(){
107     memset(m_phrase_length_indexes, 0, sizeof(m_phrase_length_indexes));
108 }
109
110 void PhraseBitmapIndexLevel2::reset(){
111     for ( size_t i = 0; i < PHRASE_NUMBER_OF_BITMAP_INDEX; i++){
112         PhraseLengthIndexLevel2 * length_array =
113             m_phrase_length_indexes[i];
114         if ( length_array )
115             delete length_array;
116     }
117 }
118
119 int PhraseBitmapIndexLevel2::search(int phrase_length,
120                                     /* in */ ucs4_t phrase[],
121                                     /* out */ PhraseTokens tokens) const {
122     assert(phrase_length > 0);
123
124     int result = SEARCH_NONE;
125     /* use the first 8-bit of the lower 16-bit for bitmap index,
126      * as most the higher 16-bit are zero.
127      */
128     guint8 first_key = (phrase[0] & 0xFF00) >> 8;
129
130     PhraseLengthIndexLevel2 * phrase_array = m_phrase_length_indexes[first_key];
131     if ( phrase_array )
132         return phrase_array->search(phrase_length, phrase, tokens);
133     return result;
134 }