1 /*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef LATINIME_DICTIONARY_H
18 #define LATINIME_DICTIONARY_H
19
20 #include <map>
21
22 #include "bigram_dictionary.h"
23 #include "char_utils.h"
24 #include "correction.h"
25 #include "defines.h"
26 #include "proximity_info.h"
27 #include "unigram_dictionary.h"
28 #include "words_priority_queue_pool.h"
29
30 namespace latinime {
31
32 class Dictionary {
33 public:
34 Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust, int typedLetterMultipler,
35 int fullWordMultiplier, int maxWordLength, int maxWords);
36
getSuggestions(ProximityInfo * proximityInfo,int * xcoordinates,int * ycoordinates,int * codes,int codesSize,const int32_t * prevWordChars,const int prevWordLength,bool useFullEditDistance,unsigned short * outWords,int * frequencies)37 int getSuggestions(ProximityInfo *proximityInfo, int *xcoordinates, int *ycoordinates,
38 int *codes, int codesSize, const int32_t* prevWordChars, const int prevWordLength,
39 bool useFullEditDistance, unsigned short *outWords, int *frequencies) {
40 std::map<int, int> bigramMap;
41 uint8_t bigramFilter[BIGRAM_FILTER_BYTE_SIZE];
42 mBigramDictionary->fillBigramAddressToFrequencyMapAndFilter(prevWordChars,
43 prevWordLength, &bigramMap, bigramFilter);
44 return mUnigramDictionary->getSuggestions(proximityInfo, mWordsPriorityQueuePool,
45 mCorrection, xcoordinates, ycoordinates, codes, codesSize, &bigramMap,
46 bigramFilter, useFullEditDistance, outWords, frequencies);
47 }
48
getBigrams(const int32_t * word,int length,int * codes,int codesSize,unsigned short * outWords,int * frequencies,int maxWordLength,int maxBigrams)49 int getBigrams(const int32_t *word, int length, int *codes, int codesSize,
50 unsigned short *outWords, int *frequencies, int maxWordLength, int maxBigrams) {
51 return mBigramDictionary->getBigrams(word, length, codes, codesSize, outWords, frequencies,
52 maxWordLength, maxBigrams);
53 }
54
55 int getFrequency(const int32_t *word, int length);
56 bool isValidBigram(const int32_t *word1, int length1, const int32_t *word2, int length2);
getDict()57 void *getDict() { return (void *)mDict; }
getDictSize()58 int getDictSize() { return mDictSize; }
getMmapFd()59 int getMmapFd() { return mMmapFd; }
getDictBufAdjust()60 int getDictBufAdjust() { return mDictBufAdjust; }
61 ~Dictionary();
62
63 // public static utility methods
64 // static inline methods should be defined in the header file
65 static int wideStrLen(unsigned short *str);
66
67 private:
68 const unsigned char *mDict;
69
70 // Used only for the mmap version of dictionary loading, but we use these as dummy variables
71 // also for the malloc version.
72 const int mDictSize;
73 const int mMmapFd;
74 const int mDictBufAdjust;
75
76 UnigramDictionary *mUnigramDictionary;
77 BigramDictionary *mBigramDictionary;
78 WordsPriorityQueuePool *mWordsPriorityQueuePool;
79 Correction *mCorrection;
80 };
81
82 // public static utility methods
83 // static inline methods should be defined in the header file
wideStrLen(unsigned short * str)84 inline int Dictionary::wideStrLen(unsigned short *str) {
85 if (!str) return 0;
86 unsigned short *end = str;
87 while (*end)
88 end++;
89 return end - str;
90 }
91 } // namespace latinime
92
93 #endif // LATINIME_DICTIONARY_H
94