1 /*
2  * Copyright (C) 2014, 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_LANGUAGE_MODEL_DICT_CONTENT_GLOBAL_COUNTERS_H
18 #define LATINIME_LANGUAGE_MODEL_DICT_CONTENT_GLOBAL_COUNTERS_H
19 
20 #include <cstdio>
21 
22 #include "defines.h"
23 #include "dictionary/utils/buffer_with_extendable_buffer.h"
24 #include "dictionary/utils/dict_file_writing_utils.h"
25 #include "utils/byte_array_view.h"
26 
27 namespace latinime {
28 
29 class LanguageModelDictContentGlobalCounters {
30  public:
LanguageModelDictContentGlobalCounters(const ReadWriteByteArrayView buffer)31     explicit LanguageModelDictContentGlobalCounters(const ReadWriteByteArrayView buffer)
32             : mBuffer(buffer, 0 /* maxAdditionalBufferSize */),
33               mTotalCount(readValue(mBuffer, TOTAL_COUNT_INDEX)),
34               mMaxValueOfCounters(readValue(mBuffer, MAX_VALUE_OF_COUNTERS_INDEX)) {}
35 
LanguageModelDictContentGlobalCounters()36     LanguageModelDictContentGlobalCounters()
37             : mBuffer(0 /* maxAdditionalBufferSize */), mTotalCount(0), mMaxValueOfCounters(0) {}
38 
needsToHalveCounters()39     bool needsToHalveCounters() const {
40         return mMaxValueOfCounters >= COUNTER_VALUE_NEAR_LIMIT_THRESHOLD
41                 || mTotalCount >= TOTAL_COUNT_VALUE_NEAR_LIMIT_THRESHOLD;
42     }
43 
getTotalCount()44     int getTotalCount() const {
45         return mTotalCount;
46     }
47 
save(FILE * const file)48     bool save(FILE *const file) const {
49         BufferWithExtendableBuffer bufferToWrite(
50                 BufferWithExtendableBuffer::DEFAULT_MAX_ADDITIONAL_BUFFER_SIZE);
51         if (!bufferToWrite.writeUint(mTotalCount, COUNTER_SIZE_IN_BYTES,
52                 TOTAL_COUNT_INDEX * COUNTER_SIZE_IN_BYTES)) {
53             return false;
54         }
55         if (!bufferToWrite.writeUint(mMaxValueOfCounters, COUNTER_SIZE_IN_BYTES,
56                 MAX_VALUE_OF_COUNTERS_INDEX * COUNTER_SIZE_IN_BYTES)) {
57             return false;
58         }
59         return DictFileWritingUtils::writeBufferToFileTail(file, &bufferToWrite);
60     }
61 
incrementTotalCount()62     void incrementTotalCount() {
63         mTotalCount += 1;
64     }
65 
addToTotalCount(const int count)66     void addToTotalCount(const int count) {
67         mTotalCount += count;
68     }
69 
updateMaxValueOfCounters(const int count)70     void updateMaxValueOfCounters(const int count) {
71         mMaxValueOfCounters = std::max(count, mMaxValueOfCounters);
72     }
73 
halveCounters()74     void halveCounters() {
75         mMaxValueOfCounters /= 2;
76         mTotalCount /= 2;
77     }
78 
79 private:
80     DISALLOW_COPY_AND_ASSIGN(LanguageModelDictContentGlobalCounters);
81 
82     const static int COUNTER_VALUE_NEAR_LIMIT_THRESHOLD;
83     const static int TOTAL_COUNT_VALUE_NEAR_LIMIT_THRESHOLD;
84     const static int COUNTER_SIZE_IN_BYTES;
85     const static int TOTAL_COUNT_INDEX;
86     const static int MAX_VALUE_OF_COUNTERS_INDEX;
87 
88     BufferWithExtendableBuffer mBuffer;
89     int mTotalCount;
90     int mMaxValueOfCounters;
91 
readValue(const BufferWithExtendableBuffer & buffer,const int index)92     static int readValue(const BufferWithExtendableBuffer &buffer, const int index) {
93         const int pos = COUNTER_SIZE_IN_BYTES * index;
94         if (pos + COUNTER_SIZE_IN_BYTES > buffer.getTailPosition()) {
95             return 0;
96         }
97         return buffer.readUint(COUNTER_SIZE_IN_BYTES, pos);
98     }
99 };
100 } // namespace latinime
101 #endif /* LATINIME_LANGUAGE_MODEL_DICT_CONTENT_GLOBAL_COUNTERS_H */
102