Index: third_party/android_prediction/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h |
diff --git a/third_party/android_prediction/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..68fc496f4a8dab105db5e5162469f72d82b2dd66 |
--- /dev/null |
+++ b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h |
@@ -0,0 +1,131 @@ |
+/* |
+ * 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_PROBABILITY_ENTRY_H |
+#define LATINIME_PROBABILITY_ENTRY_H |
+ |
+#include <climits> |
+#include <cstdint> |
+ |
+#include "third_party/android_prediction/defines.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/utils/historical_info.h" |
+ |
+namespace latinime { |
+ |
+class ProbabilityEntry { |
+ public: |
+ ProbabilityEntry(const ProbabilityEntry &probabilityEntry) |
+ : mFlags(probabilityEntry.mFlags), mProbability(probabilityEntry.mProbability), |
+ mHistoricalInfo(probabilityEntry.mHistoricalInfo) {} |
+ |
+ // Dummy entry |
+ ProbabilityEntry() |
+ : mFlags(0), mProbability(NOT_A_PROBABILITY), mHistoricalInfo() {} |
+ |
+ // Entry without historical information |
+ ProbabilityEntry(const int flags, const int probability) |
+ : mFlags(flags), mProbability(probability), mHistoricalInfo() {} |
+ |
+ // Entry with historical information. |
+ ProbabilityEntry(const int flags, const int probability, |
+ const HistoricalInfo *const historicalInfo) |
+ : mFlags(flags), mProbability(probability), mHistoricalInfo(*historicalInfo) {} |
+ |
+ const ProbabilityEntry createEntryWithUpdatedProbability(const int probability) const { |
+ return ProbabilityEntry(mFlags, probability, &mHistoricalInfo); |
+ } |
+ |
+ const ProbabilityEntry createEntryWithUpdatedHistoricalInfo( |
+ const HistoricalInfo *const historicalInfo) const { |
+ return ProbabilityEntry(mFlags, mProbability, historicalInfo); |
+ } |
+ |
+ bool hasHistoricalInfo() const { |
+ return mHistoricalInfo.isValid(); |
+ } |
+ |
+ int getFlags() const { |
+ return mFlags; |
+ } |
+ |
+ int getProbability() const { |
+ return mProbability; |
+ } |
+ |
+ const HistoricalInfo *getHistoricalInfo() const { |
+ return &mHistoricalInfo; |
+ } |
+ |
+ uint64_t encode(const bool hasHistoricalInfo) const { |
+ uint64_t encodedEntry = static_cast<uint64_t>(mFlags); |
+ if (hasHistoricalInfo) { |
+ encodedEntry = (encodedEntry << (Ver4DictConstants::TIME_STAMP_FIELD_SIZE * CHAR_BIT)) |
+ ^ static_cast<uint64_t>(mHistoricalInfo.getTimeStamp()); |
+ encodedEntry = (encodedEntry << (Ver4DictConstants::WORD_LEVEL_FIELD_SIZE * CHAR_BIT)) |
+ ^ static_cast<uint64_t>(mHistoricalInfo.getLevel()); |
+ encodedEntry = (encodedEntry << (Ver4DictConstants::WORD_COUNT_FIELD_SIZE * CHAR_BIT)) |
+ ^ static_cast<uint64_t>(mHistoricalInfo.getCount()); |
+ } else { |
+ encodedEntry = (encodedEntry << (Ver4DictConstants::PROBABILITY_SIZE * CHAR_BIT)) |
+ ^ static_cast<uint64_t>(mProbability); |
+ } |
+ return encodedEntry; |
+ } |
+ |
+ static ProbabilityEntry decode(const uint64_t encodedEntry, const bool hasHistoricalInfo) { |
+ if (hasHistoricalInfo) { |
+ const int flags = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE, |
+ Ver4DictConstants::TIME_STAMP_FIELD_SIZE |
+ + Ver4DictConstants::WORD_LEVEL_FIELD_SIZE |
+ + Ver4DictConstants::WORD_COUNT_FIELD_SIZE); |
+ const int timestamp = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::TIME_STAMP_FIELD_SIZE, |
+ Ver4DictConstants::WORD_LEVEL_FIELD_SIZE |
+ + Ver4DictConstants::WORD_COUNT_FIELD_SIZE); |
+ const int level = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::WORD_LEVEL_FIELD_SIZE, |
+ Ver4DictConstants::WORD_COUNT_FIELD_SIZE); |
+ const int count = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::WORD_COUNT_FIELD_SIZE, 0 /* pos */); |
+ const HistoricalInfo historicalInfo(timestamp, level, count); |
+ return ProbabilityEntry(flags, NOT_A_PROBABILITY, &historicalInfo); |
+ } else { |
+ const int flags = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE, |
+ Ver4DictConstants::PROBABILITY_SIZE); |
+ const int probability = readFromEncodedEntry(encodedEntry, |
+ Ver4DictConstants::PROBABILITY_SIZE, 0 /* pos */); |
+ return ProbabilityEntry(flags, probability); |
+ } |
+ } |
+ |
+ private: |
+ // Copy constructor is public to use this class as a type of return value. |
+ DISALLOW_ASSIGNMENT_OPERATOR(ProbabilityEntry); |
+ |
+ const int mFlags; |
+ const int mProbability; |
+ const HistoricalInfo mHistoricalInfo; |
+ |
+ static int readFromEncodedEntry(const uint64_t encodedEntry, const int size, const int pos) { |
+ return static_cast<int>( |
+ (encodedEntry >> (pos * CHAR_BIT)) & ((1ull << (size * CHAR_BIT)) - 1)); |
+ } |
+}; |
+} // namespace latinime |
+#endif /* LATINIME_PROBABILITY_ENTRY_H */ |