Make dictionary structure policy return shortcut iterator.

Bug: 14425059

Change-Id: I0da22c41f818673430c285103af340397aaba9fb
diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
index 558e0a5..ee1606b 100644
--- a/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
+++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_shortcut_iterator.h
@@ -31,6 +31,11 @@
               mPos(shortcutStructurePolicy->getStartPos(shortcutPos)),
               mHasNextShortcutTarget(shortcutPos != NOT_A_DICT_POS) {}
 
+    BinaryDictionaryShortcutIterator(const BinaryDictionaryShortcutIterator &&shortcutIterator)
+            : mShortcutStructurePolicy(shortcutIterator.mShortcutStructurePolicy),
+              mPos(shortcutIterator.mPos),
+              mHasNextShortcutTarget(shortcutIterator.mHasNextShortcutTarget) {}
+
     AK_FORCE_INLINE bool hasNextShortcutTarget() const {
         return mHasNextShortcutTarget;
     }
@@ -45,7 +50,8 @@
     }
 
  private:
-    DISALLOW_IMPLICIT_CONSTRUCTORS(BinaryDictionaryShortcutIterator);
+    DISALLOW_DEFAULT_CONSTRUCTOR(BinaryDictionaryShortcutIterator);
+    DISALLOW_ASSIGNMENT_OPERATOR(BinaryDictionaryShortcutIterator);
 
     const DictionaryShortcutsStructurePolicy *const mShortcutStructurePolicy;
     int mPos;
diff --git a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
index 72ec13f..e62543d 100644
--- a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
+++ b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
@@ -20,6 +20,7 @@
 #include <memory>
 
 #include "defines.h"
+#include "suggest/core/dictionary/binary_dictionary_shortcut_iterator.h"
 #include "suggest/core/dictionary/property/word_property.h"
 #include "utils/int_array_view.h"
 
@@ -28,7 +29,6 @@
 class DicNode;
 class DicNodeVector;
 class DictionaryHeaderStructurePolicy;
-class DictionaryShortcutsStructurePolicy;
 class NgramListener;
 class PrevWordsInfo;
 class UnigramProperty;
@@ -63,12 +63,10 @@
     virtual void iterateNgramEntries(const int *const prevWordIds,
             NgramListener *const listener) const = 0;
 
-    virtual int getShortcutPositionOfPtNode(const int ptNodePos) const = 0;
+    virtual BinaryDictionaryShortcutIterator getShortcutIterator(const int ptNodePos) const = 0;
 
     virtual const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const = 0;
 
-    virtual const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const = 0;
-
     // Returns whether the update was success or not.
     virtual bool addUnigramEntry(const CodePointArrayView wordCodePoints,
             const UnigramProperty *const unigramProperty) = 0;
diff --git a/native/jni/src/suggest/core/result/suggestions_output_utils.cpp b/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
index 0b99b75..bd2aa5f 100644
--- a/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
+++ b/native/jni/src/suggest/core/result/suggestions_output_utils.cpp
@@ -139,10 +139,9 @@
     // Shortcut is not supported for multiple words suggestions.
     // TODO: Check shortcuts during traversal for multiple words suggestions.
     if (!terminalDicNode->hasMultipleWords()) {
-        BinaryDictionaryShortcutIterator shortcutIt(
-                traverseSession->getDictionaryStructurePolicy()->getShortcutsStructurePolicy(),
-                traverseSession->getDictionaryStructurePolicy()
-                        ->getShortcutPositionOfPtNode(terminalDicNode->getPtNodePos()));
+        BinaryDictionaryShortcutIterator shortcutIt =
+                traverseSession->getDictionaryStructurePolicy()->getShortcutIterator(
+                        terminalDicNode->getPtNodePos());
         const bool sameAsTyped = scoringPolicy->sameAsTyped(traverseSession, terminalDicNode);
         outputShortcuts(&shortcutIt, finalScore, sameAsTyped, outSuggestionResults);
     }
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
index 5dff1fc..eb7d451 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
@@ -174,6 +174,12 @@
     }
 }
 
+BinaryDictionaryShortcutIterator Ver4PatriciaTriePolicy::getShortcutIterator(
+        const int ptNodePos) const {
+    const int shortcutPos = getShortcutPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryShortcutIterator(&mShortcutPolicy, shortcutPos);
+}
+
 int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
index 508a46c..55b7103 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
@@ -29,6 +29,7 @@
 
 #include "defines.h"
 #include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
+#include "suggest/core/dictionary/binary_dictionary_shortcut_iterator.h"
 #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h"
@@ -96,16 +97,12 @@
 
     void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
 
-    int getShortcutPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryShortcutIterator getShortcutIterator(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return mHeaderPolicy;
     }
 
-    const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
-        return &mShortcutPolicy;
-    }
-
     bool addUnigramEntry(const CodePointArrayView wordCodePoints,
             const UnigramProperty *const unigramProperty);
 
@@ -163,6 +160,7 @@
     mutable bool mIsCorrupted;
 
     int getBigramsPositionOfPtNode(const int ptNodePos) const;
+    int getShortcutPositionOfPtNode(const int ptNodePos) const;
     int getWordIdFromTerminalPtNodePos(const int ptNodePos) const;
     int getTerminalPtNodePosFromWordId(const int wordId) const;
 };
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 85971f1..12196fc 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -341,6 +341,12 @@
     }
 }
 
+BinaryDictionaryShortcutIterator PatriciaTriePolicy::getShortcutIterator(
+        const int ptNodePos) const {
+    const int shortcutPos = getShortcutPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryShortcutIterator(&mShortcutListPolicy, shortcutPos);
+}
+
 int PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
@@ -365,7 +371,7 @@
     int shortcutPos = NOT_A_DICT_POS;
     int bigramPos = NOT_A_DICT_POS;
     int siblingPos = NOT_A_DICT_POS;
-    PatriciaTrieReadingUtils::readPtNodeInfo(mDictRoot, ptNodePos, getShortcutsStructurePolicy(),
+    PatriciaTrieReadingUtils::readPtNodeInfo(mDictRoot, ptNodePos, &mShortcutListPolicy,
             &mBigramListPolicy, &flags, &mergedNodeCodePointCount, mergedNodeCodePoints,
             &probability, &childrenPos, &shortcutPos, &bigramPos, &siblingPos);
     // Skip PtNodes don't start with Unicode code point because they represent non-word information.
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
index 31fee77..95963be 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
@@ -72,16 +72,12 @@
 
     void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
 
-    int getShortcutPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryShortcutIterator getShortcutIterator(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return &mHeaderPolicy;
     }
 
-    const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
-        return &mShortcutListPolicy;
-    }
-
     bool addUnigramEntry(const CodePointArrayView wordCodePoints,
             const UnigramProperty *const unigramProperty) {
         // This method should not be called for non-updatable dictionary.
@@ -158,6 +154,7 @@
     std::vector<int> mTerminalPtNodePositionsForIteratingWords;
     mutable bool mIsCorrupted;
 
+    int getShortcutPositionOfPtNode(const int ptNodePos) const;
     int getBigramsPositionOfPtNode(const int ptNodePos) const;
     int createAndGetLeavingChildNode(const DicNode *const dicNode, const int ptNodePos,
             DicNodeVector *const childDicNodes) const;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
index 7024682..04f43f6 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
@@ -156,6 +156,12 @@
     return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
 }
 
+BinaryDictionaryShortcutIterator Ver4PatriciaTriePolicy::getShortcutIterator(
+        const int ptNodePos) const {
+    const int shortcutPos = getShortcutPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryShortcutIterator(&mShortcutPolicy, shortcutPos);
+}
+
 void Ver4PatriciaTriePolicy::iterateNgramEntries(const int *const prevWordIds,
         NgramListener *const listener) const {
     if (!prevWordIds) {
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
index 1d2712a..8435726 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
@@ -74,16 +74,12 @@
 
     void iterateNgramEntries(const int *const prevWordIds, NgramListener *const listener) const;
 
-    int getShortcutPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryShortcutIterator getShortcutIterator(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return mHeaderPolicy;
     }
 
-    const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
-        return &mShortcutPolicy;
-    }
-
     bool addUnigramEntry(const CodePointArrayView wordCodePoints,
             const UnigramProperty *const unigramProperty);
 
@@ -138,6 +134,8 @@
     int mBigramCount;
     std::vector<int> mTerminalPtNodePositionsForIteratingWords;
     mutable bool mIsCorrupted;
+
+    int getShortcutPositionOfPtNode(const int ptNodePos) const;
 };
 } // namespace latinime
 #endif // LATINIME_VER4_PATRICIA_TRIE_POLICY_H