Home | History | Annotate | Download | only in header
      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