header_policy.h revision c18510049a3422c88ed3ab3bbc64944c94a611fd
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
28namespace latinime {
29
30class 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              mUnigramCount(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap,
44                      UNIGRAM_COUNT_KEY, 0 /* defaultValue */)),
45              mBigramCount(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap,
46                      BIGRAM_COUNT_KEY, 0 /* defaultValue */)),
47              mExtendedRegionSize(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap,
48                      EXTENDED_REGION_SIZE_KEY, 0 /* defaultValue */)) {}
49
50    // Constructs header information using an attribute map.
51    HeaderPolicy(const FormatUtils::FORMAT_VERSION dictFormatVersion,
52            const HeaderReadWriteUtils::AttributeMap *const attributeMap)
53            : mDictFormatVersion(dictFormatVersion),
54              mDictionaryFlags(HeaderReadWriteUtils::createAndGetDictionaryFlagsUsingAttributeMap(
55                      attributeMap)), mSize(0), mAttributeMap(*attributeMap),
56              mMultiWordCostMultiplier(readMultipleWordCostMultiplier()),
57              mIsDecayingDict(HeaderReadWriteUtils::readBoolAttributeValue(&mAttributeMap,
58                      IS_DECAYING_DICT_KEY, false /* defaultValue */)),
59              mLastUpdatedTime(HeaderReadWriteUtils::readIntAttributeValue(&mAttributeMap,
60                      LAST_UPDATED_TIME_KEY, time(0) /* defaultValue */)),
61              mUnigramCount(0), mBigramCount(0), mExtendedRegionSize(0) {}
62
63    ~HeaderPolicy() {}
64
65    AK_FORCE_INLINE int getSize() const {
66        return mSize;
67    }
68
69    AK_FORCE_INLINE bool supportsDynamicUpdate() const {
70        return HeaderReadWriteUtils::supportsDynamicUpdate(mDictionaryFlags);
71    }
72
73    AK_FORCE_INLINE bool requiresGermanUmlautProcessing() const {
74        return HeaderReadWriteUtils::requiresGermanUmlautProcessing(mDictionaryFlags);
75    }
76
77    AK_FORCE_INLINE bool requiresFrenchLigatureProcessing() const {
78        return HeaderReadWriteUtils::requiresFrenchLigatureProcessing(mDictionaryFlags);
79    }
80
81    AK_FORCE_INLINE float getMultiWordCostMultiplier() const {
82        return mMultiWordCostMultiplier;
83    }
84
85    AK_FORCE_INLINE bool isDecayingDict() const {
86        return mIsDecayingDict;
87    }
88
89    AK_FORCE_INLINE int getLastUpdatedTime() const {
90        return mLastUpdatedTime;
91    }
92
93    AK_FORCE_INLINE int getUnigramCount() const {
94        return mUnigramCount;
95    }
96
97    AK_FORCE_INLINE int getBigramCount() const {
98        return mBigramCount;
99    }
100
101    AK_FORCE_INLINE int getExtendedRegionSize() const {
102        return mExtendedRegionSize;
103    }
104
105    void readHeaderValueOrQuestionMark(const char *const key,
106            int *outValue, int outValueSize) const;
107
108    bool writeHeaderToBuffer(BufferWithExtendableBuffer *const bufferToWrite,
109            const bool updatesLastUpdatedTime, const int unigramCount,
110            const int bigramCount, const int extendedRegionSize) const;
111
112 private:
113    DISALLOW_IMPLICIT_CONSTRUCTORS(HeaderPolicy);
114
115    static const char *const MULTIPLE_WORDS_DEMOTION_RATE_KEY;
116    static const char *const IS_DECAYING_DICT_KEY;
117    static const char *const LAST_UPDATED_TIME_KEY;
118    static const char *const UNIGRAM_COUNT_KEY;
119    static const char *const BIGRAM_COUNT_KEY;
120    static const char *const EXTENDED_REGION_SIZE_KEY;
121    static const int DEFAULT_MULTIPLE_WORDS_DEMOTION_RATE;
122    static const float MULTIPLE_WORD_COST_MULTIPLIER_SCALE;
123
124    const FormatUtils::FORMAT_VERSION mDictFormatVersion;
125    const HeaderReadWriteUtils::DictionaryFlags mDictionaryFlags;
126    const int mSize;
127    HeaderReadWriteUtils::AttributeMap mAttributeMap;
128    const float mMultiWordCostMultiplier;
129    const bool mIsDecayingDict;
130    const int mLastUpdatedTime;
131    const int mUnigramCount;
132    const int mBigramCount;
133    const int mExtendedRegionSize;
134
135    float readMultipleWordCostMultiplier() const;
136
137    static HeaderReadWriteUtils::AttributeMap createAttributeMapAndReadAllAttributes(
138            const uint8_t *const dictBuf);
139};
140} // namespace latinime
141#endif /* LATINIME_HEADER_POLICY_H */
142