1 /* 2 * Copyright (C) 2013, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef LATINIME_HEADER_POLICY_H 18 #define LATINIME_HEADER_POLICY_H 19 20 #include <ctime> 21 #include <stdint.h> 22 23 #include "defines.h" 24 #include "suggest/core/policy/dictionary_header_structure_policy.h" 25 #include "suggest/policyimpl/dictionary/header/header_read_write_utils.h" 26 #include "suggest/policyimpl/dictionary/utils/format_utils.h" 27 28 namespace latinime { 29 30 class HeaderPolicy : public DictionaryHeaderStructurePolicy { 31 public: 32 // Reads information from existing dictionary buffer. 33 HeaderPolicy(const uint8_t *const dictBuf, const int dictSize) 34 : mDictFormatVersion(FormatUtils::detectFormatVersion(dictBuf, dictSize)), 35 mDictionaryFlags(HeaderReadWriteUtils::getFlags(dictBuf)), 36 mSize(HeaderReadWriteUtils::getHeaderSize(dictBuf)), 37 mAttributeMap(createAttributeMapAndReadAllAttributes(dictBuf)), 38 mMultiWordCostMultiplier(readMultipleWordCostMultiplier()), 39 mIsDecayingDict(HeaderReadWriteUtils::readBoolAttributeValue(&mAttributeMap, 40 IS_DECAYING_DICT_KEY, false /* defaultValue */)), 41 mLastUpdatedTime(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 42 LAST_UPDATED_TIME_KEY, time(0) /* defaultValue */)), 43 mLastDecayedTime(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 44 LAST_DECAYED_TIME_KEY, time(0) /* defaultValue */)), 45 mUnigramCount(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 46 UNIGRAM_COUNT_KEY, 0 /* defaultValue */)), 47 mBigramCount(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 48 BIGRAM_COUNT_KEY, 0 /* defaultValue */)), 49 mExtendedRegionSize(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 50 EXTENDED_REGION_SIZE_KEY, 0 /* defaultValue */)) {} 51 52 // Constructs header information using an attribute map. 53 HeaderPolicy(const FormatUtils::FORMAT_VERSION dictFormatVersion, 54 const HeaderReadWriteUtils::AttributeMap *const attributeMap) 55 : mDictFormatVersion(dictFormatVersion), 56 mDictionaryFlags(HeaderReadWriteUtils::createAndGetDictionaryFlagsUsingAttributeMap( 57 attributeMap)), mSize(0), mAttributeMap(*attributeMap), 58 mMultiWordCostMultiplier(readMultipleWordCostMultiplier()), 59 mIsDecayingDict(HeaderReadWriteUtils::readBoolAttributeValue(&mAttributeMap, 60 IS_DECAYING_DICT_KEY, false /* defaultValue */)), 61 mLastUpdatedTime(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 62 LAST_UPDATED_TIME_KEY, time(0) /* defaultValue */)), 63 mLastDecayedTime(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap, 64 LAST_UPDATED_TIME_KEY, time(0) /* defaultValue */)), 65 mUnigramCount(0), mBigramCount(0), mExtendedRegionSize(0) {} 66 67 ~HeaderPolicy() {} 68 69 AK_FORCE_INLINE int getSize() const { 70 return mSize; 71 } 72 73 AK_FORCE_INLINE bool supportsDynamicUpdate() const { 74 return HeaderReadWriteUtils::supportsDynamicUpdate(mDictionaryFlags); 75 } 76 77 AK_FORCE_INLINE bool requiresGermanUmlautProcessing() const { 78 return HeaderReadWriteUtils::requiresGermanUmlautProcessing(mDictionaryFlags); 79 } 80 81 AK_FORCE_INLINE bool requiresFrenchLigatureProcessing() const { 82 return HeaderReadWriteUtils::requiresFrenchLigatureProcessing(mDictionaryFlags); 83 } 84 85 AK_FORCE_INLINE float getMultiWordCostMultiplier() const { 86 return mMultiWordCostMultiplier; 87 } 88 89 AK_FORCE_INLINE bool isDecayingDict() const { 90 return mIsDecayingDict; 91 } 92 93 AK_FORCE_INLINE int getLastUpdatedTime() const { 94 return mLastUpdatedTime; 95 } 96 97 AK_FORCE_INLINE int getLastDecayedTime() const { 98 return mLastDecayedTime; 99 } 100 101 AK_FORCE_INLINE int getUnigramCount() const { 102 return mUnigramCount; 103 } 104 105 AK_FORCE_INLINE int getBigramCount() const { 106 return mBigramCount; 107 } 108 109 AK_FORCE_INLINE int getExtendedRegionSize() const { 110 return mExtendedRegionSize; 111 } 112 113 void readHeaderValueOrQuestionMark(const char *const key, 114 int *outValue, int outValueSize) const; 115 116 bool writeHeaderToBuffer(BufferWithExtendableBuffer *const bufferToWrite, 117 const bool updatesLastUpdatedTime, const bool updatesLastDecayedTime, 118 const int unigramCount, const int bigramCount, const int extendedRegionSize) const; 119 120 private: 121 DISALLOW_IMPLICIT_CONSTRUCTORS(HeaderPolicy); 122 123 static const char *const MULTIPLE_WORDS_DEMOTION_RATE_KEY; 124 static const char *const IS_DECAYING_DICT_KEY; 125 static const char *const LAST_UPDATED_TIME_KEY; 126 static const char *const LAST_DECAYED_TIME_KEY; 127 static const char *const UNIGRAM_COUNT_KEY; 128 static const char *const BIGRAM_COUNT_KEY; 129 static const char *const EXTENDED_REGION_SIZE_KEY; 130 static const int DEFAULT_MULTIPLE_WORDS_DEMOTION_RATE; 131 static const float MULTIPLE_WORD_COST_MULTIPLIER_SCALE; 132 133 const FormatUtils::FORMAT_VERSION mDictFormatVersion; 134 const HeaderReadWriteUtils::DictionaryFlags mDictionaryFlags; 135 const int mSize; 136 HeaderReadWriteUtils::AttributeMap mAttributeMap; 137 const float mMultiWordCostMultiplier; 138 const bool mIsDecayingDict; 139 const int mLastUpdatedTime; 140 const int mLastDecayedTime; 141 const int mUnigramCount; 142 const int mBigramCount; 143 const int mExtendedRegionSize; 144 145 float readMultipleWordCostMultiplier() const; 146 147 static HeaderReadWriteUtils::AttributeMap createAttributeMapAndReadAllAttributes( 148 const uint8_t *const dictBuf); 149 }; 150 } // namespace latinime 151 #endif /* LATINIME_HEADER_POLICY_H */ 152