12fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* 22fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Copyright (C) 2013 The Android Open Source Project 32fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 42fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Licensed under the Apache License, Version 2.0 (the "License"); 52fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * you may not use this file except in compliance with the License. 62fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * You may obtain a copy of the License at 72fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 82fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * http://www.apache.org/licenses/LICENSE-2.0 92fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 102fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Unless required by applicable law or agreed to in writing, software 112fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * distributed under the License is distributed on an "AS IS" BASIS, 122fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * See the License for the specific language governing permissions and 142fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * limitations under the License. 152fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa */ 162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#ifndef LATINIME_VER4_SHORTCUT_LIST_POLICY_H 182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#define LATINIME_VER4_SHORTCUT_LIST_POLICY_H 192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 202fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "defines.h" 2188bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/interface/dictionary_shortcuts_structure_policy.h" 2288bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h" 2388bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v4/content/shortcut_dict_content.h" 2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v4/content/terminal_position_lookup_table.h" 252fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasanamespace latinime { 272fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 282fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaclass Ver4ShortcutListPolicy : public DictionaryShortcutsStructurePolicy { 292fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa public: 302fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa Ver4ShortcutListPolicy(ShortcutDictContent *const shortcutDictContent, 312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const TerminalPositionLookupTable *const terminalPositionLookupTable) 326767f88e3c7814ab9aecd256e24b939f9b80234aKen Wakasa : mShortcutDictContent(shortcutDictContent) {} 332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 342fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ~Ver4ShortcutListPolicy() {} 352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int getStartPos(const int pos) const { 372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // The first shortcut entry is located at the head position of the shortcut list. 382fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return pos; 392fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 402fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 412fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa void getNextShortcut(const int maxCodePointCount, int *const outCodePoint, 422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int *const outCodePointCount, bool *const outIsWhitelist, bool *const outHasNext, 432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int *const pos) const { 442fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int probability = 0; 452fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa mShortcutDictContent->getShortcutEntryAndAdvancePosition(maxCodePointCount, 462fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa outCodePoint, outCodePointCount, &probability, outHasNext, pos); 472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (outIsWhitelist) { 482fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *outIsWhitelist = ShortcutListReadingUtils::isWhitelist(probability); 492fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 502fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 512fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa void skipAllShortcuts(int *const pos) const { 532fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Do nothing because we don't need to skip shortcut lists in ver4 dictionaries. 542fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 552fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 562fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool addNewShortcut(const int terminalId, const int *const codePoints, const int codePointCount, 572fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int probability) { 582fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int shortcutListPos = mShortcutDictContent->getShortcutListHeadPos(terminalId); 592fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (shortcutListPos == NOT_A_DICT_POS) { 602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Create shortcut list. 612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (!mShortcutDictContent->createNewShortcutList(terminalId)) { 622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("Cannot create new shortcut list. terminal id: %d", terminalId); 632fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return false; 642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 652fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int writingPos = mShortcutDictContent->getShortcutListHeadPos(terminalId); 662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return mShortcutDictContent->writeShortcutEntry(codePoints, codePointCount, probability, 672fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa false /* hasNext */, writingPos); 682fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int entryPos = mShortcutDictContent->findShortcutEntryAndGetPos(shortcutListPos, 702fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa codePoints, codePointCount); 712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (entryPos == NOT_A_DICT_POS) { 722fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Add new entry to the shortcut list. 732fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Create new shortcut list. 742fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (!mShortcutDictContent->createNewShortcutList(terminalId)) { 752fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("Cannot create new shortcut list. terminal id: %d", terminalId); 762fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return false; 772fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 782fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int writingPos = mShortcutDictContent->getShortcutListHeadPos(terminalId); 792fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (!mShortcutDictContent->writeShortcutEntryAndAdvancePosition(codePoints, 802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa codePointCount, probability, true /* hasNext */, &writingPos)) { 812fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("Cannot write shortcut entry. terminal id: %d, pos: %d", terminalId, 822fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa writingPos); 832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return false; 842fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 852fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return mShortcutDictContent->copyShortcutList(shortcutListPos, writingPos); 862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Overwrite existing entry. 882fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool hasNext = false; 892fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa mShortcutDictContent->getShortcutEntry(MAX_WORD_LENGTH, 0 /* outCodePoint */, 902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 0 /* outCodePointCount */ , 0 /* probability */, &hasNext, entryPos); 912fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (!mShortcutDictContent->writeShortcutEntry(codePoints, 922fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa codePointCount, probability, hasNext, entryPos)) { 932fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("Cannot overwrite shortcut entry. terminal id: %d, pos: %d", terminalId, 942fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa entryPos); 952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return false; 962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 972fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return true; 982fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 992fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 1002fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa private: 1012fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4ShortcutListPolicy); 1022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 1032fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ShortcutDictContent *const mShortcutDictContent; 1042fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}; 1052fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} // namespace latinime 1062fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#endif // LATINIME_VER4_SHORTCUT_LIST_POLICY_H 107