| Index: third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/shortcut_dict_content.cpp
|
| diff --git a/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/shortcut_dict_content.cpp b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/shortcut_dict_content.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..80901a098a648446f1343e1ee0303a155990311b
|
| --- /dev/null
|
| +++ b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/shortcut_dict_content.cpp
|
| @@ -0,0 +1,199 @@
|
| +/*
|
| + * Copyright (C) 2013, The Android Open Source Project
|
| + *
|
| + * Licensed under the Apache License, Version 2.0 (the "License");
|
| + * you may not use this file except in compliance with the License.
|
| + * You may obtain a copy of the License at
|
| + *
|
| + * http://www.apache.org/licenses/LICENSE-2.0
|
| + *
|
| + * Unless required by applicable law or agreed to in writing, software
|
| + * distributed under the License is distributed on an "AS IS" BASIS,
|
| + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| + * See the License for the specific language governing permissions and
|
| + * limitations under the License.
|
| + */
|
| +
|
| +/*
|
| + * !!!!! DO NOT EDIT THIS FILE !!!!!
|
| + *
|
| + * This file was generated from
|
| + * suggest/policyimpl/dictionary/structure/v4/content/shortcut_dict_content.cpp
|
| + */
|
| +
|
| +#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/shortcut_dict_content.h"
|
| +
|
| +#include "third_party/android_prediction/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h"
|
| +
|
| +namespace latinime {
|
| +namespace backward {
|
| +namespace v402 {
|
| +
|
| +void ShortcutDictContent::getShortcutEntryAndAdvancePosition(const int maxCodePointCount,
|
| + int *const outCodePoint, int *const outCodePointCount, int *const outProbability,
|
| + bool *const outhasNext, int *const shortcutEntryPos) const {
|
| + const BufferWithExtendableBuffer *const shortcutListBuffer = getContentBuffer();
|
| + if (*shortcutEntryPos < 0 || *shortcutEntryPos >= shortcutListBuffer->getTailPosition()) {
|
| + AKLOGE("Invalid shortcut entry position. shortcutEntryPos: %d, bufSize: %d",
|
| + *shortcutEntryPos, shortcutListBuffer->getTailPosition());
|
| + ASSERT(false);
|
| + if (outhasNext) {
|
| + *outhasNext = false;
|
| + }
|
| + if (outCodePointCount) {
|
| + *outCodePointCount = 0;
|
| + }
|
| + return;
|
| + }
|
| +
|
| + const int shortcutFlags = shortcutListBuffer->readUintAndAdvancePosition(
|
| + Ver4DictConstants::SHORTCUT_FLAGS_FIELD_SIZE, shortcutEntryPos);
|
| + if (outProbability) {
|
| + *outProbability = shortcutFlags & Ver4DictConstants::SHORTCUT_PROBABILITY_MASK;
|
| + }
|
| + if (outhasNext) {
|
| + *outhasNext = shortcutFlags & Ver4DictConstants::SHORTCUT_HAS_NEXT_MASK;
|
| + }
|
| + if (outCodePoint && outCodePointCount) {
|
| + shortcutListBuffer->readCodePointsAndAdvancePosition(
|
| + maxCodePointCount, outCodePoint, outCodePointCount, shortcutEntryPos);
|
| + }
|
| +}
|
| +
|
| +int ShortcutDictContent::getShortcutListHeadPos(const int terminalId) const {
|
| + const SparseTable *const addressLookupTable = getAddressLookupTable();
|
| + if (!addressLookupTable->contains(terminalId)) {
|
| + return NOT_A_DICT_POS;
|
| + }
|
| + return addressLookupTable->get(terminalId);
|
| +}
|
| +
|
| +bool ShortcutDictContent::flushToFile(const char *const dictPath) const {
|
| + return flush(dictPath, Ver4DictConstants::SHORTCUT_LOOKUP_TABLE_FILE_EXTENSION,
|
| + Ver4DictConstants::SHORTCUT_CONTENT_TABLE_FILE_EXTENSION,
|
| + Ver4DictConstants::SHORTCUT_FILE_EXTENSION);
|
| +}
|
| +
|
| +bool ShortcutDictContent::runGC(
|
| + const TerminalPositionLookupTable::TerminalIdMap *const terminalIdMap,
|
| + const ShortcutDictContent *const originalShortcutDictContent) {
|
| + for (TerminalPositionLookupTable::TerminalIdMap::const_iterator it = terminalIdMap->begin();
|
| + it != terminalIdMap->end(); ++it) {
|
| + const int originalShortcutListPos =
|
| + originalShortcutDictContent->getShortcutListHeadPos(it->first);
|
| + if (originalShortcutListPos == NOT_A_DICT_POS) {
|
| + continue;
|
| + }
|
| + const int shortcutListPos = getContentBuffer()->getTailPosition();
|
| + // Copy shortcut list from original content.
|
| + if (!copyShortcutListFromDictContent(originalShortcutListPos, originalShortcutDictContent,
|
| + shortcutListPos)) {
|
| + AKLOGE("Cannot copy shortcut list during GC. original pos: %d, pos: %d",
|
| + originalShortcutListPos, shortcutListPos);
|
| + return false;
|
| + }
|
| + // Set shortcut list position to the lookup table.
|
| + if (!getUpdatableAddressLookupTable()->set(it->second, shortcutListPos)) {
|
| + AKLOGE("Cannot set shortcut list position. terminal id: %d, pos: %d",
|
| + it->second, shortcutListPos);
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool ShortcutDictContent::createNewShortcutList(const int terminalId) {
|
| + const int shortcutListListPos = getContentBuffer()->getTailPosition();
|
| + return getUpdatableAddressLookupTable()->set(terminalId, shortcutListListPos);
|
| +}
|
| +
|
| +bool ShortcutDictContent::copyShortcutList(const int shortcutListPos, const int toPos) {
|
| + return copyShortcutListFromDictContent(shortcutListPos, this, toPos);
|
| +}
|
| +
|
| +bool ShortcutDictContent::copyShortcutListFromDictContent(const int shortcutListPos,
|
| + const ShortcutDictContent *const sourceShortcutDictContent, const int toPos) {
|
| + bool hasNext = true;
|
| + int readingPos = shortcutListPos;
|
| + int writingPos = toPos;
|
| + int codePoints[MAX_WORD_LENGTH];
|
| + while (hasNext) {
|
| + int probability = 0;
|
| + int codePointCount = 0;
|
| + sourceShortcutDictContent->getShortcutEntryAndAdvancePosition(MAX_WORD_LENGTH,
|
| + codePoints, &codePointCount, &probability, &hasNext, &readingPos);
|
| + if (!writeShortcutEntryAndAdvancePosition(codePoints, codePointCount, probability,
|
| + hasNext, &writingPos)) {
|
| + AKLOGE("Cannot write shortcut entry to copy. pos: %d", writingPos);
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool ShortcutDictContent::setProbability(const int probability, const int shortcutEntryPos) {
|
| + BufferWithExtendableBuffer *const shortcutListBuffer = getWritableContentBuffer();
|
| + const int shortcutFlags = shortcutListBuffer->readUint(
|
| + Ver4DictConstants::SHORTCUT_FLAGS_FIELD_SIZE, shortcutEntryPos);
|
| + const bool hasNext = shortcutFlags & Ver4DictConstants::SHORTCUT_HAS_NEXT_MASK;
|
| + const int shortcutFlagsToWrite = createAndGetShortcutFlags(probability, hasNext);
|
| + return shortcutListBuffer->writeUint(shortcutFlagsToWrite,
|
| + Ver4DictConstants::SHORTCUT_FLAGS_FIELD_SIZE, shortcutEntryPos);
|
| +}
|
| +
|
| +bool ShortcutDictContent::writeShortcutEntryAndAdvancePosition(const int *const codePoint,
|
| + const int codePointCount, const int probability, const bool hasNext,
|
| + int *const shortcutEntryPos) {
|
| + BufferWithExtendableBuffer *const shortcutListBuffer = getWritableContentBuffer();
|
| + const int shortcutFlags = createAndGetShortcutFlags(probability, hasNext);
|
| + if (!shortcutListBuffer->writeUintAndAdvancePosition(shortcutFlags,
|
| + Ver4DictConstants::SHORTCUT_FLAGS_FIELD_SIZE, shortcutEntryPos)) {
|
| + AKLOGE("Cannot write shortcut flags. flags; %x, pos: %d", shortcutFlags, *shortcutEntryPos);
|
| + return false;
|
| + }
|
| + if (!shortcutListBuffer->writeCodePointsAndAdvancePosition(codePoint, codePointCount,
|
| + true /* writesTerminator */, shortcutEntryPos)) {
|
| + AKLOGE("Cannot write shortcut target code points. pos: %d", *shortcutEntryPos);
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +// Find a shortcut entry that has specified target and return its position.
|
| +int ShortcutDictContent::findShortcutEntryAndGetPos(const int shortcutListPos,
|
| + const int *const targetCodePointsToFind, const int codePointCount) const {
|
| + bool hasNext = true;
|
| + int readingPos = shortcutListPos;
|
| + int targetCodePoints[MAX_WORD_LENGTH];
|
| + while (hasNext) {
|
| + const int entryPos = readingPos;
|
| + int probability = 0;
|
| + int targetCodePointCount = 0;
|
| + getShortcutEntryAndAdvancePosition(MAX_WORD_LENGTH, targetCodePoints, &targetCodePointCount,
|
| + &probability, &hasNext, &readingPos);
|
| + if (targetCodePointCount != codePointCount) {
|
| + continue;
|
| + }
|
| + bool matched = true;
|
| + for (int i = 0; i < codePointCount; ++i) {
|
| + if (targetCodePointsToFind[i] != targetCodePoints[i]) {
|
| + matched = false;
|
| + break;
|
| + }
|
| + }
|
| + if (matched) {
|
| + return entryPos;
|
| + }
|
| + }
|
| + return NOT_A_DICT_POS;
|
| +}
|
| +
|
| +int ShortcutDictContent::createAndGetShortcutFlags(const int probability,
|
| + const bool hasNext) const {
|
| + return (probability & Ver4DictConstants::SHORTCUT_PROBABILITY_MASK)
|
| + | (hasNext ? Ver4DictConstants::SHORTCUT_HAS_NEXT_MASK : 0);
|
| +}
|
| +
|
| +} // namespace v402
|
| +} // namespace backward
|
| +} // namespace latinime
|
|
|