am 38f341a2: Add a jni method to iterate words in a dictionary.
* commit '38f341a2a53a04ce4195a0cb99fcb6e71203dec0': Add a jni method to iterate words in a dictionary.main
commit
9798bc12e3
|
@ -22,6 +22,7 @@ import android.util.SparseArray;
|
||||||
import com.android.inputmethod.annotations.UsedForTesting;
|
import com.android.inputmethod.annotations.UsedForTesting;
|
||||||
import com.android.inputmethod.keyboard.ProximityInfo;
|
import com.android.inputmethod.keyboard.ProximityInfo;
|
||||||
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
|
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
|
||||||
|
import com.android.inputmethod.latin.makedict.Word;
|
||||||
import com.android.inputmethod.latin.settings.NativeSuggestOptions;
|
import com.android.inputmethod.latin.settings.NativeSuggestOptions;
|
||||||
import com.android.inputmethod.latin.utils.CollectionUtils;
|
import com.android.inputmethod.latin.utils.CollectionUtils;
|
||||||
import com.android.inputmethod.latin.utils.JniUtils;
|
import com.android.inputmethod.latin.utils.JniUtils;
|
||||||
|
@ -148,6 +149,7 @@ public final class BinaryDictionary extends Dictionary {
|
||||||
int[] outCodePoints, boolean[] outFlags, int[] outProbabilityInfo,
|
int[] outCodePoints, boolean[] outFlags, int[] outProbabilityInfo,
|
||||||
ArrayList<int[]> outBigramTargets, ArrayList<int[]> outBigramProbabilityInfo,
|
ArrayList<int[]> outBigramTargets, ArrayList<int[]> outBigramProbabilityInfo,
|
||||||
ArrayList<int[]> outShortcutTargets, ArrayList<Integer> outShortcutProbabilities);
|
ArrayList<int[]> outShortcutTargets, ArrayList<Integer> outShortcutProbabilities);
|
||||||
|
private static native int getNextWordNative(long dict, int token, int[] outCodePoints);
|
||||||
private static native int getSuggestionsNative(long dict, long proximityInfo,
|
private static native int getSuggestionsNative(long dict, long proximityInfo,
|
||||||
long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
|
long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
|
||||||
int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
|
int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
|
||||||
|
@ -332,6 +334,33 @@ public final class BinaryDictionary extends Dictionary {
|
||||||
outShortcutProbabilities);
|
outShortcutProbabilities);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class GetNextWordPropertyResult {
|
||||||
|
public WordProperty mWordProperty;
|
||||||
|
public int mNextToken;
|
||||||
|
|
||||||
|
public GetNextWordPropertyResult(final WordProperty wordPreperty, final int nextToken) {
|
||||||
|
mWordProperty = wordPreperty;
|
||||||
|
mNextToken = nextToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to iterate all words in the dictionary for makedict.
|
||||||
|
* If token is 0, this method newly starts iterating the dictionary.
|
||||||
|
*/
|
||||||
|
@UsedForTesting
|
||||||
|
public GetNextWordPropertyResult getNextWordProperty(final int token) {
|
||||||
|
final int[] codePoints = new int[MAX_WORD_LENGTH];
|
||||||
|
final int nextToken = getNextWordNative(mNativeDict, token, codePoints);
|
||||||
|
int len = 0;
|
||||||
|
// codePoints is null-terminated if its length is shorter than the array length.
|
||||||
|
while (len < MAX_WORD_LENGTH && codePoints[len] != 0) {
|
||||||
|
++len;
|
||||||
|
}
|
||||||
|
final String word = new String(mOutputCodePoints, 0, len);
|
||||||
|
return new GetNextWordPropertyResult(getWordProperty(word), nextToken);
|
||||||
|
}
|
||||||
|
|
||||||
// Add a unigram entry to binary dictionary with unigram attributes in native code.
|
// Add a unigram entry to binary dictionary with unigram attributes in native code.
|
||||||
public void addUnigramWord(final String word, final int probability,
|
public void addUnigramWord(final String word, final int probability,
|
||||||
final String shortcutTarget, final int shortcutProbability, final boolean isNotAWord,
|
final String shortcutTarget, final int shortcutProbability, final boolean isNotAWord,
|
||||||
|
@ -380,7 +409,6 @@ public final class BinaryDictionary extends Dictionary {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reopen() {
|
private void reopen() {
|
||||||
|
|
|
@ -260,6 +260,26 @@ static jint latinime_BinaryDictionary_getBigramProbability(JNIEnv *env, jclass c
|
||||||
word1Length);
|
word1Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Method to iterate all words in the dictionary for makedict.
|
||||||
|
// If token is 0, this method newly starts iterating the dictionary. This method returns 0 when
|
||||||
|
// the dictionary does not have a next word.
|
||||||
|
static jint latinime_BinaryDictionary_getNextWord(JNIEnv *env, jclass clazz,
|
||||||
|
jlong dict, jint token, jintArray outCodePoints) {
|
||||||
|
Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
|
||||||
|
if (!dictionary) return 0;
|
||||||
|
const jsize outCodePointsLength = env->GetArrayLength(outCodePoints);
|
||||||
|
if (outCodePointsLength != MAX_WORD_LENGTH) {
|
||||||
|
AKLOGE("Invalid outCodePointsLength: %d", outCodePointsLength);
|
||||||
|
ASSERT(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int wordCodePoints[outCodePointsLength];
|
||||||
|
memset(wordCodePoints, 0, sizeof(wordCodePoints));
|
||||||
|
const int nextToken = dictionary->getNextWordAndNextToken(token, wordCodePoints);
|
||||||
|
env->SetIntArrayRegion(outCodePoints, 0, outCodePointsLength, wordCodePoints);
|
||||||
|
return nextToken;
|
||||||
|
}
|
||||||
|
|
||||||
static void latinime_BinaryDictionary_getWordProperty(JNIEnv *env, jclass clazz,
|
static void latinime_BinaryDictionary_getWordProperty(JNIEnv *env, jclass clazz,
|
||||||
jlong dict, jintArray word, jintArray outCodePoints, jbooleanArray outFlags,
|
jlong dict, jintArray word, jintArray outCodePoints, jbooleanArray outFlags,
|
||||||
jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilityInfo,
|
jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilityInfo,
|
||||||
|
@ -526,6 +546,11 @@ static const JNINativeMethod sMethods[] = {
|
||||||
"Ljava/util/ArrayList;Ljava/util/ArrayList;)V"),
|
"Ljava/util/ArrayList;Ljava/util/ArrayList;)V"),
|
||||||
reinterpret_cast<void *>(latinime_BinaryDictionary_getWordProperty)
|
reinterpret_cast<void *>(latinime_BinaryDictionary_getWordProperty)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
const_cast<char *>("getNextWordNative"),
|
||||||
|
const_cast<char *>("(JI[I)I"),
|
||||||
|
reinterpret_cast<void *>(latinime_BinaryDictionary_getNextWord)
|
||||||
|
},
|
||||||
{
|
{
|
||||||
const_cast<char *>("calcNormalizedScoreNative"),
|
const_cast<char *>("calcNormalizedScoreNative"),
|
||||||
const_cast<char *>("([I[II)F"),
|
const_cast<char *>("([I[II)F"),
|
||||||
|
|
|
@ -150,6 +150,12 @@ const WordProperty Dictionary::getWordProperty(const int *const codePoints,
|
||||||
codePoints, codePointCount);
|
codePoints, codePointCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Dictionary::getNextWordAndNextToken(const int token, int *const outCodePoints) {
|
||||||
|
TimeKeeper::setCurrentTime();
|
||||||
|
return mDictionaryStructureWithBufferPolicy.get()->getNextWordAndNextToken(
|
||||||
|
token, outCodePoints);
|
||||||
|
}
|
||||||
|
|
||||||
void Dictionary::logDictionaryInfo(JNIEnv *const env) const {
|
void Dictionary::logDictionaryInfo(JNIEnv *const env) const {
|
||||||
int dictionaryIdCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
|
int dictionaryIdCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
|
||||||
int versionStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
|
int versionStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
|
||||||
|
|
|
@ -96,6 +96,11 @@ class Dictionary {
|
||||||
|
|
||||||
const WordProperty getWordProperty(const int *const codePoints, const int codePointCount);
|
const WordProperty getWordProperty(const int *const codePoints, const int codePointCount);
|
||||||
|
|
||||||
|
// Method to iterate all words in the dictionary.
|
||||||
|
// The returned token has to be used to get the next word. If token is 0, this method newly
|
||||||
|
// starts iterating the dictionary.
|
||||||
|
int getNextWordAndNextToken(const int token, int *const outCodePoints);
|
||||||
|
|
||||||
const DictionaryStructureWithBufferPolicy *getDictionaryStructurePolicy() const {
|
const DictionaryStructureWithBufferPolicy *getDictionaryStructurePolicy() const {
|
||||||
return mDictionaryStructureWithBufferPolicy.get();
|
return mDictionaryStructureWithBufferPolicy.get();
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,11 @@ class DictionaryStructureWithBufferPolicy {
|
||||||
virtual const WordProperty getWordProperty(const int *const codePonts,
|
virtual const WordProperty getWordProperty(const int *const codePonts,
|
||||||
const int codePointCount) const = 0;
|
const int codePointCount) const = 0;
|
||||||
|
|
||||||
|
// Method to iterate all words in the dictionary.
|
||||||
|
// The returned token has to be used to get the next word. If token is 0, this method newly
|
||||||
|
// starts iterating the dictionary.
|
||||||
|
virtual int getNextWordAndNextToken(const int token, int *const outCodePoints) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DictionaryStructureWithBufferPolicy() {}
|
DictionaryStructureWithBufferPolicy() {}
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,11 @@ class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
||||||
return WordProperty();
|
return WordProperty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getNextWordAndNextToken(const int token, int *const outCodePoints) {
|
||||||
|
// getNextWordAndNextToken is not supported.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(PatriciaTriePolicy);
|
DISALLOW_IMPLICIT_CONSTRUCTORS(PatriciaTriePolicy);
|
||||||
|
|
||||||
|
|
|
@ -392,4 +392,10 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(const int *const code
|
||||||
historicalInfo->getCount(), &bigrams, &shortcuts);
|
historicalInfo->getCount(), &bigrams, &shortcuts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token,
|
||||||
|
int *const outCodePoints) {
|
||||||
|
// TODO: Implement.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace latinime
|
} // namespace latinime
|
||||||
|
|
|
@ -109,6 +109,8 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
||||||
const WordProperty getWordProperty(const int *const codePoints,
|
const WordProperty getWordProperty(const int *const codePoints,
|
||||||
const int codePointCount) const;
|
const int codePointCount) const;
|
||||||
|
|
||||||
|
int getNextWordAndNextToken(const int token, int *const outCodePoints);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4PatriciaTriePolicy);
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4PatriciaTriePolicy);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue