Merge "Move initialization logic for from DicNode to DicNodeState."
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 59eff9a..4f69a84 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -130,21 +130,9 @@
                 NOT_A_PROBABILITY /* probability */, false /* isTerminal */,
                 true /* hasChildren */, false /* isBlacklistedOrNotAWord */,  0 /* depth */,
                 0 /* terminalDepth */);
-        // TODO: Move to dicNodeState?
-        mDicNodeState.mDicNodeStateOutput.init(); // reset for next word
-        mDicNodeState.mDicNodeStateInput.init(
-                &dicNode->mDicNodeState.mDicNodeStateInput, true /* resetTerminalDiffCost */);
-        mDicNodeState.mDicNodeStateScoring.init(
-                &dicNode->mDicNodeState.mDicNodeStateScoring);
-        mDicNodeState.mDicNodeStatePrevWord.init(
-                dicNode->mDicNodeState.mDicNodeStatePrevWord.getPrevWordCount() + 1,
+        mDicNodeState.initAsRootWithPreviousWord(&dicNode->mDicNodeState,
                 dicNode->mDicNodeProperties.getPtNodePos(),
-                dicNode->mDicNodeState.mDicNodeStatePrevWord.mPrevWord,
-                dicNode->mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(),
-                dicNode->getOutputWordBuf(),
-                dicNode->mDicNodeProperties.getDepth(),
-                dicNode->mDicNodeState.mDicNodeStatePrevWord.getSecondWordFirstInputIndex(),
-                mDicNodeState.mDicNodeStateInput.getInputIndex(0) /* lastInputIndex */);
+                dicNode->mDicNodeProperties.getDepth());
         PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
     }
 
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state.h
index f79ac7b..e7121a9 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state.h
@@ -58,6 +58,24 @@
         mDicNodeStateScoring.init();
     }
 
+    // Init with previous word.
+    void initAsRootWithPreviousWord(const DicNodeState *prevWordDicNodeState,
+            const int prevWordPos, const int prevWordCodePointCount) {
+        mDicNodeStateOutput.init(); // reset for next word
+        mDicNodeStateInput.init(
+                &prevWordDicNodeState->mDicNodeStateInput, true /* resetTerminalDiffCost */);
+        mDicNodeStateScoring.init(&prevWordDicNodeState->mDicNodeStateScoring);
+        mDicNodeStatePrevWord.init(
+                prevWordDicNodeState->mDicNodeStatePrevWord.getPrevWordCount() + 1,
+                prevWordPos,
+                prevWordDicNodeState->mDicNodeStatePrevWord.mPrevWord,
+                prevWordDicNodeState->mDicNodeStatePrevWord.getPrevWordLength(),
+                prevWordDicNodeState->mDicNodeStateOutput.mCodePointsBuf,
+                prevWordCodePointCount,
+                prevWordDicNodeState->mDicNodeStatePrevWord.getSecondWordFirstInputIndex(),
+                prevWordDicNodeState->mDicNodeStateInput.getInputIndex(0) /* lastInputIndex */);
+    }
+
     // Init by copy
     AK_FORCE_INLINE void init(const DicNodeState *const src) {
         mDicNodeStateInput.init(&src->mDicNodeStateInput);