Merge "Add keyboard layout name constant"
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index ffa96e1..c26e3aa 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -37,7 +37,7 @@
 Dictionary::Dictionary(JNIEnv *env, DictionaryStructureWithBufferPolicy::StructurePolicyPtr
         dictionaryStructureWithBufferPolicy)
         : mDictionaryStructureWithBufferPolicy(std::move(dictionaryStructureWithBufferPolicy)),
-          mBigramDictionary(new BigramDictionary(mDictionaryStructureWithBufferPolicy.get())),
+          mBigramDictionary(mDictionaryStructureWithBufferPolicy.get()),
           mGestureSuggest(new Suggest(GestureSuggestPolicyFactory::getGestureSuggestPolicy())),
           mTypingSuggest(new Suggest(TypingSuggestPolicyFactory::getTypingSuggestPolicy())) {
     logDictionaryInfo(env);
@@ -78,7 +78,7 @@
         SuggestionResults *const outSuggestionResults) const {
     TimeKeeper::setCurrentTime();
     if (length <= 0) return;
-    mBigramDictionary->getPredictions(word, length, outSuggestionResults);
+    mBigramDictionary.getPredictions(word, length, outSuggestionResults);
 }
 
 int Dictionary::getProbability(const int *word, int length) const {
@@ -94,7 +94,7 @@
 int Dictionary::getBigramProbability(const int *word0, int length0, const int *word1,
         int length1) const {
     TimeKeeper::setCurrentTime();
-    return mBigramDictionary->getBigramProbability(word0, length0, word1, length1);
+    return mBigramDictionary.getBigramProbability(word0, length0, word1, length1);
 }
 
 void Dictionary::addUnigramWord(const int *const word, const int length, const int probability,
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 2dea9ff..ce032fc 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -109,14 +109,13 @@
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(Dictionary);
 
-    typedef std::unique_ptr<BigramDictionary> BigramDictionaryPtr;
     typedef std::unique_ptr<SuggestInterface> SuggestInterfacePtr;
 
     static const int HEADER_ATTRIBUTE_BUFFER_SIZE;
 
     const DictionaryStructureWithBufferPolicy::StructurePolicyPtr
             mDictionaryStructureWithBufferPolicy;
-    const BigramDictionaryPtr mBigramDictionary;
+    const BigramDictionary mBigramDictionary;
     const SuggestInterfacePtr mGestureSuggest;
     const SuggestInterfacePtr mTypingSuggest;
 
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 84a6ccf..4e795f8 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
@@ -349,13 +349,14 @@
         // Skip the entry if the entry has been deleted. This never happens for ver2 dicts.
         if (bigramsIt.getBigramPos() != NOT_A_DICT_POS) {
             int word1Probability = NOT_A_PROBABILITY;
-            int word1CodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
+            const int word1CodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
                     bigramsIt.getBigramPos(), MAX_WORD_LENGTH, bigramWord1CodePoints,
                     &word1Probability);
-            std::vector<int> word1(bigramWord1CodePoints,
+            const std::vector<int> word1(bigramWord1CodePoints,
                     bigramWord1CodePoints + word1CodePointCount);
-            bigrams.push_back(WordProperty::BigramProperty(&word1, bigramsIt.getProbability(),
-                    NOT_A_TIMESTAMP /* timestamp */, 0 /* level */, 0 /* count */));
+            const int probability = getProbability(word1Probability, bigramsIt.getProbability());
+            bigrams.emplace_back(&word1, probability,
+                    NOT_A_TIMESTAMP /* timestamp */, 0 /* level */, 0 /* count */);
         }
     }
     // Fetch shortcut information.
@@ -371,12 +372,11 @@
             hasNext = ShortcutListReadingUtils::hasNext(shortcutFlags);
             const int shortcutTargetLength = ShortcutListReadingUtils::readShortcutTarget(
                     mDictRoot, MAX_WORD_LENGTH, shortcutTargetCodePoints, &shortcutPos);
-            std::vector<int> shortcutTarget(shortcutTargetCodePoints,
+            const std::vector<int> shortcutTarget(shortcutTargetCodePoints,
                     shortcutTargetCodePoints + shortcutTargetLength);
             const int shortcutProbability =
                     ShortcutListReadingUtils::getProbabilityFromFlags(shortcutFlags);
-            shortcuts.push_back(
-                    WordProperty::ShortcutProperty(&shortcutTarget, shortcutProbability));
+            shortcuts.emplace_back(&shortcutTarget, shortcutProbability);
         }
     }
     return WordProperty(&codePointVector, ptNodeParams.isNotAWord(),
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 1a38a27..107ddab 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
@@ -382,16 +382,16 @@
             const int codePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
                     word1TerminalPtNodePos, MAX_WORD_LENGTH, bigramWord1CodePoints,
                     &word1Probability);
-            std::vector<int> word1(bigramWord1CodePoints,
+            const std::vector<int> word1(bigramWord1CodePoints,
                     bigramWord1CodePoints + codePointCount);
             const HistoricalInfo *const historicalInfo = bigramEntry.getHistoricalInfo();
             const int probability = bigramEntry.hasHistoricalInfo() ?
                     ForgettingCurveUtils::decodeProbability(
                             bigramEntry.getHistoricalInfo(), mHeaderPolicy) :
-                    bigramEntry.getProbability();
-            bigrams.push_back(WordProperty::BigramProperty(&word1, probability,
+                    getProbability(word1Probability, bigramEntry.getProbability());
+            bigrams.emplace_back(&word1, probability,
                     historicalInfo->getTimeStamp(), historicalInfo->getLevel(),
-                    historicalInfo->getCount()));
+                    historicalInfo->getCount());
         }
     }
     // Fetch shortcut information.
@@ -407,8 +407,8 @@
             int shortcutProbability = NOT_A_PROBABILITY;
             shortcutDictContent->getShortcutEntryAndAdvancePosition(MAX_WORD_LENGTH, shortcutTarget,
                     &shortcutTargetLength, &shortcutProbability, &hasNext, &shortcutPos);
-            std::vector<int> target(shortcutTarget, shortcutTarget + shortcutTargetLength);
-            shortcuts.push_back(WordProperty::ShortcutProperty(&target, shortcutProbability));
+            const std::vector<int> target(shortcutTarget, shortcutTarget + shortcutTargetLength);
+            shortcuts.emplace_back(&target, shortcutProbability);
         }
     }
     return WordProperty(&codePointVector, ptNodeParams.isNotAWord(),