aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeisuke Kuroynagi <ksk@google.com>2013-07-29 12:44:01 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-07-29 12:44:01 +0000
commit9118467b8601c87ae6f55b47ea7becaba8d1f9fb (patch)
tree64da2c73c343b5f1f0e4f72325ae7fec96dd8fb5
parentb60e65a0cce9f20ee5e633921732785f99fffd2e (diff)
parent1fb11da36ab279fa4fcc62d772d9cce877bf23bd (diff)
downloadlatinime-9118467b8601c87ae6f55b47ea7becaba8d1f9fb.tar.gz
latinime-9118467b8601c87ae6f55b47ea7becaba8d1f9fb.tar.xz
latinime-9118467b8601c87ae6f55b47ea7becaba8d1f9fb.zip
Merge "Move creating children methods to structurePolicy."
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node.h7
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node_utils.cpp67
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node_utils.h6
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node_vector.h2
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp57
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h4
6 files changed, 67 insertions, 76 deletions
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 5c56fe81c..cdd9f59aa 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -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;
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index 071344296..f3b110bbb 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -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);
}
}
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.h b/native/jni/src/suggest/core/dicnode/dic_node_utils.h
index 7b567b582..4f12b29f4 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.h
@@ -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
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_vector.h b/native/jni/src/suggest/core/dicnode/dic_node_vector.h
index 2ba4e5e95..42addae8d 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_vector.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node_vector.h
@@ -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) {
diff --git a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp
index 24de9dcd9..450f6d2ec 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.cpp
@@ -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
diff --git a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h
index 8f36fe00e..42827d93a 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/patricia_trie_policy.h
@@ -60,6 +60,10 @@ class PatriciaTriePolicy : public DictionaryStructurePolicy {
PatriciaTriePolicy() {}
~PatriciaTriePolicy() {}
+
+ int createAndGetLeavingChildNode(const DicNode *const dicNode, int pos,
+ const BinaryDictionaryInfo *const binaryDictionaryInfo,
+ const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const;
};
} // namespace latinime
#endif // LATINIME_PATRICIA_TRIE_POLICY_H