dictionary.cpp revision fc7d0540fee2ac09336b562af7a421e96790cb7f
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(); 96c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIdArray; 97c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi const WordIdArrayView prevWordIds = prevWordsInfo->getPrevWordIds( 98c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi mDictionaryStructureWithBufferPolicy.get(), &prevWordIdArray, 99bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi true /* tryLowerCaseSearch */); 100c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi NgramListenerForPrediction listener(prevWordsInfo, prevWordIds, outSuggestionResults, 10111a48f92a517b2c8b1899bc57ab9dfe6c48209ebKeisuke Kuroyanagi mDictionaryStructureWithBufferPolicy.get()); 102c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordIds, &listener); 10377e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa} 10477e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa 1053e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagiint Dictionary::getProbability(const CodePointArrayView codePoints) const { 1063e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi return getNgramProbability(nullptr /* prevWordsInfo */, codePoints); 107e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok} 108e808e436cbd6f1aeadb5d61f354d03c3c50872a7satok 1093e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagiint Dictionary::getMaxProbabilityOfExactMatches(const CodePointArrayView codePoints) const { 110d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi TimeKeeper::setCurrentTime(); 111d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi return DictionaryUtils::getMaxProbabilityOfExactMatches( 112fc7d0540fee2ac09336b562af7a421e96790cb7fKeisuke Kuroyanagi mDictionaryStructureWithBufferPolicy.get(), codePoints); 113d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi} 114d9b8602f4862c2c876e1499aad7ca7d77ea66595Keisuke Kuroyanagi 1153e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagiint Dictionary::getNgramProbability(const PrevWordsInfo *const prevWordsInfo, 1163e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi const CodePointArrayView codePoints) const { 1172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 1183e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi const int wordId = mDictionaryStructureWithBufferPolicy->getWordId(codePoints, 1193e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi 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 } 124c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIdArray; 125c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi const WordIdArrayView prevWordIds = prevWordsInfo->getPrevWordIds 126c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi (mDictionaryStructureWithBufferPolicy.get(), &prevWordIdArray, 127bd1f59bda5ad0b7028ec06c2de078f1623e76cddKeisuke Kuroyanagi true /* tryLowerCaseSearch */); 128c43b6664faedff7f97df24fbc07e1c1c6c4a9106Keisuke Kuroyanagi return getDictionaryStructurePolicy()->getProbabilityOfWord(prevWordIds, wordId); 1295bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi} 1305bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi 1313e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagibool Dictionary::addUnigramEntry(const CodePointArrayView codePoints, 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(); 1403e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->addUnigramEntry(codePoints, unigramProperty); 1415bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi} 1425bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi 1433e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagibool Dictionary::removeUnigramEntry(const CodePointArrayView codePoints) { 144f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi TimeKeeper::setCurrentTime(); 1453e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->removeUnigramEntry(codePoints); 146f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi} 147f12985245c962779f0b422b3072cffe533b4edfbKeisuke Kuroyanagi 148dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::addNgramEntry(const PrevWordsInfo *const prevWordsInfo, 149620a05ae59ec9f7be39557094fc306c51c712ca1Keisuke Kuroyanagi const BigramProperty *const bigramProperty) { 1502fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 151dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->addNgramEntry(prevWordsInfo, bigramProperty); 1525bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi} 1535bf1be71629607e7206e6203489cf742d2f8ed79Keisuke Kuroynagi 154dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::removeNgramEntry(const PrevWordsInfo *const prevWordsInfo, 1553e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi const CodePointArrayView codePoints) { 1562fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 1573e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->removeNgramEntry(prevWordsInfo, codePoints); 1584d289d39aeae21064f63d958974816ceee3e9fdeTom Ouyang} 159ede2333640accecc066de328cb4f93e03e4bc5d7Tom Ouyang 160dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::flush(const char *const filePath) { 1612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 162dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->flush(filePath); 163d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi} 164d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi 165dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagibool Dictionary::flushWithGC(const char *const filePath) { 1662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 167dfca51726e9dc9a35f462dee39331823eafa07c9Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->flushWithGC(filePath); 168d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi} 169d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi 170c18510049a3422c88ed3ab3bbc64944c94a611fdKeisuke Kuroyanagibool Dictionary::needsToRunGC(const bool mindsBlockByGC) { 1712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 1724ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->needsToRunGC(mindsBlockByGC); 173d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi} 174d0246277fde27e9c40a270e206f1d106811e847fKeisuke Kuroyanagi 1752fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasavoid Dictionary::getProperty(const char *const query, const int queryLength, char *const outResult, 176699531099630edd8416e309c914187c285af4c44Keisuke Kuroyanagi const int maxResultLength) { 1772fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 1784ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->getProperty(query, queryLength, outResult, 1792fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa maxResultLength); 1802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} 1812fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 1823e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagiconst WordProperty Dictionary::getWordProperty(const CodePointArrayView codePoints) { 1832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa TimeKeeper::setCurrentTime(); 1843e75c59133000d16d3b5606f67d4ec60988851d8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->getWordProperty(codePoints); 18531097a57cc6f8022abc0ea56f27147399f41b630Keisuke Kuroyanagi} 18631097a57cc6f8022abc0ea56f27147399f41b630Keisuke Kuroyanagi 187f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagiint Dictionary::getNextWordAndNextToken(const int token, int *const outCodePoints, 188f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagi int *const outCodePointCount) { 18938f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi TimeKeeper::setCurrentTime(); 1904ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi return mDictionaryStructureWithBufferPolicy->getNextWordAndNextToken( 191f7322b166b88f72b19509d8416700d4ec8ea7753Keisuke Kuroyanagi token, outCodePoints, outCodePointCount); 19238f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi} 19338f341a2a53a04ce4195a0cb99fcb6e71203dec0Keisuke Kuroyanagi 19476e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagivoid Dictionary::logDictionaryInfo(JNIEnv *const env) const { 1955ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi int dictionaryIdCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 1965ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi int versionStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 1975ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi int dateStringCodePointBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 19876e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi const DictionaryHeaderStructurePolicy *const headerPolicy = 19976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi getDictionaryStructurePolicy()->getHeaderStructurePolicy(); 20076e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi headerPolicy->readHeaderValueOrQuestionMark("dictionary", dictionaryIdCodePointBuffer, 2015ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi HEADER_ATTRIBUTE_BUFFER_SIZE); 20276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi headerPolicy->readHeaderValueOrQuestionMark("version", versionStringCodePointBuffer, 2035ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi HEADER_ATTRIBUTE_BUFFER_SIZE); 2045ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi headerPolicy->readHeaderValueOrQuestionMark("date", dateStringCodePointBuffer, 2055ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi HEADER_ATTRIBUTE_BUFFER_SIZE); 2065ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi 2075ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi char dictionaryIdCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 2085ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi char versionStringCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 2095ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi char dateStringCharBuffer[HEADER_ATTRIBUTE_BUFFER_SIZE]; 2105ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi intArrayToCharArray(dictionaryIdCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE, 2115ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi dictionaryIdCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE); 2125ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi intArrayToCharArray(versionStringCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE, 2135ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi versionStringCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE); 2145ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi intArrayToCharArray(dateStringCodePointBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE, 2155ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi dateStringCharBuffer, HEADER_ATTRIBUTE_BUFFER_SIZE); 21676e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi 21776e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi LogUtils::logToJava(env, 2180624cc6cf3971aa3c189185208571a5f3d0c459cKeisuke Kuroyanagi "Dictionary info: dictionary = %s ; version = %s ; date = %s", 2190624cc6cf3971aa3c189185208571a5f3d0c459cKeisuke Kuroyanagi dictionaryIdCharBuffer, versionStringCharBuffer, dateStringCharBuffer); 22076e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi} 22176e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi 222923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project} // namespace latinime 223