Loading native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.cpp +40 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h" #include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h" #include "suggest/policyimpl/dictionary/utils/byte_array_utils.h" #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" Loading Loading @@ -78,8 +79,10 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; offset = ByteArrayUtils::readUint24AndAdvancePosition(bigramsBuf, pos); break; } if (offset == 0) { if (offset == DynamicPatriciaTrieReadingUtils::DICT_OFFSET_INVALID) { return NOT_A_DICT_POS; } else if (offset == DynamicPatriciaTrieReadingUtils::DICT_OFFSET_ZERO_OFFSET) { return origin; } if (isOffsetNegative(flags)) { return origin - offset; Loading @@ -88,6 +91,24 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; } } /* static */ bool BigramListReadWriteUtils::setHasNextFlag( BufferWithExtendableBuffer *const buffer, const bool hasNext, const int entryPos) { const bool usesAdditionalBuffer = buffer->isInAdditionalBuffer(entryPos); int readingPos = entryPos; if (usesAdditionalBuffer) { readingPos -= buffer->getOriginalBufferSize(); } BigramFlags bigramFlags = ByteArrayUtils::readUint8AndAdvancePosition( buffer->getBuffer(usesAdditionalBuffer), &readingPos); if (hasNext) { bigramFlags = bigramFlags | FLAG_ATTRIBUTE_HAS_NEXT; } else { bigramFlags = bigramFlags & (~FLAG_ATTRIBUTE_HAS_NEXT); } int writingPos = entryPos; return buffer->writeUintAndAdvancePosition(bigramFlags, 1 /* size */, &writingPos); } /* static */ bool BigramListReadWriteUtils::createAndWriteBigramEntry( BufferWithExtendableBuffer *const buffer, const int targetPos, const int probability, const bool hasNext, int *const writingPos) { Loading @@ -101,10 +122,9 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; /* static */ bool BigramListReadWriteUtils::writeBigramEntry( BufferWithExtendableBuffer *const bufferToWrite, const BigramFlags flags, const int targetPtNodePos, int *const writingPos) { const int offset = (targetPtNodePos != NOT_A_DICT_POS) ? targetPtNodePos - (*writingPos + 1) : 0; const int offset = getBigramTargetOffset(targetPtNodePos, *writingPos); const BigramFlags flagsToWrite = (offset < 0) ? (flags | FLAG_ATTRIBUTE_OFFSET_NEGATIVE) : flags; (flags | FLAG_ATTRIBUTE_OFFSET_NEGATIVE) : (flags & ~FLAG_ATTRIBUTE_OFFSET_NEGATIVE); if (!bufferToWrite->writeUintAndAdvancePosition(flagsToWrite, 1 /* size */, writingPos)) { return false; } Loading @@ -116,14 +136,13 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; // Returns true if the bigram entry is valid and put entry flags into out*. /* static */ bool BigramListReadWriteUtils::createAndGetBigramFlags(const int entryPos, const int targetPos, const int probability, const bool hasNext, const int targetPtNodePos, const int probability, const bool hasNext, BigramFlags *const outBigramFlags) { BigramFlags flags = probability & MASK_ATTRIBUTE_PROBABILITY; if (hasNext) { flags |= FLAG_ATTRIBUTE_HAS_NEXT; } const int targetFieldPos = entryPos + 1; const int offset = (targetPos != NOT_A_DICT_POS) ? targetPos - targetFieldPos : 0; const int offset = getBigramTargetOffset(targetPtNodePos, entryPos); if (offset < 0) { flags |= FLAG_ATTRIBUTE_OFFSET_NEGATIVE; } Loading @@ -146,4 +165,18 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; return true; } /* static */ int BigramListReadWriteUtils::getBigramTargetOffset(const int targetPtNodePos, const int entryPos) { if (targetPtNodePos == NOT_A_DICT_POS) { return DynamicPatriciaTrieReadingUtils::DICT_OFFSET_INVALID; } else { const int offset = targetPtNodePos - (entryPos + 1 /* bigramFlagsField */); if (offset == 0) { return DynamicPatriciaTrieReadingUtils::DICT_OFFSET_ZERO_OFFSET; } else { return offset; } } } } // namespace latinime native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h +4 −3 Original line number Diff line number Diff line Loading @@ -59,9 +59,8 @@ public: */ } static AK_FORCE_INLINE BigramFlags setHasNextFlag(const BigramFlags flags) { return flags | FLAG_ATTRIBUTE_HAS_NEXT; } static bool setHasNextFlag(BufferWithExtendableBuffer *const buffer, const bool hasNext, const int entryPos); static AK_FORCE_INLINE BigramFlags setProbabilityInFlags(const BigramFlags flags, const int probability) { Loading Loading @@ -96,6 +95,8 @@ private: static int getBigramAddressAndAdvancePosition(const uint8_t *const bigramsBuf, const BigramFlags flags, int *const pos); static int getBigramTargetOffset(const int targetPtNodePos, const int entryPos); }; } // namespace latinime #endif // LATINIME_BIGRAM_LIST_READ_WRITE_UTILS_H native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b *outBigramsCount = 0; BigramListReadWriteUtils::BigramFlags bigramFlags; int bigramEntryCount = 0; int lastWrittenEntryPos = NOT_A_DICT_POS; do { if (++bigramEntryCount > BIGRAM_ENTRY_COUNT_IN_A_BIGRAM_LIST_LIMIT) { AKLOGE("Too many bigram entries. Entry count: %d, Limit: %d", Loading @@ -90,6 +91,11 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b originalBigramPos += mBuffer->getOriginalBufferSize(); } const int bigramPos = followBigramLinkAndGetCurrentBigramPtNodePos(originalBigramPos); if (bigramPos == NOT_A_DICT_POS) { // Target PtNode has been invalidated. continue; } lastWrittenEntryPos = *toPos; if (!BigramListReadWriteUtils::createAndWriteBigramEntry(bufferToWrite, bigramPos, BigramListReadWriteUtils::getProbabilityFromFlags(bigramFlags), BigramListReadWriteUtils::hasNext(bigramFlags), toPos)) { Loading @@ -97,6 +103,13 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b } (*outBigramsCount)++; } while(BigramListReadWriteUtils::hasNext(bigramFlags)); // Makes the last entry the terminal of the list. Updates the flags. if (lastWrittenEntryPos != NOT_A_DICT_POS) { if (!BigramListReadWriteUtils::setHasNextFlag(bufferToWrite, false /* hasNext */, lastWrittenEntryPos)) { return false; } } if (usesAdditionalBuffer) { *fromPos += mBuffer->getOriginalBufferSize(); } Loading Loading @@ -240,10 +253,7 @@ bool DynamicBigramListPolicy::addNewBigramEntryToBigramList(const int bigramTarg } // The current last entry is found. // First, update the flags of the last entry. const BigramListReadWriteUtils::BigramFlags updatedFlags = BigramListReadWriteUtils::setHasNextFlag(bigramFlags); if (!BigramListReadWriteUtils::writeBigramEntry(mBuffer, updatedFlags, originalBigramPos, &entryPos)) { if (!BigramListReadWriteUtils::setHasNextFlag(mBuffer, true /* hasNext */, entryPos)) { return false; } if (usesAdditionalBuffer) { Loading native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_gc_event_listeners.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -113,11 +113,9 @@ bool DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionField } } int writingPos = node->getHeadPos() + DynamicPatriciaTrieWritingUtils::NODE_FLAG_FIELD_SIZE; const int parentPosOffset = (parentPos != NOT_A_DICT_POS) ? parentPos - node->getHeadPos() : NOT_A_DICT_POS; // Write updated parent offset. if (!DynamicPatriciaTrieWritingUtils::writeParentOffsetAndAdvancePosition(mBufferToWrite, parentPosOffset, &writingPos)) { if (!DynamicPatriciaTrieWritingUtils::writeParentPosOffsetAndAdvancePosition(mBufferToWrite, parentPos, node->getHeadPos(), &writingPos)) { return false; } Loading @@ -139,8 +137,10 @@ bool DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionField // Updates bigram target PtNode positions in the bigram list. int bigramsPos = node->getBigramsPos(); if (bigramsPos != NOT_A_DICT_POS) { mBigramPolicy->updateAllBigramTargetPtNodePositions(&bigramsPos, &mDictPositionRelocationMap->mPtNodePositionRelocationMap); if (!mBigramPolicy->updateAllBigramTargetPtNodePositions(&bigramsPos, &mDictPositionRelocationMap->mPtNodePositionRelocationMap)) { return false; } } return true; Loading native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -40,9 +40,10 @@ void DynamicPatriciaTrieNodeReader::fetchPtNodeInfoFromBufferAndProcessMovedPtNo pos -= mBuffer->getOriginalBufferSize(); } mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); const int parentPos = DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictBuf, &pos); mParentPos = (parentPos != 0) ? ptNodePos + parentPos : NOT_A_DICT_POS; const int parentPosOffset = DynamicPatriciaTrieReadingUtils::getParentPtNodePosOffsetAndAdvancePosition(dictBuf, &pos); mParentPos = DynamicPatriciaTrieReadingUtils::getParentPtNodePos(parentPosOffset, mHeadPos); if (outCodePoints != 0) { mCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( dictBuf, mFlags, maxCodePointCount, outCodePoints, &pos); Loading Loading
native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.cpp +40 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h" #include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h" #include "suggest/policyimpl/dictionary/utils/byte_array_utils.h" #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" Loading Loading @@ -78,8 +79,10 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; offset = ByteArrayUtils::readUint24AndAdvancePosition(bigramsBuf, pos); break; } if (offset == 0) { if (offset == DynamicPatriciaTrieReadingUtils::DICT_OFFSET_INVALID) { return NOT_A_DICT_POS; } else if (offset == DynamicPatriciaTrieReadingUtils::DICT_OFFSET_ZERO_OFFSET) { return origin; } if (isOffsetNegative(flags)) { return origin - offset; Loading @@ -88,6 +91,24 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; } } /* static */ bool BigramListReadWriteUtils::setHasNextFlag( BufferWithExtendableBuffer *const buffer, const bool hasNext, const int entryPos) { const bool usesAdditionalBuffer = buffer->isInAdditionalBuffer(entryPos); int readingPos = entryPos; if (usesAdditionalBuffer) { readingPos -= buffer->getOriginalBufferSize(); } BigramFlags bigramFlags = ByteArrayUtils::readUint8AndAdvancePosition( buffer->getBuffer(usesAdditionalBuffer), &readingPos); if (hasNext) { bigramFlags = bigramFlags | FLAG_ATTRIBUTE_HAS_NEXT; } else { bigramFlags = bigramFlags & (~FLAG_ATTRIBUTE_HAS_NEXT); } int writingPos = entryPos; return buffer->writeUintAndAdvancePosition(bigramFlags, 1 /* size */, &writingPos); } /* static */ bool BigramListReadWriteUtils::createAndWriteBigramEntry( BufferWithExtendableBuffer *const buffer, const int targetPos, const int probability, const bool hasNext, int *const writingPos) { Loading @@ -101,10 +122,9 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; /* static */ bool BigramListReadWriteUtils::writeBigramEntry( BufferWithExtendableBuffer *const bufferToWrite, const BigramFlags flags, const int targetPtNodePos, int *const writingPos) { const int offset = (targetPtNodePos != NOT_A_DICT_POS) ? targetPtNodePos - (*writingPos + 1) : 0; const int offset = getBigramTargetOffset(targetPtNodePos, *writingPos); const BigramFlags flagsToWrite = (offset < 0) ? (flags | FLAG_ATTRIBUTE_OFFSET_NEGATIVE) : flags; (flags | FLAG_ATTRIBUTE_OFFSET_NEGATIVE) : (flags & ~FLAG_ATTRIBUTE_OFFSET_NEGATIVE); if (!bufferToWrite->writeUintAndAdvancePosition(flagsToWrite, 1 /* size */, writingPos)) { return false; } Loading @@ -116,14 +136,13 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; // Returns true if the bigram entry is valid and put entry flags into out*. /* static */ bool BigramListReadWriteUtils::createAndGetBigramFlags(const int entryPos, const int targetPos, const int probability, const bool hasNext, const int targetPtNodePos, const int probability, const bool hasNext, BigramFlags *const outBigramFlags) { BigramFlags flags = probability & MASK_ATTRIBUTE_PROBABILITY; if (hasNext) { flags |= FLAG_ATTRIBUTE_HAS_NEXT; } const int targetFieldPos = entryPos + 1; const int offset = (targetPos != NOT_A_DICT_POS) ? targetPos - targetFieldPos : 0; const int offset = getBigramTargetOffset(targetPtNodePos, entryPos); if (offset < 0) { flags |= FLAG_ATTRIBUTE_OFFSET_NEGATIVE; } Loading @@ -146,4 +165,18 @@ const int BigramListReadWriteUtils::ATTRIBUTE_ADDRESS_SHIFT = 4; return true; } /* static */ int BigramListReadWriteUtils::getBigramTargetOffset(const int targetPtNodePos, const int entryPos) { if (targetPtNodePos == NOT_A_DICT_POS) { return DynamicPatriciaTrieReadingUtils::DICT_OFFSET_INVALID; } else { const int offset = targetPtNodePos - (entryPos + 1 /* bigramFlagsField */); if (offset == 0) { return DynamicPatriciaTrieReadingUtils::DICT_OFFSET_ZERO_OFFSET; } else { return offset; } } } } // namespace latinime
native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h +4 −3 Original line number Diff line number Diff line Loading @@ -59,9 +59,8 @@ public: */ } static AK_FORCE_INLINE BigramFlags setHasNextFlag(const BigramFlags flags) { return flags | FLAG_ATTRIBUTE_HAS_NEXT; } static bool setHasNextFlag(BufferWithExtendableBuffer *const buffer, const bool hasNext, const int entryPos); static AK_FORCE_INLINE BigramFlags setProbabilityInFlags(const BigramFlags flags, const int probability) { Loading Loading @@ -96,6 +95,8 @@ private: static int getBigramAddressAndAdvancePosition(const uint8_t *const bigramsBuf, const BigramFlags flags, int *const pos); static int getBigramTargetOffset(const int targetPtNodePos, const int entryPos); }; } // namespace latinime #endif // LATINIME_BIGRAM_LIST_READ_WRITE_UTILS_H
native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b *outBigramsCount = 0; BigramListReadWriteUtils::BigramFlags bigramFlags; int bigramEntryCount = 0; int lastWrittenEntryPos = NOT_A_DICT_POS; do { if (++bigramEntryCount > BIGRAM_ENTRY_COUNT_IN_A_BIGRAM_LIST_LIMIT) { AKLOGE("Too many bigram entries. Entry count: %d, Limit: %d", Loading @@ -90,6 +91,11 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b originalBigramPos += mBuffer->getOriginalBufferSize(); } const int bigramPos = followBigramLinkAndGetCurrentBigramPtNodePos(originalBigramPos); if (bigramPos == NOT_A_DICT_POS) { // Target PtNode has been invalidated. continue; } lastWrittenEntryPos = *toPos; if (!BigramListReadWriteUtils::createAndWriteBigramEntry(bufferToWrite, bigramPos, BigramListReadWriteUtils::getProbabilityFromFlags(bigramFlags), BigramListReadWriteUtils::hasNext(bigramFlags), toPos)) { Loading @@ -97,6 +103,13 @@ bool DynamicBigramListPolicy::copyAllBigrams(BufferWithExtendableBuffer *const b } (*outBigramsCount)++; } while(BigramListReadWriteUtils::hasNext(bigramFlags)); // Makes the last entry the terminal of the list. Updates the flags. if (lastWrittenEntryPos != NOT_A_DICT_POS) { if (!BigramListReadWriteUtils::setHasNextFlag(bufferToWrite, false /* hasNext */, lastWrittenEntryPos)) { return false; } } if (usesAdditionalBuffer) { *fromPos += mBuffer->getOriginalBufferSize(); } Loading Loading @@ -240,10 +253,7 @@ bool DynamicBigramListPolicy::addNewBigramEntryToBigramList(const int bigramTarg } // The current last entry is found. // First, update the flags of the last entry. const BigramListReadWriteUtils::BigramFlags updatedFlags = BigramListReadWriteUtils::setHasNextFlag(bigramFlags); if (!BigramListReadWriteUtils::writeBigramEntry(mBuffer, updatedFlags, originalBigramPos, &entryPos)) { if (!BigramListReadWriteUtils::setHasNextFlag(mBuffer, true /* hasNext */, entryPos)) { return false; } if (usesAdditionalBuffer) { Loading
native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_gc_event_listeners.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -113,11 +113,9 @@ bool DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionField } } int writingPos = node->getHeadPos() + DynamicPatriciaTrieWritingUtils::NODE_FLAG_FIELD_SIZE; const int parentPosOffset = (parentPos != NOT_A_DICT_POS) ? parentPos - node->getHeadPos() : NOT_A_DICT_POS; // Write updated parent offset. if (!DynamicPatriciaTrieWritingUtils::writeParentOffsetAndAdvancePosition(mBufferToWrite, parentPosOffset, &writingPos)) { if (!DynamicPatriciaTrieWritingUtils::writeParentPosOffsetAndAdvancePosition(mBufferToWrite, parentPos, node->getHeadPos(), &writingPos)) { return false; } Loading @@ -139,8 +137,10 @@ bool DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionField // Updates bigram target PtNode positions in the bigram list. int bigramsPos = node->getBigramsPos(); if (bigramsPos != NOT_A_DICT_POS) { mBigramPolicy->updateAllBigramTargetPtNodePositions(&bigramsPos, &mDictPositionRelocationMap->mPtNodePositionRelocationMap); if (!mBigramPolicy->updateAllBigramTargetPtNodePositions(&bigramsPos, &mDictPositionRelocationMap->mPtNodePositionRelocationMap)) { return false; } } return true; Loading
native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -40,9 +40,10 @@ void DynamicPatriciaTrieNodeReader::fetchPtNodeInfoFromBufferAndProcessMovedPtNo pos -= mBuffer->getOriginalBufferSize(); } mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); const int parentPos = DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictBuf, &pos); mParentPos = (parentPos != 0) ? ptNodePos + parentPos : NOT_A_DICT_POS; const int parentPosOffset = DynamicPatriciaTrieReadingUtils::getParentPtNodePosOffsetAndAdvancePosition(dictBuf, &pos); mParentPos = DynamicPatriciaTrieReadingUtils::getParentPtNodePos(parentPosOffset, mHeadPos); if (outCodePoints != 0) { mCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( dictBuf, mFlags, maxCodePointCount, outCodePoints, &pos); Loading