Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e8a5a58 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Add new bigram entry at the tail of existing list."

parents 8a7f670e 8d8fb396
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTarget
    }
    const int bigramListPos = mBigramDictContent->getBigramListHeadPos(terminalId);
    if (bigramListPos == NOT_A_DICT_POS) {
        // Updating PtNode doesn't have a bigram list.
        // Updating PtNode that doesn't have a bigram list.
        // Create new bigram list.
        if (!mBigramDictContent->createNewBigramList(terminalId)) {
            return false;
@@ -98,19 +98,27 @@ bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTarget
    if (!mBigramDictContent->createNewBigramList(terminalId)) {
        return false;
    }
    // Write new entry at a head position of the bigram list.
    int writingPos = mBigramDictContent->getBigramListHeadPos(terminalId);
    const BigramEntry newBigramEntry(true /* hasNext */, NOT_A_PROBABILITY, newTargetTerminalId);
    int tailEntryPos = NOT_A_DICT_POS;
    // Copy existing bigram list.
    if (!mBigramDictContent->copyBigramList(bigramListPos, writingPos, &tailEntryPos)) {
        return false;
    }
    // Write new entry at the tail position of the bigram content.
    const BigramEntry newBigramEntry(false /* hasNext */, NOT_A_PROBABILITY, newTargetTerminalId);
    const BigramEntry bigramEntryToWrite = createUpdatedBigramEntryFrom(
            &newBigramEntry, newProbability, timestamp);
    if (!mBigramDictContent->writeBigramEntryAndAdvancePosition(&bigramEntryToWrite, &writingPos)) {
    if (!mBigramDictContent->writeBigramEntryAtTail(&bigramEntryToWrite)) {
        return false;
    }
    // Update has next flag of the tail entry.
    if (!updateHasNextFlag(true /* hasNext */, tailEntryPos)) {
        return false;
    }
    if (outAddedNewEntry) {
        *outAddedNewEntry = true;
    }
    // Append existing entries by copying.
    return mBigramDictContent->copyBigramList(bigramListPos, writingPos);
    return true;
}

bool Ver4BigramListPolicy::removeEntry(const int terminalId, const int targetTerminalId) {
@@ -239,4 +247,10 @@ const BigramEntry Ver4BigramListPolicy::createUpdatedBigramEntryFrom(
    }
}

bool Ver4BigramListPolicy::updateHasNextFlag(const bool hasNext, const int bigramEntryPos) {
    const BigramEntry bigramEntry = mBigramDictContent->getBigramEntry(bigramEntryPos);
    const BigramEntry updatedBigramEntry = bigramEntry.updateHasNextAndGetEntry(hasNext);
    return mBigramDictContent->writeBigramEntry(&updatedBigramEntry, bigramEntryPos);
}

} // namespace latinime
+2 −0
Original line number Diff line number Diff line
@@ -61,6 +61,8 @@ class Ver4BigramListPolicy : public DictionaryBigramsStructurePolicy {
    const BigramEntry createUpdatedBigramEntryFrom(const BigramEntry *const originalBigramEntry,
            const int newProbability, const int timestamp) const;

    bool updateHasNextFlag(const bool hasNext, const int bigramEntryPos);

    BigramDictContent *const mBigramDictContent;
    const TerminalPositionLookupTable *const mTerminalPositionLookupTable;
    const HeaderPolicy *const mHeaderPolicy;
+5 −1
Original line number Diff line number Diff line
@@ -113,13 +113,17 @@ bool BigramDictContent::writeBigramEntryAndAdvancePosition(
    return true;
}

bool BigramDictContent::copyBigramList(const int bigramListPos, const int toPos) {
bool BigramDictContent::copyBigramList(const int bigramListPos, const int toPos,
        int *const outTailEntryPos) {
    int readingPos = bigramListPos;
    int writingPos = toPos;
    bool hasNext = true;
    while (hasNext) {
        const BigramEntry bigramEntry = getBigramEntryAndAdvancePosition(&readingPos);
        hasNext = bigramEntry.hasNext();
        if (!hasNext) {
            *outTailEntryPos = writingPos;
        }
        if (!writeBigramEntryAndAdvancePosition(&bigramEntry, &writingPos)) {
            AKLOGE("Cannot write bigram entry to copy. pos: %d", writingPos);
            return false;
+6 −1
Original line number Diff line number Diff line
@@ -58,6 +58,11 @@ class BigramDictContent : public SparseTableDictContent {
        return addressLookupTable->get(terminalId);
    }

    bool writeBigramEntryAtTail(const BigramEntry *const bigramEntryToWrite) {
        int writingPos = getContentBuffer()->getTailPosition();
        return writeBigramEntryAndAdvancePosition(bigramEntryToWrite, &writingPos);
    }

    bool writeBigramEntry(const BigramEntry *const bigramEntryToWrite, const int entryWritingPos) {
        int writingPos = entryWritingPos;
        return writeBigramEntryAndAdvancePosition(bigramEntryToWrite, &writingPos);
@@ -71,7 +76,7 @@ class BigramDictContent : public SparseTableDictContent {
        return getUpdatableAddressLookupTable()->set(terminalId, bigramListPos);
    }

    bool copyBigramList(const int bigramListPos, const int toPos);
    bool copyBigramList(const int bigramListPos, const int toPos, int *const outTailEntryPos);

    bool flushToFile(const char *const dictPath) const {
        return flush(dictPath, Ver4DictConstants::BIGRAM_LOOKUP_TABLE_FILE_EXTENSION,