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

Commit 9118467b authored by Keisuke Kuroynagi's avatar Keisuke Kuroynagi Committed by Android (Google) Code Review
Browse files

Merge "Move creating children methods to structurePolicy."

parents b60e65a0 1fb11da3
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -157,9 +157,10 @@ class DicNode {
        PROF_NODE_COPY(&parentNode->mProfiler, mProfiler);
    }

    void initAsChild(DicNode *dicNode, const int pos, const int childrenPos, const int probability,
            const bool isTerminal, const bool hasChildren, const bool isBlacklistedOrNotAWord,
            const uint16_t mergedNodeCodePointCount, const int *const mergedNodeCodePoints) {
    void initAsChild(const DicNode *const dicNode, const int pos, const int childrenPos,
            const int probability, const bool isTerminal, const bool hasChildren,
            const bool isBlacklistedOrNotAWord, const uint16_t mergedNodeCodePointCount,
            const int *const mergedNodeCodePoints) {
        mIsUsed = true;
        uint16_t newDepth = static_cast<uint16_t>(dicNode->getNodeCodePointCount() + 1);
        mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion;
+2 −65
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@
#include "suggest/core/dicnode/dic_node_proximity_filter.h"
#include "suggest/core/dicnode/dic_node_vector.h"
#include "suggest/core/dictionary/binary_dictionary_info.h"
#include "suggest/core/dictionary/binary_format.h"
#include "suggest/core/dictionary/multi_bigram_map.h"
#include "suggest/core/dictionary/probability_utils.h"
#include "suggest/core/policy/dictionary_structure_policy.h"
@@ -67,68 +66,6 @@ namespace latinime {
    }
}

/* static */ int DicNodeUtils::createAndGetLeavingChildNode(DicNode *dicNode, int pos,
        const BinaryDictionaryInfo *const binaryDictionaryInfo,
        const DicNodeProximityFilter *const childrenFilter,
        DicNodeVector *childDicNodes) {
    int nextPos = pos;
    const uint8_t flags = BinaryFormat::getFlagsAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &pos);
    const bool hasMultipleChars = (0 != (BinaryFormat::FLAG_HAS_MULTIPLE_CHARS & flags));
    const bool isTerminal = (0 != (BinaryFormat::FLAG_IS_TERMINAL & flags));
    const bool hasChildren = BinaryFormat::hasChildrenInFlags(flags);
    const bool isBlacklistedOrNotAWord = BinaryFormat::hasBlacklistedOrNotAWordFlag(flags);

    int codePoint = BinaryFormat::getCodePointAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &pos);
    ASSERT(NOT_A_CODE_POINT != codePoint);
    // TODO: optimize this
    int mergedNodeCodePoints[MAX_WORD_LENGTH];
    uint16_t mergedNodeCodePointCount = 0;
    mergedNodeCodePoints[mergedNodeCodePointCount++] = codePoint;

    do {
        const int nextCodePoint = hasMultipleChars
                ? BinaryFormat::getCodePointAndForwardPointer(
                        binaryDictionaryInfo->getDictRoot(), &pos) : NOT_A_CODE_POINT;
        const bool isLastChar = (NOT_A_CODE_POINT == nextCodePoint);
        if (!isLastChar) {
            mergedNodeCodePoints[mergedNodeCodePointCount++] = nextCodePoint;
        }
        codePoint = nextCodePoint;
    } while (NOT_A_CODE_POINT != codePoint);

    const int probability = isTerminal ? BinaryFormat::readProbabilityWithoutMovingPointer(
            binaryDictionaryInfo->getDictRoot(), pos) : NOT_A_PROBABILITY;
    pos = BinaryFormat::skipProbability(flags, pos);
    int childrenPos = hasChildren ? BinaryFormat::readChildrenPosition(
            binaryDictionaryInfo->getDictRoot(), flags, pos) : NOT_A_DICT_POS;
    const int siblingPos = BinaryFormat::skipChildrenPosAndAttributes(
            binaryDictionaryInfo->getDictRoot(), flags, pos);

    if (childrenFilter->isFilteredOut(mergedNodeCodePoints[0])) {
        return siblingPos;
    }
    childDicNodes->pushLeavingChild(dicNode, nextPos, childrenPos, probability, isTerminal,
            hasChildren, isBlacklistedOrNotAWord, mergedNodeCodePointCount, mergedNodeCodePoints);
    return siblingPos;
}

/* static */ void DicNodeUtils::createAndGetAllLeavingChildNodes(DicNode *dicNode,
        const BinaryDictionaryInfo *const binaryDictionaryInfo,
        const DicNodeProximityFilter *const childrenFilter, DicNodeVector *childDicNodes) {
    if (!dicNode->hasChildren()) {
        return;
    }
    int nextPos = dicNode->getChildrenPos();
    const int childCount = BinaryFormat::getGroupCountAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &nextPos);
    for (int i = 0; i < childCount; i++) {
        nextPos = createAndGetLeavingChildNode(dicNode, nextPos, binaryDictionaryInfo,
                childrenFilter, childDicNodes);
    }
}

