diff options
author | 2012-05-14 19:41:34 -0700 | |
---|---|---|
committer | 2012-05-14 19:41:34 -0700 | |
commit | 0c5b2a01d40af79d66fb9264ad8fd5b51014b797 (patch) | |
tree | d9ee07c81fb3da8eb0b298055c1c35eb2d736d0d /native | |
parent | 529f4374179b8102b469e528cc92bcbfa8565fd8 (diff) | |
parent | 5282f00ff871bc0ae8303a2b6dacb283f73e31ea (diff) | |
download | latinime-0c5b2a01d40af79d66fb9264ad8fd5b51014b797.tar.gz latinime-0c5b2a01d40af79d66fb9264ad8fd5b51014b797.tar.xz latinime-0c5b2a01d40af79d66fb9264ad8fd5b51014b797.zip |
am 5282f00f: Merge "Contacts dictionary rebuilds only when contact names have changed." into jb-dev
* commit '5282f00ff871bc0ae8303a2b6dacb283f73e31ea':
Contacts dictionary rebuilds only when contact names have changed.
Diffstat (limited to 'native')
-rw-r--r-- | native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp | 15 | ||||
-rw-r--r-- | native/jni/src/bigram_dictionary.cpp | 22 | ||||
-rw-r--r-- | native/jni/src/bigram_dictionary.h | 1 | ||||
-rw-r--r-- | native/jni/src/dictionary.cpp | 5 | ||||
-rw-r--r-- | native/jni/src/dictionary.h | 1 |
5 files changed, 43 insertions, 1 deletions
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index de9dbf9fd..b8f4ec77a 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -182,6 +182,20 @@ static jboolean latinime_BinaryDictionary_isValidWord(JNIEnv *env, jobject objec return result; } +static jboolean latinime_BinaryDictionary_isValidBigram(JNIEnv *env, jobject object, jlong dict, + jintArray wordArray1, jintArray wordArray2) { + Dictionary *dictionary = (Dictionary*)dict; + if (!dictionary) return (jboolean) false; + jint *word1 = env->GetIntArrayElements(wordArray1, 0); + jint *word2 = env->GetIntArrayElements(wordArray2, 0); + jsize length1 = word1 ? env->GetArrayLength(wordArray1) : 0; + jsize length2 = word2 ? env->GetArrayLength(wordArray2) : 0; + jboolean result = dictionary->isValidBigram(word1, length1, word2, length2); + env->ReleaseIntArrayElements(wordArray2, word2, JNI_ABORT); + env->ReleaseIntArrayElements(wordArray1, word1, JNI_ABORT); + return result; +} + static jdouble latinime_BinaryDictionary_calcNormalizedScore(JNIEnv *env, jobject object, jcharArray before, jint beforeLength, jcharArray after, jint afterLength, jint score) { jchar *beforeChars = env->GetCharArrayElements(before, 0); @@ -239,6 +253,7 @@ static JNINativeMethod sMethods[] = { {"getSuggestionsNative", "(JJ[I[I[II[IZ[C[I)I", (void*)latinime_BinaryDictionary_getSuggestions}, {"isValidWordNative", "(J[II)Z", (void*)latinime_BinaryDictionary_isValidWord}, + {"isValidBigramNative", "(J[I[I)Z", (void*)latinime_BinaryDictionary_isValidBigram}, {"getBigramsNative", "(J[II[II[C[III)I", (void*)latinime_BinaryDictionary_getBigrams}, {"calcNormalizedScoreNative", "([CI[CII)D", (void*)latinime_BinaryDictionary_calcNormalizedScore}, diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp index 07031086c..7ed4dc439 100644 --- a/native/jni/src/bigram_dictionary.cpp +++ b/native/jni/src/bigram_dictionary.cpp @@ -128,7 +128,7 @@ int BigramDictionary::getBigrams(const int32_t *prevWord, int prevWordLength, in ++bigramCount; } } - } while (0 != (UnigramDictionary::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags)); + } while (UnigramDictionary::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags); return bigramCount; } @@ -189,5 +189,25 @@ bool BigramDictionary::checkFirstCharacter(unsigned short *word) { return false; } +bool BigramDictionary::isValidBigram(const int32_t *word1, int length1, const int32_t *word2, + int length2) { + const uint8_t* const root = DICT; + int pos = getBigramListPositionForWord(word1, length1); + // getBigramListPositionForWord returns 0 if this word isn't in the dictionary or has no bigrams + if (0 == pos) return false; + int nextWordPos = BinaryFormat::getTerminalPosition(root, word2, length2); + if (NOT_VALID_WORD == nextWordPos) return false; + int bigramFlags; + do { + bigramFlags = BinaryFormat::getFlagsAndForwardPointer(root, &pos); + const int bigramPos = BinaryFormat::getAttributeAddressAndForwardPointer(root, bigramFlags, + &pos); + if (bigramPos == nextWordPos) { + return true; + } + } while (UnigramDictionary::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags); + return false; +} + // TODO: Move functions related to bigram to here } // namespace latinime diff --git a/native/jni/src/bigram_dictionary.h b/native/jni/src/bigram_dictionary.h index 7328d5828..b8763a515 100644 --- a/native/jni/src/bigram_dictionary.h +++ b/native/jni/src/bigram_dictionary.h @@ -33,6 +33,7 @@ class BigramDictionary { int getBigramListPositionForWord(const int32_t *prevWord, const int prevWordLength); void fillBigramAddressToFrequencyMapAndFilter(const int32_t *prevWord, const int prevWordLength, std::map<int, int> *map, uint8_t *filter); + bool isValidBigram(const int32_t *word1, int length1, const int32_t *word2, int length2); ~BigramDictionary(); private: bool addWordBigram(unsigned short *word, int length, int frequency); diff --git a/native/jni/src/dictionary.cpp b/native/jni/src/dictionary.cpp index 9dc207223..8ea7c49fa 100644 --- a/native/jni/src/dictionary.cpp +++ b/native/jni/src/dictionary.cpp @@ -58,4 +58,9 @@ bool Dictionary::isValidWord(const int32_t *word, int length) { return mUnigramDictionary->isValidWord(word, length); } +bool Dictionary::isValidBigram(const int32_t *word1, int length1, const int32_t *word2, + int length2) { + return mBigramDictionary->isValidBigram(word1, length1, word2, length2); +} + } // namespace latinime diff --git a/native/jni/src/dictionary.h b/native/jni/src/dictionary.h index bce86d1ad..87891ee4d 100644 --- a/native/jni/src/dictionary.h +++ b/native/jni/src/dictionary.h @@ -53,6 +53,7 @@ class Dictionary { } bool isValidWord(const int32_t *word, int length); + bool isValidBigram(const int32_t *word1, int length1, const int32_t *word2, int length2); void *getDict() { return (void *)mDict; } int getDictSize() { return mDictSize; } int getMmapFd() { return mMmapFd; } |