dictionary.cpp revision 537f6eea8a8d56fe532913a37f4dbff4b3d490af
1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/*
20bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * Copyright (C) 2009, The Android Open Source Project
30bbb917d12358e0264796e75dea888f244761b64Ken Wakasa *
40bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * Licensed under the Apache License, Version 2.0 (the "License");
50bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * you may not use this file except in compliance with the License.
60bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * You may obtain a copy of the License at
70bbb917d12358e0264796e75dea888f244761b64Ken Wakasa *
80bbb917d12358e0264796e75dea888f244761b64Ken Wakasa *     http://www.apache.org/licenses/LICENSE-2.0
90bbb917d12358e0264796e75dea888f244761b64Ken Wakasa *
100bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * Unless required by applicable law or agreed to in writing, software
110bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * distributed under the License is distributed on an "AS IS" BASIS,
120bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * See the License for the specific language governing permissions and
140bbb917d12358e0264796e75dea888f244761b64Ken Wakasa * limitations under the License.
150bbb917d12358e0264796e75dea888f244761b64Ken Wakasa */
16923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
17e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok#define LOG_TAG "LatinIME: dictionary.cpp"
18e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok
19a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dictionary/dictionary.h"
20b68e73448104714e8f12f89a1e00fb10b5fd14c4Ken Wakasa
213b088a2f365a9ce06f58243c83cb961ea2920b7eKen Wakasa#include "defines.h"
22d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi#include "suggest/core/dictionary/dictionary_utils.h"
2376e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi#include "suggest/core/policy/dictionary_header_structure_policy.h"
24d73edf23aca59e6a0a83a79cf24db3850ef473ffKeisuke Kuroyanagi#include "suggest/core/result/suggestion_results.h"
257c92b421ee18054e43903d6794b4039357dd944aSatoshi Kataoka#include "suggest/core/session/dic_traverse_session.h"
268681bef03c1ca864d3de0ae27adb5cbfb63f0fefKeisuke Kuroyanagi#include "suggest/core/session/prev_words_info.h"
27f497e1e5a0be0a6268bd5f27e6f61308c69c7b63Ken Wakasa#include "suggest/core/suggest.h"
28f497e1e5a0be0a6268bd5f27e6f61308c69c7b63Ken Wakasa#include "suggest/core/suggest_options.h"
29b68e73448104714e8f12f89a1e00fb10b5fd14c4Ken Wakasa#include "suggest/policyimpl/gesture/gesture_suggest_policy_factory.h"
30b68e73448104714e8f12f89a1e00fb10b5fd14c4Ken Wakasa#include "suggest/policyimpl/typing/typing_suggest_policy_factory.h"
316ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi#include "utils/int_array_view.h"
3276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi#include "utils/log_utils.h"
332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "utils/time_keeper.h"
34d4952c8fe9e71c2b313a68077e03d64c8b5196dbsatok
35923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectnamespace latinime {
36923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
375ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagiconst int Dictionary::HEADER_ATTRIBUTE_BUFFER_SIZE = 32;
385ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi
394ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke KuroyanagiDictionary::Dictionary(JNIEnv *env, DictionaryStructureWithBufferPolicy::StructurePolicyPtr
404ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi        dictionaryStructureWithBufferPolicy)
414ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi        : mDictionaryStructureWithBufferPolicy(std::move(dictionaryStructureWithBufferPolicy)),
42e67ede12ec44e998a157e08487f8d6ff8f467880Satoshi Kataoka          mGestureSuggest(new Suggest(GestureSuggestPolicyFactory::getGestureSuggestPolicy())),
43e67ede12ec44e998a157e08487f8d6ff8f467880Satoshi Kataoka          mTypingSuggest(new Suggest(TypingSuggestPolicyFactory::getTypingSuggestPolicy())) {
4476e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    logDictionaryInfo(env);
45923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project}
46923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
47d73edf23aca59e6a0a83a79cf24db3850ef473ffKeisuke Kuroyanagivoid Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
485db594abbad2d9e8d2cf1aa6e417aa50ffc5dfc1Ken Wakasa        int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
49b87fffb8be3dc6a79e49890a7700704d7fee616bKeisuke Kuroyanagi        int inputSize, const PrevWordsInfo *const prevWordsInfo,
50de2b312c6d00509a313c076d0be37eea5c2d41f3Keisuke Kuroyanagi        const SuggestOptions *const suggestOptions, const float languageWeight,
51d73edf23aca59e6a0a83a79cf24db3850ef473ffKeisuke Kuroyanagi        SuggestionResults *const outSuggestionResults) const {
522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
53b87fffb8be3dc6a79e49890a7700704d7fee616bKeisuke Kuroyanagi    traverseSession->init(this, prevWordsInfo, suggestOptions);
54793124855de9dabb9e85b1e06619716649f087c5Keisuke Kuroyanagi    const auto &suggest = suggestOptions->isGesture() ? mGestureSuggest : mTypingSuggest;
55793124855de9dabb9e85b1e06619716649f087c5Keisuke Kuroyanagi    suggest->getSuggestions(proximityInfo, traverseSession, xcoordinates,
56793124855de9dabb9e85b1e06619716649f087c5Keisuke Kuroyanagi            ycoordinates, times, pointerIds, inputCodePoints, inputSize,
57793124855de9dabb9e85b1e06619716649f087c5Keisuke Kuroyanagi            languageWeight, outSuggestionResults);
58d73edf23aca59e6a0a83a79cf24db3850ef473ffKeisuke Kuroyanagi    if (DEBUG_DICT) {
59d73edf23aca59e6a0a83a79cf24db3850ef473ffKeisuke Kuroyanagi        outSuggestionResults->dumpSuggestions();
6077e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa    }
6177e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa}
6277e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa
632d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke KuroyanagiDictionary::NgramListenerForPrediction::NgramListenerForPrediction(
6411a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi        const PrevWordsInfo *const prevWordsInfo, const WordIdArrayView prevWordIds,
6511a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi        SuggestionResults *const suggestionResults,
662d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi        const DictionaryStructureWithBufferPolicy *const dictStructurePolicy)
6711a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi    : mPrevWordsInfo(prevWordsInfo), mPrevWordIds(prevWordIds),
6811a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi      mSuggestionResults(suggestionResults), mDictStructurePolicy(dictStructurePolicy) {}
692d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi
702d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagivoid Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbability,
7194e4cd25a8f7417d30a0832f7476d39ece1df788Keisuke Kuroyanagi        const int targetWordId) {
7294e4cd25a8f7417d30a0832f7476d39ece1df788Keisuke Kuroyanagi    if (targetWordId == NOT_A_WORD_ID) {
732d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi        return;
742d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    }
752d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    if (mPrevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)
762d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi            && ngramProbability == NOT_A_PROBABILITY) {
772d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi        return;
782d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    }
792d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    int targetWordCodePoints[MAX_WORD_LENGTH];
802d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    int unigramProbability = 0;
812d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    const int codePointCount = mDictStructurePolicy->
8294e4cd25a8f7417d30a0832f7476d39ece1df788Keisuke Kuroyanagi            getCodePointsAndProbabilityAndReturnCodePointCount(targetWordId, MAX_WORD_LENGTH,
8394e4cd25a8f7417d30a0832f7476d39ece1df788Keisuke Kuroyanagi                    targetWordCodePoints, &unigramProbability);
842d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    if (codePointCount <= 0) {
852d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi        return;
862d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi    }
872111e3abc9c9c0ea0350b8470532bf636b78cdd7Keisuke Kuroyanagi    const WordAttributes wordAttributes = mDictStructurePolicy->getWordAttributesInContext(
88537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi            mPrevWordIds, targetWordId, nullptr /* multiBigramMap */);
892111e3abc9c9c0ea0350b8470532bf636b78cdd7Keisuke Kuroyanagi    mSuggestionResults->addPrediction(targetWordCodePoints, codePointCount,
902111e3abc9c9c0ea0350b8470532bf636b78cdd7Keisuke Kuroyanagi            wordAttributes.getProbability());
912d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi}
922d57b3339ad5b4bbf0939858c36c7daf5e38a4cbKeisuke Kuroyanagi
93b87fffb8be3dc6a79e49890a7700704d7fee616bKeisuke Kuroyanagivoid Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
94e137ec0a91cf93b0a99fd1e1556ee835d026f731Keisuke Kuroyanagi        SuggestionResults *const outSuggestionResults) const {
952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
96537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIds;
97537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds.data(),
98bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi            true /* tryLowerCaseSearch */);
99537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    const WordIdArrayView prevWordIdArrayView = WordIdArrayView::fromArray(prevWordIds);
100537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    NgramListenerForPrediction listener(prevWordsInfo, prevWordIdArrayView, outSuggestionResults,
10111a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi            mDictionaryStructureWithBufferPolicy.get());
102537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordIdArrayView, &listener);
10377e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa}
10477e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa
105e0e67373735918c78eaeaf24f127e1d28816aa29Satoshi Kataokaint Dictionary::getProbability(const int *word, int length) const {
1061229879e7c5892e818ab53b3c2162a158cc5e177Keisuke Kuroyanagi    return getNgramProbability(nullptr /* prevWordsInfo */, word, length);
107e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok}
108e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok
109d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagiint Dictionary::getMaxProbabilityOfExactMatches(const int *word, int length) const {
110d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi    TimeKeeper::setCurrentTime();
111d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi    return DictionaryUtils::getMaxProbabilityOfExactMatches(
112d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi            mDictionaryStructureWithBufferPolicy.get(), word, length);
113d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi}
114d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi
11583b6ee25385e1c4fd76ca5842ff025acf945596bKeisuke Kuroyanagiint Dictionary::getNgramProbability(const PrevWordsInfo *const prevWordsInfo, const int *word,
1169f8c9a0161924f515c5ff9617db2317cdc1d01e2Keisuke Kuroyanagi        int length) const {
1172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
11889a003b12b5e2408b908a8afed498b0425e2c1c8Keisuke Kuroyanagi    int wordId = mDictionaryStructureWithBufferPolicy->getWordId(
1196ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi            CodePointArrayView(word, length), false /* forceLowerCaseSearch */);
12089a003b12b5e2408b908a8afed498b0425e2c1c8Keisuke Kuroyanagi    if (wordId == NOT_A_WORD_ID) return NOT_A_PROBABILITY;
121bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi    if (!prevWordsInfo) {
122537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi        return getDictionaryStructurePolicy()->getProbabilityOfWord(WordIdArrayView(), wordId);
123bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi    }
124537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIds;
125537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds.data(),
126bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi            true /* tryLowerCaseSearch */);
127537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi    return getDictionaryStructurePolicy()->getProbabilityOfWord(
128537f6eea8a8d56fe532913a37f4dbff4b3d490afKeisuke Kuroyanagi            IntArrayView::fromArray(prevWordIds), wordId);
1295bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi}
1305bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi
131dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::addUnigramEntry(const int *const word, const int length,
132793124855de9dabb9e85b1e06619716649f087c5Keisuke Kuroyanagi        const UnigramProperty *const unigramProperty) {
1332a015dcb25b2996ccca0d9fac74b334aa35928a3Keisuke Kuroyanagi    if (unigramProperty->representsBeginningOfSentence()
1342a015dcb25b2996ccca0d9fac74b334aa35928a3Keisuke Kuroyanagi            && !mDictionaryStructureWithBufferPolicy->getHeaderStructurePolicy()
1352a015dcb25b2996ccca0d9fac74b334aa35928a3Keisuke Kuroyanagi                    ->supportsBeginningOfSentence()) {
1362a015dcb25b2996ccca0d9fac74b334aa35928a3Keisuke Kuroyanagi        AKLOGE("The dictionary doesn't support Beginning-of-Sentence.");
137dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi        return false;
1382a015dcb25b2996ccca0d9fac74b334aa35928a3Keisuke Kuroyanagi    }
1392fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
1406ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->addUnigramEntry(CodePointArrayView(word, length),
1416ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi            unigramProperty);
1425bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi}
1435bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi
144f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagibool Dictionary::removeUnigramEntry(const int *const codePoints, const int codePointCount) {
145f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi    TimeKeeper::setCurrentTime();
1466ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->removeUnigramEntry(
1476ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi            CodePointArrayView(codePoints, codePointCount));
148f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi}
149f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi
150dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
151620a05ae59ec9f7be39557094fc306c51c712ca1Keisuke Kuroyanagi        const BigramProperty *const bigramProperty) {
1522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
153dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->addNgramEntry(prevWordsInfo, bigramProperty);
1545bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi}
1555bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi
156dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
1579f8c9a0161924f515c5ff9617db2317cdc1d01e2Keisuke Kuroyanagi        const int *const word, const int length) {
1582fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
1596ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->removeNgramEntry(prevWordsInfo,
1606ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi            CodePointArrayView(word, length));
1614d289d39aeae21064f63d958974816ceee3e9fdeTom Ouyang}
162ede2333640accecc066de328cb4f93e03e4bc5d7Tom Ouyang
163dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::flush(const char *const filePath) {
1642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
165dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->flush(filePath);
166d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi}
167d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi
168dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::flushWithGC(const char *const filePath) {
1692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
170dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->flushWithGC(filePath);
171d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi}
172d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi
173c18510049a3422c88ed3ab3bbc64944c94a611fdKeisuke Kuroyanagibool Dictionary::needsToRunGC(const bool mindsBlockByGC) {
1742fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
1754ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->needsToRunGC(mindsBlockByGC);
176d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi}
177d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi
1782fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasavoid Dictionary::getProperty(const char *const query, const int queryLength, char *const outResult,
179699531099630edd8416e309c914187c285af4c44Keisuke Kuroyanagi        const int maxResultLength) {
1802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
1814ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->getProperty(query, queryLength, outResult,
1822fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            maxResultLength);
1832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}
1842fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
185080a35e959435566e768f2e31afdac784a4dcd00Keisuke Kuroyanagiconst WordProperty Dictionary::getWordProperty(const int *const codePoints,
1862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        const int codePointCount) {
1872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    TimeKeeper::setCurrentTime();
1884ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->getWordProperty(
1896ae4d79d81aa7aea5529d95bb3eb960a273ef411Keisuke Kuroyanagi            CodePointArrayView(codePoints, codePointCount));
19031097a57cc6f8022abc0ea56f27147399f41b630Keisuke Kuroyanagi}
19131097a57cc6f8022abc0ea56f27147399f41b630Keisuke Kuroyanagi
192f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagiint Dictionary::getNextWordAndNextToken(const int token, int *const outCodePoints,
193f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagi        int *const outCodePointCount) {
19438f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi    TimeKeeper::setCurrentTime();
1954ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    return mDictionaryStructureWithBufferPolicy->getNextWordAndNextToken(
196f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagi            token, outCodePoints, outCodePointCount);
19738f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi}
19838f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi
19976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagivoid Dictionary::logDictionaryInfo(JNIEnv *const env) const {
2005ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    int dictionaryIdCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
2015ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    int versionStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
2025ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    int dateStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
20376e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    const DictionaryHeaderStructurePolicy *const headerPolicy =
20476e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi            getDictionaryStructurePolicy()->getHeaderStructurePolicy();
20576e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    headerPolicy->readHeaderValueOrQuestionMark("dictionary", dictionaryIdCodePointBuffer,
2065ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            HEADER_ATTRIBUTE_BUFFER_SIZE);
20776e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    headerPolicy->readHeaderValueOrQuestionMark("version", versionStringCodePointBuffer,
2085ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            HEADER_ATTRIBUTE_BUFFER_SIZE);
2095ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    headerPolicy->readHeaderValueOrQuestionMark("date", dateStringCodePointBuffer,
2105ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            HEADER_ATTRIBUTE_BUFFER_SIZE);
2115ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi
2125ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    char dictionaryIdCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
2135ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    char versionStringCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
2145ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    char dateStringCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE];
2155ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    intArrayToCharArray(dictionaryIdCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE,
2165ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            dictionaryIdCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE);
2175ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    intArrayToCharArray(versionStringCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE,
2185ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            versionStringCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE);
2195ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    intArrayToCharArray(dateStringCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE,
2205ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            dateStringCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE);
22176e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi
22276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    LogUtils::logToJava(env,
2230624cc6cf3971aa3c189185208571a5f3d0c459cKeisuke Kuroyanagi            "Dictionary info: dictionary = %s ; version = %s ; date = %s",
2240624cc6cf3971aa3c189185208571a5f3d0c459cKeisuke Kuroyanagi            dictionaryIdCharBuffer, versionStringCharBuffer, dateStringCharBuffer);
22576e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi}
22676e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi
227923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project} // namespace latinime
228