Index: third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h |
diff --git a/third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h b/third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c41e437edd87aa6387b94ddc356adbb1d810932b |
--- /dev/null |
+++ b/third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h |
@@ -0,0 +1,298 @@ |
+/* |
+ * Copyright (C) 2013, The Android Open Source Project |
+ * |
+ * Licensed under the Apache License, Version 2.0 (the "License"); |
+ * you may not use this file except in compliance with the License. |
+ * You may obtain a copy of the License at |
+ * |
+ * http://www.apache.org/licenses/LICENSE-2.0 |
+ * |
+ * Unless required by applicable law or agreed to in writing, software |
+ * distributed under the License is distributed on an "AS IS" BASIS, |
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+ * See the License for the specific language governing permissions and |
+ * limitations under the License. |
+ */ |
+ |
+#ifndef LATINIME_PT_NODE_PARAMS_H |
+#define LATINIME_PT_NODE_PARAMS_H |
+ |
+#include <cstring> |
+ |
+#include "third_party/prediction/defines.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_utils.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/patricia_trie_reading_utils.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h" |
+#include "third_party/prediction/utils/char_utils.h" |
+ |
+namespace latinime { |
+ |
+// This class has information of a PtNode. This class is immutable. |
+class PtNodeParams { |
+ public: |
+ // Invalid PtNode. |
+ PtNodeParams() |
+ : mHeadPos(NOT_A_DICT_POS), |
+ mFlags(0), |
+ mHasMovedFlag(false), |
+ mParentPos(NOT_A_DICT_POS), |
+ mCodePointCount(0), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(NOT_A_DICT_POS), |
+ mTerminalId(Ver4DictConstants::NOT_A_TERMINAL_ID), |
+ mProbabilityFieldPos(NOT_A_DICT_POS), |
+ mProbability(NOT_A_PROBABILITY), |
+ mChildrenPosFieldPos(NOT_A_DICT_POS), |
+ mChildrenPos(NOT_A_DICT_POS), |
+ mBigramLinkedNodePos(NOT_A_DICT_POS), |
+ mShortcutPos(NOT_A_DICT_POS), |
+ mBigramPos(NOT_A_DICT_POS), |
+ mSiblingPos(NOT_A_DICT_POS) {} |
+ |
+ PtNodeParams(const PtNodeParams& ptNodeParams) |
+ : mHeadPos(ptNodeParams.mHeadPos), |
+ mFlags(ptNodeParams.mFlags), |
+ mHasMovedFlag(ptNodeParams.mHasMovedFlag), |
+ mParentPos(ptNodeParams.mParentPos), |
+ mCodePointCount(ptNodeParams.mCodePointCount), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(ptNodeParams.mTerminalIdFieldPos), |
+ mTerminalId(ptNodeParams.mTerminalId), |
+ mProbabilityFieldPos(ptNodeParams.mProbabilityFieldPos), |
+ mProbability(ptNodeParams.mProbability), |
+ mChildrenPosFieldPos(ptNodeParams.mChildrenPosFieldPos), |
+ mChildrenPos(ptNodeParams.mChildrenPos), |
+ mBigramLinkedNodePos(ptNodeParams.mBigramLinkedNodePos), |
+ mShortcutPos(ptNodeParams.mShortcutPos), |
+ mBigramPos(ptNodeParams.mBigramPos), |
+ mSiblingPos(ptNodeParams.mSiblingPos) { |
+ memcpy(mCodePoints, ptNodeParams.getCodePoints(), |
+ sizeof(int) * mCodePointCount); |
+ } |
+ |
+ // PtNode read from version 2 dictionary. |
+ PtNodeParams(const int headPos, |
+ const PatriciaTrieReadingUtils::NodeFlags flags, |
+ const int codePointCount, |
+ const int* const codePoints, |
+ const int probability, |
+ const int childrenPos, |
+ const int shortcutPos, |
+ const int bigramPos, |
+ const int siblingPos) |
+ : mHeadPos(headPos), |
+ mFlags(flags), |
+ mHasMovedFlag(false), |
+ mParentPos(NOT_A_DICT_POS), |
+ mCodePointCount(codePointCount), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(NOT_A_DICT_POS), |
+ mTerminalId(Ver4DictConstants::NOT_A_TERMINAL_ID), |
+ mProbabilityFieldPos(NOT_A_DICT_POS), |
+ mProbability(probability), |
+ mChildrenPosFieldPos(NOT_A_DICT_POS), |
+ mChildrenPos(childrenPos), |
+ mBigramLinkedNodePos(NOT_A_DICT_POS), |
+ mShortcutPos(shortcutPos), |
+ mBigramPos(bigramPos), |
+ mSiblingPos(siblingPos) { |
+ memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); |
+ } |
+ |
+ // PtNode with a terminal id. |
+ PtNodeParams(const int headPos, |
+ const PatriciaTrieReadingUtils::NodeFlags flags, |
+ const int parentPos, |
+ const int codePointCount, |
+ const int* const codePoints, |
+ const int terminalIdFieldPos, |
+ const int terminalId, |
+ const int probability, |
+ const int childrenPosFieldPos, |
+ const int childrenPos, |
+ const int siblingPos) |
+ : mHeadPos(headPos), |
+ mFlags(flags), |
+ mHasMovedFlag(true), |
+ mParentPos(parentPos), |
+ mCodePointCount(codePointCount), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(terminalIdFieldPos), |
+ mTerminalId(terminalId), |
+ mProbabilityFieldPos(NOT_A_DICT_POS), |
+ mProbability(probability), |
+ mChildrenPosFieldPos(childrenPosFieldPos), |
+ mChildrenPos(childrenPos), |
+ mBigramLinkedNodePos(NOT_A_DICT_POS), |
+ mShortcutPos(terminalId), |
+ mBigramPos(terminalId), |
+ mSiblingPos(siblingPos) { |
+ memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); |
+ } |
+ |
+ // Construct new params by updating existing PtNode params. |
+ PtNodeParams(const PtNodeParams* const ptNodeParams, |
+ const PatriciaTrieReadingUtils::NodeFlags flags, |
+ const int parentPos, |
+ const int codePointCount, |
+ const int* const codePoints, |
+ const int probability) |
+ : mHeadPos(ptNodeParams->getHeadPos()), |
+ mFlags(flags), |
+ mHasMovedFlag(true), |
+ mParentPos(parentPos), |
+ mCodePointCount(codePointCount), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(ptNodeParams->getTerminalIdFieldPos()), |
+ mTerminalId(ptNodeParams->getTerminalId()), |
+ mProbabilityFieldPos(ptNodeParams->getProbabilityFieldPos()), |
+ mProbability(probability), |
+ mChildrenPosFieldPos(ptNodeParams->getChildrenPosFieldPos()), |
+ mChildrenPos(ptNodeParams->getChildrenPos()), |
+ mBigramLinkedNodePos(ptNodeParams->getBigramLinkedNodePos()), |
+ mShortcutPos(ptNodeParams->getShortcutPos()), |
+ mBigramPos(ptNodeParams->getBigramsPos()), |
+ mSiblingPos(ptNodeParams->getSiblingNodePos()) { |
+ memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); |
+ } |
+ |
+ PtNodeParams(const PatriciaTrieReadingUtils::NodeFlags flags, |
+ const int parentPos, |
+ const int codePointCount, |
+ const int* const codePoints, |
+ const int probability) |
+ : mHeadPos(NOT_A_DICT_POS), |
+ mFlags(flags), |
+ mHasMovedFlag(true), |
+ mParentPos(parentPos), |
+ mCodePointCount(codePointCount), |
+ mCodePoints(), |
+ mTerminalIdFieldPos(NOT_A_DICT_POS), |
+ mTerminalId(Ver4DictConstants::NOT_A_TERMINAL_ID), |
+ mProbabilityFieldPos(NOT_A_DICT_POS), |
+ mProbability(probability), |
+ mChildrenPosFieldPos(NOT_A_DICT_POS), |
+ mChildrenPos(NOT_A_DICT_POS), |
+ mBigramLinkedNodePos(NOT_A_DICT_POS), |
+ mShortcutPos(NOT_A_DICT_POS), |
+ mBigramPos(NOT_A_DICT_POS), |
+ mSiblingPos(NOT_A_DICT_POS) { |
+ memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); |
+ } |
+ |
+ AK_FORCE_INLINE bool isValid() const { return mCodePointCount > 0; } |
+ |
+ // Head position of the PtNode |
+ AK_FORCE_INLINE int getHeadPos() const { return mHeadPos; } |
+ |
+ // Flags |
+ AK_FORCE_INLINE bool isDeleted() const { |
+ return mHasMovedFlag && DynamicPtReadingUtils::isDeleted(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool willBecomeNonTerminal() const { |
+ return mHasMovedFlag && |
+ DynamicPtReadingUtils::willBecomeNonTerminal(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool hasChildren() const { |
+ return mChildrenPos != NOT_A_DICT_POS; |
+ } |
+ |
+ AK_FORCE_INLINE bool isTerminal() const { |
+ return PatriciaTrieReadingUtils::isTerminal(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool isBlacklisted() const { |
+ return PatriciaTrieReadingUtils::isBlacklisted(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool isNotAWord() const { |
+ return PatriciaTrieReadingUtils::isNotAWord(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool hasBigrams() const { |
+ return PatriciaTrieReadingUtils::hasBigrams(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool hasShortcutTargets() const { |
+ return PatriciaTrieReadingUtils::hasShortcutTargets(mFlags); |
+ } |
+ |
+ AK_FORCE_INLINE bool representsNonWordInfo() const { |
+ return getCodePointCount() > 0 && |
+ !CharUtils::isInUnicodeSpace(getCodePoints()[0]) && isNotAWord(); |
+ } |
+ |
+ AK_FORCE_INLINE int representsBeginningOfSentence() const { |
+ return getCodePointCount() > 0 && |
+ getCodePoints()[0] == CODE_POINT_BEGINNING_OF_SENTENCE && |
+ isNotAWord(); |
+ } |
+ |
+ // Parent node position |
+ AK_FORCE_INLINE int getParentPos() const { return mParentPos; } |
+ |
+ // Number of code points |
+ AK_FORCE_INLINE uint8_t getCodePointCount() const { return mCodePointCount; } |
+ |
+ AK_FORCE_INLINE const int* getCodePoints() const { return mCodePoints; } |
+ |
+ // Probability |
+ AK_FORCE_INLINE int getTerminalIdFieldPos() const { |
+ return mTerminalIdFieldPos; |
+ } |
+ |
+ AK_FORCE_INLINE int getTerminalId() const { return mTerminalId; } |
+ |
+ // Probability |
+ AK_FORCE_INLINE int getProbabilityFieldPos() const { |
+ return mProbabilityFieldPos; |
+ } |
+ |
+ AK_FORCE_INLINE int getProbability() const { return mProbability; } |
+ |
+ // Children PtNode array position |
+ AK_FORCE_INLINE int getChildrenPosFieldPos() const { |
+ return mChildrenPosFieldPos; |
+ } |
+ |
+ AK_FORCE_INLINE int getChildrenPos() const { return mChildrenPos; } |
+ |
+ // Bigram linked node position. |
+ AK_FORCE_INLINE int getBigramLinkedNodePos() const { |
+ return mBigramLinkedNodePos; |
+ } |
+ |
+ // Shortcutlist position |
+ AK_FORCE_INLINE int getShortcutPos() const { return mShortcutPos; } |
+ |
+ // Bigrams position |
+ AK_FORCE_INLINE int getBigramsPos() const { return mBigramPos; } |
+ |
+ // Sibling node position |
+ AK_FORCE_INLINE int getSiblingNodePos() const { return mSiblingPos; } |
+ |
+ private: |
+ // This class have a public copy constructor to be used as a return value. |
+ DISALLOW_ASSIGNMENT_OPERATOR(PtNodeParams); |
+ |
+ const int mHeadPos; |
+ const PatriciaTrieReadingUtils::NodeFlags mFlags; |
+ const bool mHasMovedFlag; |
+ const int mParentPos; |
+ const uint8_t mCodePointCount; |
+ int mCodePoints[MAX_WORD_LENGTH]; |
+ const int mTerminalIdFieldPos; |
+ const int mTerminalId; |
+ const int mProbabilityFieldPos; |
+ const int mProbability; |
+ const int mChildrenPosFieldPos; |
+ const int mChildrenPos; |
+ const int mBigramLinkedNodePos; |
+ const int mShortcutPos; |
+ const int mBigramPos; |
+ const int mSiblingPos; |
+}; |
+} // namespace latinime |
+#endif /* LATINIME_PT_NODE_PARAMS_H */ |