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