From 68e7edfd99cc5b2c72a6a8887cd345011f4625a1 Mon Sep 17 00:00:00 2001
From: Keisuke Kuroynagi <ksk@google.com>
Date: Thu, 27 Jun 2013 12:53:31 +0900
Subject: [PATCH] Use NOT_A_DICT_POS instead of 0 to express not valid
 ditctionary position.

Bug: 6669677
Change-Id: I4bf2284f8221a0a2ae4534b4a06b0e59c420a5f9
---
 native/jni/src/defines.h                        |  1 +
 native/jni/src/suggest/core/dicnode/dic_node.h  | 11 ++++-------
 .../src/suggest/core/dicnode/dic_node_utils.cpp | 17 ++++++++---------
 3 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/native/jni/src/defines.h b/native/jni/src/defines.h
index e349aedb1d..cb66814567 100644
--- a/native/jni/src/defines.h
+++ b/native/jni/src/defines.h
@@ -270,6 +270,7 @@ static inline void prof_out(void) {
 #define NOT_A_COORDINATE (-1)
 #define NOT_AN_INDEX (-1)
 #define NOT_A_PROBABILITY (-1)
+#define NOT_A_DICT_POS (S_INT_MIN)
 
 #define KEYCODE_SPACE ' '
 #define KEYCODE_SINGLE_QUOTE '\''
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index abfe82a379..52db8e9c70 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -97,7 +97,6 @@ class DicNode {
     DicNode &operator=(const DicNode &dicNode);
     virtual ~DicNode() {}
 
-    // TODO: minimize arguments by looking binary_format
     // Init for copy
     void initByCopy(const DicNode *dicNode) {
         mIsUsed = true;
@@ -107,13 +106,12 @@ class DicNode {
         PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
     }
 
-    // TODO: minimize arguments by looking binary_format
     // Init for root with prevWordNodePos which is used for bigram
-    void initAsRoot(const int pos, const int childrenPos, const int prevWordNodePos) {
+    void initAsRoot(const int rootGroupPos, const int prevWordNodePos) {
         mIsUsed = true;
         mIsCachedForNextSuggestion = false;
         mDicNodeProperties.init(
-                pos, 0 /* flags */, childrenPos, 0 /* attributesPos */,
+                NOT_A_DICT_POS, 0 /* flags */, rootGroupPos, NOT_A_DICT_POS /* attributesPos */,
                 NOT_A_CODE_POINT /* nodeCodePoint */, NOT_A_PROBABILITY /* probability */,
                 false /* isTerminal */, true /* hasChildren */, 0 /* depth */,
                 0 /* terminalDepth */);
@@ -130,13 +128,12 @@ class DicNode {
         PROF_NODE_COPY(&parentNode->mProfiler, mProfiler);
     }
 
-    // TODO: minimize arguments by looking binary_format
     // Init for root with previous word
-    void initAsRootWithPreviousWord(DicNode *dicNode, const int pos, const int childrenPos) {
+    void initAsRootWithPreviousWord(DicNode *dicNode, const int rootGroupPos) {
         mIsUsed = true;
         mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion;
         mDicNodeProperties.init(
-                pos,  0 /* flags */, childrenPos, 0 /* attributesPos */,
+                NOT_A_DICT_POS,  0 /* flags */, rootGroupPos, NOT_A_DICT_POS /* attributesPos */,
                 NOT_A_CODE_POINT /* nodeCodePoint */, NOT_A_PROBABILITY /* probability */,
                 false /* isTerminal */, true /* hasChildren */, 0 /* depth */,
                 0 /* terminalDepth */);
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 5902882ffa..2063c39ee6 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -36,17 +36,14 @@ namespace latinime {
 
 /* static */ void DicNodeUtils::initAsRoot(const BinaryDictionaryInfo *const binaryDictionaryInfo,
         const int prevWordNodePos, DicNode *const newRootNode) {
-    const int rootPos = binaryDictionaryInfo->getRootPosition();
-    const int childrenPos = rootPos;
-    newRootNode->initAsRoot(rootPos, childrenPos, prevWordNodePos);
+    newRootNode->initAsRoot(binaryDictionaryInfo->getRootPosition(), prevWordNodePos);
 }
 
 /*static */ void DicNodeUtils::initAsRootWithPreviousWord(
         const BinaryDictionaryInfo *const binaryDictionaryInfo,
         DicNode *const prevWordLastNode, DicNode *const newRootNode) {
-    const int rootPos = binaryDictionaryInfo->getRootPosition();
-    const int childrenPos = rootPos;
-    newRootNode->initAsRootWithPreviousWord(prevWordLastNode, rootPos, childrenPos);
+    newRootNode->initAsRootWithPreviousWord(
+            prevWordLastNode, binaryDictionaryInfo->getRootPosition());
 }
 
 /* static */ void DicNodeUtils::initByCopy(DicNode *srcNode, DicNode *destNode) {
@@ -80,6 +77,7 @@ namespace latinime {
     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 hasShortcuts = (0 != (BinaryFormat::FLAG_HAS_SHORTCUT_TARGETS & flags));
 
     int codePoint = BinaryFormat::getCodePointAndForwardPointer(
             binaryDictionaryInfo->getDictRoot(), &pos);
@@ -101,11 +99,12 @@ namespace latinime {
     } while (NOT_A_CODE_POINT != codePoint);
 
     const int probability = isTerminal ? BinaryFormat::readProbabilityWithoutMovingPointer(
-            binaryDictionaryInfo->getDictRoot(), pos) : -1;
+            binaryDictionaryInfo->getDictRoot(), pos) : NOT_A_PROBABILITY;
     pos = BinaryFormat::skipProbability(flags, pos);
     int childrenPos = hasChildren ? BinaryFormat::readChildrenPosition(
-            binaryDictionaryInfo->getDictRoot(), flags, pos) : 0;
-    const int attributesPos = BinaryFormat::skipChildrenPosition(flags, pos);
+            binaryDictionaryInfo->getDictRoot(), flags, pos) : NOT_A_DICT_POS;
+    const int attributesPos =
+            hasShortcuts ? BinaryFormat::skipChildrenPosition(flags, pos) : NOT_A_DICT_POS;
     const int siblingPos = BinaryFormat::skipChildrenPosAndAttributes(
             binaryDictionaryInfo->getDictRoot(), flags, pos);
 
-- 
GitLab