ver4_dict_buffers.h revision 08894842662eff666a713a7f4deb79204a322f8c
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 LanguageModelDictContent *getMutableLanguageModelDictContent() {
94        return &mLanguageModelDictContent;
95    }
96
97    AK_FORCE_INLINE const LanguageModelDictContent *getLanguageModelDictContent() const {
98        return &mLanguageModelDictContent;
99    }
100
101    AK_FORCE_INLINE BigramDictContent *getMutableBigramDictContent() {
102        return &mBigramDictContent;
103    }
104
105    AK_FORCE_INLINE const BigramDictContent *getBigramDictContent() const {
106        return &mBigramDictContent;
107    }
108
109    AK_FORCE_INLINE ShortcutDictContent *getMutableShortcutDictContent() {
110        return &mShortcutDictContent;
111    }
112
113    AK_FORCE_INLINE const ShortcutDictContent *getShortcutDictContent() const {
114        return &mShortcutDictContent;
115    }
116
117    AK_FORCE_INLINE bool isUpdatable() const {
118        return mIsUpdatable;
119    }
120
121    bool flush(const char *const dictDirPath) const {
122        return flushHeaderAndDictBuffers(dictDirPath, &mExpandableHeaderBuffer);
123    }
124
125    bool flushHeaderAndDictBuffers(const char *const dictDirPath,
126            const BufferWithExtendableBuffer *const headerBuffer) const;
127
128 private:
129    DISALLOW_COPY_AND_ASSIGN(Ver4DictBuffers);
130
131    Ver4DictBuffers(MmappedBuffer::MmappedBufferPtr &&headerBuffer,
132            MmappedBuffer::MmappedBufferPtr &&bodyBuffer,
133            const FormatUtils::FORMAT_VERSION formatVersion,
134            const std::vector<uint8_t *> &contentBuffers,
135            const std::vector<int> &contentBufferSizes);
136
137    Ver4DictBuffers(const HeaderPolicy *const headerPolicy, const int maxTrieSize);
138
139    bool flushDictBuffers(FILE *const file) const;
140
141    const MmappedBuffer::MmappedBufferPtr mHeaderBuffer;
142    const MmappedBuffer::MmappedBufferPtr mDictBuffer;
143    const HeaderPolicy mHeaderPolicy;
144    BufferWithExtendableBuffer mExpandableHeaderBuffer;
145    BufferWithExtendableBuffer mExpandableTrieBuffer;
146    TerminalPositionLookupTable mTerminalPositionLookupTable;
147    ProbabilityDictContent mProbabilityDictContent;
148    LanguageModelDictContent mLanguageModelDictContent;
149    BigramDictContent mBigramDictContent;
150    ShortcutDictContent mShortcutDictContent;
151    const int mIsUpdatable;
152};
153} // namespace latinime
154#endif /* LATINIME_VER4_DICT_BUFFER_H */
155