ver4_dict_buffers.h revision dc3856d7589aa3cf3dcfdee8360fa48a85983273
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_VER4_DICT_BUFFER_H
18#define LATINIME_VER4_DICT_BUFFER_H
19
20#include <cstdio>
21#include <memory>
22
23#include "defines.h"
24#include "suggest/policyimpl/dictionary/header/header_policy.h"
25#include "suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.h"
26#include "suggest/policyimpl/dictionary/structure/v4/content/language_model_dict_content.h"
27#include "suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h"
28#include "suggest/policyimpl/dictionary/structure/v4/content/shortcut_dict_content.h"
29#include "suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.h"
30#include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h"
31#include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h"
32#include "suggest/policyimpl/dictionary/utils/mmapped_buffer.h"
33
34namespace latinime {
35
36class Ver4DictBuffers {
37 public:
38    typedef std::unique_ptr<Ver4DictBuffers> Ver4DictBuffersPtr;
39
40    static Ver4DictBuffersPtr openVer4DictBuffers(const char *const dictDirPath,
41            MmappedBuffer::MmappedBufferPtr &&headerBuffer,
42            const FormatUtils::FORMAT_VERSION formatVersion);
43
44    static AK_FORCE_INLINE Ver4DictBuffersPtr createVer4DictBuffers(
45            const HeaderPolicy *const headerPolicy, const int maxTrieSize) {
46        return Ver4DictBuffersPtr(new Ver4DictBuffers(headerPolicy, maxTrieSize));
47    }
48
49    AK_FORCE_INLINE bool isValid() const {
50        return mHeaderBuffer && mDictBuffer && mHeaderPolicy.isValid();
51    }
52
53    AK_FORCE_INLINE bool isNearSizeLimit() const {
54        return mExpandableTrieBuffer.isNearSizeLimit()
55                || mTerminalPositionLookupTable.isNearSizeLimit()
56                || mProbabilityDictContent.isNearSizeLimit()
57                || mBigramDictContent.isNearSizeLimit()
58                || mShortcutDictContent.isNearSizeLimit();
59    }
60
61    AK_FORCE_INLINE const HeaderPolicy *getHeaderPolicy() const {
62        return &mHeaderPolicy;
63    }
64
65    AK_FORCE_INLINE BufferWithExtendableBuffer *getWritableHeaderBuffer() {
66        return &mExpandableHeaderBuffer;
67    }
68
69    AK_FORCE_INLINE BufferWithExtendableBuffer *getWritableTrieBuffer() {
70        return &mExpandableTrieBuffer;
71    }
72
73    AK_FORCE_INLINE const BufferWithExtendableBuffer *getTrieBuffer() const {
74        return &mExpandableTrieBuffer;
75    }
76
77    AK_FORCE_INLINE TerminalPositionLookupTable *getMutableTerminalPositionLookupTable() {
78        return &mTerminalPositionLookupTable;
79    }
80
81    AK_FORCE_INLINE const TerminalPositionLookupTable *getTerminalPositionLookupTable() const {
82        return &mTerminalPositionLookupTable;
83    }
84
85    AK_FORCE_INLINE ProbabilityDictContent *getMutableProbabilityDictContent() {
86        return &mProbabilityDictContent;
87    }
88
89    AK_FORCE_INLINE const ProbabilityDictContent *getProbabilityDictContent() const {
90        return &mProbabilityDictContent;
91    }
92
93    AK_FORCE_INLINE BigramDictContent *getMutableBigramDictContent() {
94        return &mBigramDictContent;
95    }
96
97    AK_FORCE_INLINE const BigramDictContent *getBigramDictContent() const {
98        return &mBigramDictContent;
99    }
100
101    AK_FORCE_INLINE ShortcutDictContent *getMutableShortcutDictContent() {
102        return &mShortcutDictContent;
103    }
104
105    AK_FORCE_INLINE const ShortcutDictContent *getShortcutDictContent() const {
106        return &mShortcutDictContent;
107    }
108
109    AK_FORCE_INLINE bool isUpdatable() const {
110        return mIsUpdatable;
111    }
112
113    bool flush(const char *const dictDirPath) const {
114        return flushHeaderAndDictBuffers(dictDirPath, &mExpandableHeaderBuffer);
115    }
116
117    bool flushHeaderAndDictBuffers(const char *const dictDirPath,
118            const BufferWithExtendableBuffer *const headerBuffer) const;
119
120 private:
121    DISALLOW_COPY_AND_ASSIGN(Ver4DictBuffers);
122
123    Ver4DictBuffers(MmappedBuffer::MmappedBufferPtr &&headerBuffer,
124            MmappedBuffer::MmappedBufferPtr &&bodyBuffer,
125            const FormatUtils::FORMAT_VERSION formatVersion,
126            const std::vector<uint8_t *> &contentBuffers,
127            const std::vector<int> &contentBufferSizes);
128
129    Ver4DictBuffers(const HeaderPolicy *const headerPolicy, const int maxTrieSize);
130
131    bool flushDictBuffers(FILE *const file) const;
132
133    const MmappedBuffer::MmappedBufferPtr mHeaderBuffer;
134    const MmappedBuffer::MmappedBufferPtr mDictBuffer;
135    const HeaderPolicy mHeaderPolicy;
136    BufferWithExtendableBuffer mExpandableHeaderBuffer;
137    BufferWithExtendableBuffer mExpandableTrieBuffer;
138    TerminalPositionLookupTable mTerminalPositionLookupTable;
139    ProbabilityDictContent mProbabilityDictContent;
140    LanguageModelDictContent mLanguageModelDictContent;
141    BigramDictContent mBigramDictContent;
142    ShortcutDictContent mShortcutDictContent;
143    const int mIsUpdatable;
144};
145} // namespace latinime
146#endif /* LATINIME_VER4_DICT_BUFFER_H */
147