Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 277053af authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Move bigram reading methods to BigramListReadingUtils.

Bug: 6669677
Change-Id: Icb024a8af577323b4dcf74f4c4054cfb8b57a943
parent 4a2f6a22
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ LATIN_IME_CORE_SRC_FILES := \
    suggest/core/policy/weighting.cpp \
    suggest/core/session/dic_traverse_session.cpp \
    $(addprefix suggest/policyimpl/dictionary/, \
        bigram/bigram_list_reading_utils.cpp \
        dictionary_structure_with_buffer_policy_factory.cpp \
        dynamic_patricia_trie_node_reader.cpp \
        dynamic_patricia_trie_policy.cpp \
+0 −23
Original line number Diff line number Diff line
@@ -36,27 +36,4 @@ const int TaUtils::SHORTCUT_LIST_SIZE_FIELD_SIZE = 2;
// The numeric value of the shortcut probability that means 'whitelist'.
const int TaUtils::WHITELIST_SHORTCUT_PROBABILITY = 15;

/* static */ int TaUtils::getBigramAddressAndForwardPointer(
        const uint8_t *const dictRoot, const TerminalAttributeFlags flags,
        int *const pos) {
    int offset = 0;
    const int origin = *pos;
    switch (MASK_ATTRIBUTE_ADDRESS_TYPE & flags) {
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_ONEBYTE:
            offset = ByteArrayUtils::readUint8AndAdvancePosition(dictRoot, pos);
            break;
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_TWOBYTES:
            offset = ByteArrayUtils::readUint16AndAdvancePosition(dictRoot, pos);
            break;
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_THREEBYTES:
            offset = ByteArrayUtils::readUint24AndAdvancePosition(dictRoot, pos);
            break;
    }
    if (isOffsetNegative(flags)) {
        return origin - offset;
    } else {
        return origin + offset;
    }
}

} // namespace latinime
+0 −15
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ namespace latinime {
class BinaryDictionaryTerminalAttributesReadingUtils {
 public:
    typedef uint8_t TerminalAttributeFlags;
    typedef TerminalAttributeFlags BigramFlags;
    typedef TerminalAttributeFlags ShortcutFlags;

    static AK_FORCE_INLINE TerminalAttributeFlags getFlagsAndForwardPointer(
@@ -44,20 +43,6 @@ class BinaryDictionaryTerminalAttributesReadingUtils {
        return (flags & FLAG_ATTRIBUTE_HAS_NEXT) != 0;
    }

    // Bigrams reading methods
    static AK_FORCE_INLINE void skipExistingBigrams(
            const uint8_t *const dictRoot, int *const pos) {
        BigramFlags flags = getFlagsAndForwardPointer(dictRoot, pos);
        while (hasNext(flags)) {
            *pos += attributeAddressSize(flags);
            flags = getFlagsAndForwardPointer(dictRoot, pos);
        }
        *pos += attributeAddressSize(flags);
    }

    static int getBigramAddressAndForwardPointer(
            const uint8_t *const dictRoot, const BigramFlags flags, int *const pos);

    // Shortcuts reading methods
    // This method returns the size of the shortcut list region excluding the shortcut list size
    // field at the beginning.
+7 −11
Original line number Diff line number Diff line
@@ -21,8 +21,7 @@

#include "defines.h"
#include "suggest/core/policy/dictionary_bigrams_structure_policy.h"
// TODO: Move bigrams reading methods to policyimpl.
#include "suggest/core/dictionary/binary_dictionary_terminal_attributes_reading_utils.h"
#include "suggest/policyimpl/dictionary/bigram/bigram_list_reading_utils.h"

namespace latinime {

@@ -34,19 +33,16 @@ class BigramListPolicy : public DictionaryBigramsStructurePolicy {

    void getNextBigram(int *const outBigramPos, int *const outProbability, bool *const outHasNext,
            int *const pos) const {
        const BinaryDictionaryTerminalAttributesReadingUtils::BigramFlags flags =
                BinaryDictionaryTerminalAttributesReadingUtils::getFlagsAndForwardPointer(
                        mBigramsBuf, pos);
        *outBigramPos =
                BinaryDictionaryTerminalAttributesReadingUtils::getBigramAddressAndForwardPointer(
        const BigramListReadingUtils::BigramFlags flags =
                BigramListReadingUtils::getFlagsAndForwardPointer(mBigramsBuf, pos);
        *outBigramPos = BigramListReadingUtils::getBigramAddressAndForwardPointer(
                        mBigramsBuf, flags, pos);
        *outProbability =
                BinaryDictionaryTerminalAttributesReadingUtils::getProbabilityFromFlags(flags);
        *outHasNext = BinaryDictionaryTerminalAttributesReadingUtils::hasNext(flags);
        *outProbability = BigramListReadingUtils::getProbabilityFromFlags(flags);
        *outHasNext = BigramListReadingUtils::hasNext(flags);
    }

    void skipAllBigrams(int *const pos) const {
        BinaryDictionaryTerminalAttributesReadingUtils::skipExistingBigrams(mBigramsBuf, pos);
        BigramListReadingUtils::skipExistingBigrams(mBigramsBuf, pos);
    }

 private:
+62 −0
Original line number Diff line number Diff line
/*
 * 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.
 */

#include "suggest/policyimpl/dictionary/bigram/bigram_list_reading_utils.h"

#include "suggest/core/dictionary/byte_array_utils.h"

namespace latinime {

const BigramListReadingUtils::BigramFlags BigramListReadingUtils::MASK_ATTRIBUTE_ADDRESS_TYPE =
        0x30;
const BigramListReadingUtils::BigramFlags
        BigramListReadingUtils::FLAG_ATTRIBUTE_ADDRESS_TYPE_ONEBYTE = 0x10;
const BigramListReadingUtils::BigramFlags
        BigramListReadingUtils::FLAG_ATTRIBUTE_ADDRESS_TYPE_TWOBYTES = 0x20;
const BigramListReadingUtils::BigramFlags
        BigramListReadingUtils::FLAG_ATTRIBUTE_ADDRESS_TYPE_THREEBYTES = 0x30;
const BigramListReadingUtils::BigramFlags
        BigramListReadingUtils::FLAG_ATTRIBUTE_OFFSET_NEGATIVE = 0x40;
// Flag for presence of more attributes
const BigramListReadingUtils::BigramFlags BigramListReadingUtils::FLAG_ATTRIBUTE_HAS_NEXT = 0x80;
// Mask for attribute probability, stored on 4 bits inside the flags byte.
const BigramListReadingUtils::BigramFlags
        BigramListReadingUtils::MASK_ATTRIBUTE_PROBABILITY = 0x0F;
const int BigramListReadingUtils::ATTRIBUTE_ADDRESS_SHIFT = 4;

/* static */ int BigramListReadingUtils::getBigramAddressAndForwardPointer(
        const uint8_t *const bigramsBuf, const BigramFlags flags, int *const pos) {
    int offset = 0;
    const int origin = *pos;
    switch (MASK_ATTRIBUTE_ADDRESS_TYPE & flags) {
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_ONEBYTE:
            offset = ByteArrayUtils::readUint8AndAdvancePosition(bigramsBuf, pos);
            break;
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_TWOBYTES:
            offset = ByteArrayUtils::readUint16AndAdvancePosition(bigramsBuf, pos);
            break;
        case FLAG_ATTRIBUTE_ADDRESS_TYPE_THREEBYTES:
            offset = ByteArrayUtils::readUint24AndAdvancePosition(bigramsBuf, pos);
            break;
    }
    if (isOffsetNegative(flags)) {
        return origin - offset;
    } else {
        return origin + offset;
    }
}

} // namespace latinime
Loading