/* static */ void DicNodeUtils::getAllChildDicNodes(DicNode *dicNode,
        const BinaryDictionaryInfo *const binaryDictionaryInfo, DicNodeVector *childDicNodes) {
    getProximityChildDicNodes(dicNode, binaryDictionaryInfo, 0, 0, false, childDicNodes);
@@ -145,8 +82,8 @@ namespace latinime {
    if (!dicNode->isLeavingNode()) {
        DicNodeUtils::createAndGetPassingChildNode(dicNode, &childrenFilter, childDicNodes);
    } else {
        DicNodeUtils::createAndGetAllLeavingChildNodes(
                dicNode, binaryDictionaryInfo, &childrenFilter, childDicNodes);
        binaryDictionaryInfo->getStructurePolicy()->createAndGetAllChildNodes(dicNode,
                binaryDictionaryInfo, &childrenFilter, childDicNodes);
    }
}

+0 −6
Original line number Diff line number Diff line
@@ -58,12 +58,6 @@ class DicNodeUtils {
            const DicNode *const node, MultiBigramMap *multiBigramMap);
    static void createAndGetPassingChildNode(DicNode *dicNode,
            const DicNodeProximityFilter *const childrenFilter, DicNodeVector *childDicNodes);
    static void createAndGetAllLeavingChildNodes(DicNode *dicNode,
            const BinaryDictionaryInfo *const binaryDictionaryInfo,
            const DicNodeProximityFilter *const childrenFilter, DicNodeVector *childDicNodes);
    static int createAndGetLeavingChildNode(DicNode *dicNode, int pos,
            const BinaryDictionaryInfo *const binaryDictionaryInfo,
            const DicNodeProximityFilter *const childrenFilter, DicNodeVector *childDicNodes);
};
} // namespace latinime
#endif // LATINIME_DIC_NODE_UTILS_H
+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ class DicNodeVector {
        mDicNodes.back().initAsPassingChild(dicNode);
    }

    void pushLeavingChild(DicNode *dicNode, const int pos, const int childrenPos,
    void pushLeavingChild(const DicNode *const dicNode, const int pos, const int childrenPos,
            const int probability, const bool isTerminal, const bool hasChildren,
            const bool isBlacklistedOrNotAWord, const uint16_t mergedNodeCodePointCount,
            const int *const mergedNodeCodePoints) {
+56 −1
Original line number Diff line number Diff line
@@ -30,7 +30,16 @@ const PatriciaTriePolicy PatriciaTriePolicy::sInstance;
void PatriciaTriePolicy::createAndGetAllChildNodes(const DicNode *const dicNode,
        const BinaryDictionaryInfo *const binaryDictionaryInfo,
        const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const {
    // TODO: Move children creating methods form DicNodeUtils.
    if (!dicNode->hasChildren()) {
        return;
    }
    int nextPos = dicNode->getChildrenPos();
    const int childCount = BinaryFormat::getGroupCountAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &nextPos);
    for (int i = 0; i < childCount; i++) {
        nextPos = createAndGetLeavingChildNode(dicNode, nextPos, binaryDictionaryInfo,
                nodeFilter, childDicNodes);
    }
}

int PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
@@ -83,4 +92,50 @@ int PatriciaTriePolicy::getBigramsPositionOfNode(
            binaryDictionaryInfo->getDictRoot(), nodePos);
}

int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNode, int pos,
        const BinaryDictionaryInfo *const binaryDictionaryInfo,
        const NodeFilter *const childrenFilter, DicNodeVector *childDicNodes) const {
    const int nextPos = pos;
    const uint8_t flags = BinaryFormat::getFlagsAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &pos);
    const bool hasMultipleChars = (0 != (BinaryFormat::FLAG_HAS_MULTIPLE_CHARS & flags));
    const bool isTerminal = (0 != (BinaryFormat::FLAG_IS_TERMINAL & flags));
    const bool hasChildren = BinaryFormat::hasChildrenInFlags(flags);
    const bool isBlacklistedOrNotAWord = BinaryFormat::hasBlacklistedOrNotAWordFlag(flags);

    int codePoint = BinaryFormat::getCodePointAndForwardPointer(
            binaryDictionaryInfo->getDictRoot(), &pos);
    ASSERT(NOT_A_CODE_POINT != codePoint);
    // TODO: optimize this
    int mergedNodeCodePoints[MAX_WORD_LENGTH];
    uint16_t mergedNodeCodePointCount = 0;
    mergedNodeCodePoints[mergedNodeCodePointCount++] = codePoint;

    do {
        const int nextCodePoint = hasMultipleChars
                ? BinaryFormat::getCodePointAndForwardPointer(
                        binaryDictionaryInfo->getDictRoot(), &pos) : NOT_A_CODE_POINT;
        const bool isLastChar = (NOT_A_CODE_POINT == nextCodePoint);
        if (!isLastChar) {
            mergedNodeCodePoints[mergedNodeCodePointCount++] = nextCodePoint;
        }
        codePoint = nextCodePoint;
    } while (NOT_A_CODE_POINT != codePoint);

    const int probability = isTerminal ? BinaryFormat::readProbabilityWithoutMovingPointer(
            binaryDictionaryInfo->getDictRoot(), pos) : NOT_A_PROBABILITY;
    pos = BinaryFormat::skipProbability(flags, pos);
    int childrenPos = hasChildren ? BinaryFormat::readChildrenPosition(
            binaryDictionaryInfo->getDictRoot(), flags, pos) : NOT_A_DICT_POS;
    const int siblingPos = BinaryFormat::skipChildrenPosAndAttributes(
            binaryDictionaryInfo->getDictRoot(), flags, pos);

    if (childrenFilter->isFilteredOut(mergedNodeCodePoints[0])) {
        return siblingPos;
    }
    childDicNodes->pushLeavingChild(dicNode, nextPos, childrenPos, probability, isTerminal,
            hasChildren, isBlacklistedOrNotAWord, mergedNodeCodePointCount, mergedNodeCodePoints);
    return siblingPos;
}

} // namespace latinime
Loading