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