Loading native/jni/src/suggest/policyimpl/dictionary/header/header_policy.h +2 −0 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ class HeaderPolicy : public DictionaryHeaderStructurePolicy { return FormatUtils::VERSION_4_ONLY_FOR_TESTING; case FormatUtils::VERSION_4: return FormatUtils::VERSION_4; case FormatUtils::VERSION_4_DEV: return FormatUtils::VERSION_4_DEV; default: return FormatUtils::UNKNOWN_VERSION; } Loading native/jni/src/suggest/policyimpl/dictionary/header/header_read_write_utils.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ typedef DictionaryHeaderStructurePolicy::AttributeMap AttributeMap; return false; case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: case FormatUtils::VERSION_4_DEV: return buffer->writeUintAndAdvancePosition(version /* data */, HEADER_DICTIONARY_VERSION_SIZE, writingPos); default: Loading native/jni/src/suggest/policyimpl/dictionary/structure/dictionary_structure_with_buffer_policy_factory.cpp +77 −40 Original line number Diff line number Diff line Loading @@ -19,6 +19,9 @@ #include <climits> #include "defines.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_constants.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_patricia_trie_policy.h" #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" #include "suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h" Loading @@ -42,7 +45,7 @@ namespace latinime { if (isUpdatable) { AKLOGE("One file dictionaries don't support updating. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } return newPolicyForFileDict(path, bufOffset, size); } Loading @@ -54,26 +57,43 @@ namespace latinime { const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { FormatUtils::FORMAT_VERSION dictFormatVersion = FormatUtils::getFormatVersion(formatVersion); switch (dictFormatVersion) { case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: { HeaderPolicy headerPolicy(dictFormatVersion, locale, attributeMap); Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers = Ver4DictBuffers::createVer4DictBuffers(&headerPolicy, Ver4DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); if (!DynamicPtWritingUtils::writeEmptyDictionary( dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) { AKLOGE("Empty ver4 dictionary structure cannot be created on memory."); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return newPolicyForOnMemoryV4Dict<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr, backward::v401::Ver4PatriciaTriePolicy>( dictFormatVersion, locale, attributeMap); } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new Ver4PatriciaTriePolicy(std::move(dictBuffers))); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: { return newPolicyForOnMemoryV4Dict<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( dictFormatVersion, locale, attributeMap); } default: AKLOGE("DICT: dictionary format %d is not supported for on memory dictionary", formatVersion); break; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr DictionaryStructureWithBufferPolicyFactory::newPolicyForOnMemoryV4Dict( const FormatUtils::FORMAT_VERSION formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { HeaderPolicy headerPolicy(formatVersion, locale, attributeMap); DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy, DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); if (!DynamicPtWritingUtils::writeEmptyDictionary( dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) { AKLOGE("Empty ver4 dictionary structure cannot be created on memory."); return nullptr; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new StructurePolicy(std::move(dictBuffers))); } /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr Loading @@ -84,10 +104,10 @@ namespace latinime { getHeaderFilePathInDictDir(path, headerFilePathBufSize, headerFilePath); // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of // MmappedBufferPtr if the instance has the responsibility. MmappedBuffer::MmappedBufferPtr mmappedBuffer( MmappedBuffer::openBuffer(headerFilePath, isUpdatable)); MmappedBuffer::MmappedBufferPtr mmappedBuffer = MmappedBuffer::openBuffer(headerFilePath, isUpdatable); if (!mmappedBuffer) { return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::detectFormatVersion( mmappedBuffer->getBuffer(), mmappedBuffer->getBufferSize()); Loading @@ -95,34 +115,50 @@ namespace latinime { case FormatUtils::VERSION_2: AKLOGE("Given path is a directory but the format is version 2. path: %s", path); break; case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: { return newPolicyForV4Dict<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr, backward::v401::Ver4PatriciaTriePolicy>( headerFilePath, formatVersion, std::move(mmappedBuffer)); } case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: { return newPolicyForV4Dict<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( headerFilePath, formatVersion, std::move(mmappedBuffer)); } default: AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); break; } ASSERT(false); return nullptr; } template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr DictionaryStructureWithBufferPolicyFactory::newPolicyForV4Dict( const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion, MmappedBuffer::MmappedBufferPtr &&mmappedBuffer) { const int dictDirPathBufSize = strlen(headerFilePath) + 1 /* terminator */; char dictPath[dictDirPathBufSize]; if (!FileUtils::getFilePathWithoutSuffix(headerFilePath, Ver4DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) { DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) { AKLOGE("Dictionary file name is not valid as a ver4 dictionary. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers( Ver4DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion)); DictBuffersPtr dictBuffers = DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion); if (!dictBuffers || !dictBuffers->isValid()) { AKLOGE("DICT: The dictionary doesn't satisfy ver4 format requirements. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new Ver4PatriciaTriePolicy(std::move(dictBuffers))); } default: AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); break; } ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); new StructurePolicy(std::move(dictBuffers))); } /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr Loading @@ -133,7 +169,7 @@ namespace latinime { MmappedBuffer::MmappedBufferPtr mmappedBuffer( MmappedBuffer::openBuffer(path, bufOffset, size, false /* isUpdatable */)); if (!mmappedBuffer) { return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } switch (FormatUtils::detectFormatVersion(mmappedBuffer->getBuffer(), mmappedBuffer->getBufferSize())) { Loading @@ -142,6 +178,7 @@ namespace latinime { new PatriciaTriePolicy(std::move(mmappedBuffer))); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: case FormatUtils::VERSION_4_DEV: AKLOGE("Given path is a file but the format is version 4. path: %s", path); break; default: Loading @@ -149,7 +186,7 @@ namespace latinime { break; } ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } /* static */ void DictionaryStructureWithBufferPolicyFactory::getHeaderFilePathInDictDir( Loading native/jni/src/suggest/policyimpl/dictionary/structure/dictionary_structure_with_buffer_policy_factory.h +14 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include "defines.h" #include "suggest/core/policy/dictionary_header_structure_policy.h" #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" #include "suggest/policyimpl/dictionary/utils/format_utils.h" #include "suggest/policyimpl/dictionary/utils/mmapped_buffer.h" namespace latinime { Loading @@ -32,16 +34,26 @@ class DictionaryStructureWithBufferPolicyFactory { const int size, const bool isUpdatable); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForOnMemoryDict(const int formatVersion, const std::vector<int> &locale, newPolicyForOnMemoryDict(const int formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap); private: DISALLOW_IMPLICIT_CONSTRUCTORS(DictionaryStructureWithBufferPolicyFactory); template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForOnMemoryV4Dict(const FormatUtils::FORMAT_VERSION formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForDirectoryDict(const char *const path, const bool isUpdatable); template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForV4Dict( const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion, MmappedBuffer::MmappedBufferPtr &&mmappedBuffer); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForFileDict(const char *const path, const int bufOffset, const int size); Loading native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <sys/types.h> #include "suggest/policyimpl/dictionary/header/header_policy.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" Loading @@ -40,10 +41,16 @@ const char *const DictFileWritingUtils::TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE = TimeKeeper::setCurrentTime(); const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::getFormatVersion(dictVersion); switch (formatVersion) { case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: return createEmptyV4DictFile(filePath, localeAsCodePointVector, attributeMap, formatVersion); return createEmptyV4DictFile<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr>( filePath, localeAsCodePointVector, attributeMap, formatVersion); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: return createEmptyV4DictFile<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr>( filePath, localeAsCodePointVector, attributeMap, formatVersion); default: AKLOGE("Cannot create dictionary %s because format version %d is not supported.", filePath, dictVersion); Loading @@ -51,14 +58,14 @@ const char *const DictFileWritingUtils::TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE = } } template<class DictConstants, class DictBuffers, class DictBuffersPtr> /* static */ bool DictFileWritingUtils::createEmptyV4DictFile(const char *const dirPath, const std::vector<int> localeAsCodePointVector, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap, const FormatUtils::FORMAT_VERSION formatVersion) { HeaderPolicy headerPolicy(formatVersion, localeAsCodePointVector, attributeMap); Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers( Ver4DictBuffers::createVer4DictBuffers(&headerPolicy, Ver4DictConstants::MAX_DICT_EXTENDED_REGION_SIZE)); DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy, DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); headerPolicy.fillInAndWriteHeaderToBuffer(true /* updatesLastDecayedTime */, 0 /* unigramCount */, 0 /* bigramCount */, 0 /* extendedRegionSize */, dictBuffers->getWritableHeaderBuffer()); Loading Loading
native/jni/src/suggest/policyimpl/dictionary/header/header_policy.h +2 −0 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ class HeaderPolicy : public DictionaryHeaderStructurePolicy { return FormatUtils::VERSION_4_ONLY_FOR_TESTING; case FormatUtils::VERSION_4: return FormatUtils::VERSION_4; case FormatUtils::VERSION_4_DEV: return FormatUtils::VERSION_4_DEV; default: return FormatUtils::UNKNOWN_VERSION; } Loading
native/jni/src/suggest/policyimpl/dictionary/header/header_read_write_utils.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ typedef DictionaryHeaderStructurePolicy::AttributeMap AttributeMap; return false; case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: case FormatUtils::VERSION_4_DEV: return buffer->writeUintAndAdvancePosition(version /* data */, HEADER_DICTIONARY_VERSION_SIZE, writingPos); default: Loading
native/jni/src/suggest/policyimpl/dictionary/structure/dictionary_structure_with_buffer_policy_factory.cpp +77 −40 Original line number Diff line number Diff line Loading @@ -19,6 +19,9 @@ #include <climits> #include "defines.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_constants.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_patricia_trie_policy.h" #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" #include "suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h" Loading @@ -42,7 +45,7 @@ namespace latinime { if (isUpdatable) { AKLOGE("One file dictionaries don't support updating. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } return newPolicyForFileDict(path, bufOffset, size); } Loading @@ -54,26 +57,43 @@ namespace latinime { const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { FormatUtils::FORMAT_VERSION dictFormatVersion = FormatUtils::getFormatVersion(formatVersion); switch (dictFormatVersion) { case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: { HeaderPolicy headerPolicy(dictFormatVersion, locale, attributeMap); Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers = Ver4DictBuffers::createVer4DictBuffers(&headerPolicy, Ver4DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); if (!DynamicPtWritingUtils::writeEmptyDictionary( dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) { AKLOGE("Empty ver4 dictionary structure cannot be created on memory."); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return newPolicyForOnMemoryV4Dict<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr, backward::v401::Ver4PatriciaTriePolicy>( dictFormatVersion, locale, attributeMap); } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new Ver4PatriciaTriePolicy(std::move(dictBuffers))); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: { return newPolicyForOnMemoryV4Dict<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( dictFormatVersion, locale, attributeMap); } default: AKLOGE("DICT: dictionary format %d is not supported for on memory dictionary", formatVersion); break; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr DictionaryStructureWithBufferPolicyFactory::newPolicyForOnMemoryV4Dict( const FormatUtils::FORMAT_VERSION formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { HeaderPolicy headerPolicy(formatVersion, locale, attributeMap); DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy, DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); if (!DynamicPtWritingUtils::writeEmptyDictionary( dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) { AKLOGE("Empty ver4 dictionary structure cannot be created on memory."); return nullptr; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new StructurePolicy(std::move(dictBuffers))); } /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr Loading @@ -84,10 +104,10 @@ namespace latinime { getHeaderFilePathInDictDir(path, headerFilePathBufSize, headerFilePath); // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of // MmappedBufferPtr if the instance has the responsibility. MmappedBuffer::MmappedBufferPtr mmappedBuffer( MmappedBuffer::openBuffer(headerFilePath, isUpdatable)); MmappedBuffer::MmappedBufferPtr mmappedBuffer = MmappedBuffer::openBuffer(headerFilePath, isUpdatable); if (!mmappedBuffer) { return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::detectFormatVersion( mmappedBuffer->getBuffer(), mmappedBuffer->getBufferSize()); Loading @@ -95,34 +115,50 @@ namespace latinime { case FormatUtils::VERSION_2: AKLOGE("Given path is a directory but the format is version 2. path: %s", path); break; case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: { return newPolicyForV4Dict<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr, backward::v401::Ver4PatriciaTriePolicy>( headerFilePath, formatVersion, std::move(mmappedBuffer)); } case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: { return newPolicyForV4Dict<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( headerFilePath, formatVersion, std::move(mmappedBuffer)); } default: AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); break; } ASSERT(false); return nullptr; } template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr DictionaryStructureWithBufferPolicyFactory::newPolicyForV4Dict( const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion, MmappedBuffer::MmappedBufferPtr &&mmappedBuffer) { const int dictDirPathBufSize = strlen(headerFilePath) + 1 /* terminator */; char dictPath[dictDirPathBufSize]; if (!FileUtils::getFilePathWithoutSuffix(headerFilePath, Ver4DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) { DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) { AKLOGE("Dictionary file name is not valid as a ver4 dictionary. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers( Ver4DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion)); DictBuffersPtr dictBuffers = DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion); if (!dictBuffers || !dictBuffers->isValid()) { AKLOGE("DICT: The dictionary doesn't satisfy ver4 format requirements. path: %s", path); ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( new Ver4PatriciaTriePolicy(std::move(dictBuffers))); } default: AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); break; } ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); new StructurePolicy(std::move(dictBuffers))); } /* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr Loading @@ -133,7 +169,7 @@ namespace latinime { MmappedBuffer::MmappedBufferPtr mmappedBuffer( MmappedBuffer::openBuffer(path, bufOffset, size, false /* isUpdatable */)); if (!mmappedBuffer) { return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } switch (FormatUtils::detectFormatVersion(mmappedBuffer->getBuffer(), mmappedBuffer->getBufferSize())) { Loading @@ -142,6 +178,7 @@ namespace latinime { new PatriciaTriePolicy(std::move(mmappedBuffer))); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: case FormatUtils::VERSION_4_DEV: AKLOGE("Given path is a file but the format is version 4. path: %s", path); break; default: Loading @@ -149,7 +186,7 @@ namespace latinime { break; } ASSERT(false); return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(nullptr); return nullptr; } /* static */ void DictionaryStructureWithBufferPolicyFactory::getHeaderFilePathInDictDir( Loading
native/jni/src/suggest/policyimpl/dictionary/structure/dictionary_structure_with_buffer_policy_factory.h +14 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include "defines.h" #include "suggest/core/policy/dictionary_header_structure_policy.h" #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" #include "suggest/policyimpl/dictionary/utils/format_utils.h" #include "suggest/policyimpl/dictionary/utils/mmapped_buffer.h" namespace latinime { Loading @@ -32,16 +34,26 @@ class DictionaryStructureWithBufferPolicyFactory { const int size, const bool isUpdatable); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForOnMemoryDict(const int formatVersion, const std::vector<int> &locale, newPolicyForOnMemoryDict(const int formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap); private: DISALLOW_IMPLICIT_CONSTRUCTORS(DictionaryStructureWithBufferPolicyFactory); template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForOnMemoryV4Dict(const FormatUtils::FORMAT_VERSION formatVersion, const std::vector<int> &locale, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForDirectoryDict(const char *const path, const bool isUpdatable); template<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForV4Dict( const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion, MmappedBuffer::MmappedBufferPtr &&mmappedBuffer); static DictionaryStructureWithBufferPolicy::StructurePolicyPtr newPolicyForFileDict(const char *const path, const int bufOffset, const int size); Loading
native/jni/src/suggest/policyimpl/dictionary/utils/dict_file_writing_utils.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <sys/types.h> #include "suggest/policyimpl/dictionary/header/header_policy.h" #include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h" #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" Loading @@ -40,10 +41,16 @@ const char *const DictFileWritingUtils::TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE = TimeKeeper::setCurrentTime(); const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::getFormatVersion(dictVersion); switch (formatVersion) { case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4: return createEmptyV4DictFile(filePath, localeAsCodePointVector, attributeMap, formatVersion); return createEmptyV4DictFile<backward::v401::Ver4DictConstants, backward::v401::Ver4DictBuffers, backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr>( filePath, localeAsCodePointVector, attributeMap, formatVersion); case FormatUtils::VERSION_4_ONLY_FOR_TESTING: case FormatUtils::VERSION_4_DEV: return createEmptyV4DictFile<Ver4DictConstants, Ver4DictBuffers, Ver4DictBuffers::Ver4DictBuffersPtr>( filePath, localeAsCodePointVector, attributeMap, formatVersion); default: AKLOGE("Cannot create dictionary %s because format version %d is not supported.", filePath, dictVersion); Loading @@ -51,14 +58,14 @@ const char *const DictFileWritingUtils::TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE = } } template<class DictConstants, class DictBuffers, class DictBuffersPtr> /* static */ bool DictFileWritingUtils::createEmptyV4DictFile(const char *const dirPath, const std::vector<int> localeAsCodePointVector, const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap, const FormatUtils::FORMAT_VERSION formatVersion) { HeaderPolicy headerPolicy(formatVersion, localeAsCodePointVector, attributeMap); Ver4DictBuffers::Ver4DictBuffersPtr dictBuffers( Ver4DictBuffers::createVer4DictBuffers(&headerPolicy, Ver4DictConstants::MAX_DICT_EXTENDED_REGION_SIZE)); DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy, DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); headerPolicy.fillInAndWriteHeaderToBuffer(true /* updatesLastDecayedTime */, 0 /* unigramCount */, 0 /* bigramCount */, 0 /* extendedRegionSize */, dictBuffers->getWritableHeaderBuffer()); Loading