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

Commit 82d9deaa authored by Yuichiro Hanada's avatar Yuichiro Hanada
Browse files

Combine mHasParentAddress with mHasLinkedListNode into mSupportsDynamicUpdate.

bug: 6669677

Change-Id: I82799af199358420f09ac34fc005091e202c5d3b
parent 8acb881a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ public class BinaryDictIOUtils {
            }

            if (p.mPosition == p.mNumOfCharGroup) {
                if (formatOptions.mHasLinkedListNode) {
                if (formatOptions.mSupportsDynamicUpdate) {
                    final int forwardLinkAddress = buffer.readUnsignedInt24();
                    if (forwardLinkAddress != FormatSpec.NO_FORWARD_LINK_ADDRESS) {
                        // the node has a forward link.
+17 −18
Original line number Diff line number Diff line
@@ -376,7 +376,7 @@ public class BinaryDictInputOutput {
            g.mCachedSize = groupSize;
            size += groupSize;
        }
        if (options.mHasLinkedListNode) {
        if (options.mSupportsDynamicUpdate) {
            size += FormatSpec.FORWARD_LINK_ADDRESS_SIZE;
        }
        node.mCachedSize = size;
@@ -390,11 +390,11 @@ public class BinaryDictInputOutput {
    }

    /**
     * Helper method to check whether the CharGroup has a parent address.
     * Helper method to check whether the dictionary can be updated dynamically.
     */
    public static boolean hasParentAddress(final FormatOptions options) {
        return options.mVersion >= FormatSpec.FIRST_VERSION_WITH_PARENT_ADDRESS
                && options.mHasParentAddress;
    public static boolean supportsDynamicUpdate(final FormatOptions options) {
        return options.mVersion >= FormatSpec.FIRST_VERSION_WITH_DYNAMIC_UPDATE
                && options.mSupportsDynamicUpdate;
    }

    /**
@@ -404,7 +404,7 @@ public class BinaryDictInputOutput {
     * @param options file format options.
     */
    private static int getGroupHeaderSize(final CharGroup group, final FormatOptions options) {
        if (hasParentAddress(options)) {
        if (supportsDynamicUpdate(options)) {
            return FormatSpec.GROUP_FLAGS_SIZE + FormatSpec.PARENT_ADDRESS_SIZE
                    + getGroupCharactersSize(group);
        } else {
@@ -530,7 +530,7 @@ public class BinaryDictInputOutput {
            group.mCachedSize = groupSize;
            size += groupSize;
        }
        if (formatOptions.mHasLinkedListNode) {
        if (formatOptions.mSupportsDynamicUpdate) {
            size += FormatSpec.FORWARD_LINK_ADDRESS_SIZE;
        }
        if (node.mCachedSize != size) {
@@ -559,7 +559,8 @@ public class BinaryDictInputOutput {
                groupOffset += g.mCachedSize;
            }
            final int nodeSize = groupCountSize + groupOffset
                    + (formatOptions.mHasLinkedListNode ? FormatSpec.FORWARD_LINK_ADDRESS_SIZE : 0);
                    + (formatOptions.mSupportsDynamicUpdate
                            ? FormatSpec.FORWARD_LINK_ADDRESS_SIZE : 0);
            if (nodeSize != n.mCachedSize) {
                throw new RuntimeException("Bug : Stored and computed node size differ");
            }
@@ -792,8 +793,7 @@ public class BinaryDictInputOutput {
        return (options.mFrenchLigatureProcessing ? FormatSpec.FRENCH_LIGATURE_PROCESSING_FLAG : 0)
                + (options.mGermanUmlautProcessing ? FormatSpec.GERMAN_UMLAUT_PROCESSING_FLAG : 0)
                + (hasBigrams ? FormatSpec.CONTAINS_BIGRAMS_FLAG : 0)
                + (formatOptions.mHasParentAddress ? FormatSpec.HAS_PARENT_ADDRESS : 0)
                + (formatOptions.mHasLinkedListNode ? FormatSpec.HAS_LINKEDLIST_NODE : 0);
                + (formatOptions.mSupportsDynamicUpdate ? FormatSpec.SUPPORTS_DYNAMIC_UPDATE : 0);
    }

    /**
@@ -857,7 +857,7 @@ public class BinaryDictInputOutput {
            byte flags = makeCharGroupFlags(group, groupAddress, childrenOffset);
            buffer[index++] = flags;

            if (hasParentAddress(formatOptions)) {
            if (supportsDynamicUpdate(formatOptions)) {
                if (parentAddress == FormatSpec.NO_PARENT_ADDRESS) {
                    // this node is the root node.
                    buffer[index] = buffer[index + 1] = buffer[index + 2] = 0;
@@ -927,7 +927,7 @@ public class BinaryDictInputOutput {
            }

        }
        if (formatOptions.mHasLinkedListNode) {
        if (formatOptions.mSupportsDynamicUpdate) {
            buffer[index] = buffer[index + 1] = buffer[index + 2]
                    = FormatSpec.NO_FORWARD_LINK_ADDRESS;
            index += FormatSpec.FORWARD_LINK_ADDRESS_SIZE;
@@ -1112,7 +1112,7 @@ public class BinaryDictInputOutput {
        ++addressPointer;

        final int parentAddress;
        if (hasParentAddress(options)) {
        if (supportsDynamicUpdate(options)) {
            // read the parent address. (version 3)
            parentAddress = -buffer.readUnsignedInt24();
            addressPointer += 3;
@@ -1251,7 +1251,7 @@ public class BinaryDictInputOutput {
        final String result;
        final int originalPointer = buffer.position();

        if (hasParentAddress(formatOptions)) {
        if (supportsDynamicUpdate(formatOptions)) {
            result = getWordAtAddressWithParentAddress(buffer, headerSize, address, formatOptions);
        } else {
            result = getWordAtAddressWithoutParentAddress(buffer, headerSize, address,
@@ -1392,7 +1392,7 @@ public class BinaryDictInputOutput {
            }

            // reach the end of the array.
            if (options.mHasLinkedListNode) {
            if (options.mSupportsDynamicUpdate) {
                final int nextAddress = buffer.readUnsignedInt24();
                if (nextAddress >= 0 && nextAddress < buffer.limit()) {
                    buffer.position(nextAddress);
@@ -1400,7 +1400,7 @@ public class BinaryDictInputOutput {
                    break;
                }
            }
        } while (options.mHasLinkedListNode &&
        } while (options.mSupportsDynamicUpdate &&
                buffer.position() != FormatSpec.NO_FORWARD_LINK_ADDRESS);

        final Node node = new Node(nodeContents);
@@ -1469,8 +1469,7 @@ public class BinaryDictInputOutput {
                        0 != (optionsFlags & FormatSpec.GERMAN_UMLAUT_PROCESSING_FLAG),
                        0 != (optionsFlags & FormatSpec.FRENCH_LIGATURE_PROCESSING_FLAG)),
                new FormatOptions(version,
                        0 != (optionsFlags & FormatSpec.HAS_PARENT_ADDRESS),
                        0 != (optionsFlags & FormatSpec.HAS_LINKEDLIST_NODE)));
                        0 != (optionsFlags & FormatSpec.SUPPORTS_DYNAMIC_UPDATE)));
        return header;
    }

+8 −25
Original line number Diff line number Diff line
@@ -145,17 +145,14 @@ public final class FormatSpec {
    static final int MAXIMUM_SUPPORTED_VERSION = 3;
    static final int NOT_A_VERSION_NUMBER = -1;
    static final int FIRST_VERSION_WITH_HEADER_SIZE = 2;
    static final int FIRST_VERSION_WITH_PARENT_ADDRESS = 3;
    static final int FIRST_VERSION_WITH_LINKEDLIST_NODE = 3;
    static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3;

    // These options need to be the same numeric values as the one in the native reading code.
    static final int GERMAN_UMLAUT_PROCESSING_FLAG = 0x1;
    // TODO: Make the native reading code read this variable.
    static final int HAS_PARENT_ADDRESS = 0x2;
    static final int SUPPORTS_DYNAMIC_UPDATE = 0x2;
    static final int FRENCH_LIGATURE_PROCESSING_FLAG = 0x4;
    static final int CONTAINS_BIGRAMS_FLAG = 0x8;
    // TODO: Make the native reading code read this variable.
    static final int HAS_LINKEDLIST_NODE = 0x10;

    // TODO: Make this value adaptative to content data, store it in the header, and
    // use it in the reading code.
@@ -215,31 +212,17 @@ public final class FormatSpec {
     */
    public static class FormatOptions {
        public final int mVersion;
        public final boolean mHasParentAddress;
        public final boolean mHasLinkedListNode;
        public final boolean mSupportsDynamicUpdate;
        public FormatOptions(final int version) {
            this(version, false);
        }
        public FormatOptions(final int version, final boolean hasParentAddress) {
            this(version, hasParentAddress, false);
        }
        public FormatOptions(final int version, final boolean hasParentAddress,
                final boolean hasLinkedListNode) {
        public FormatOptions(final int version, final boolean supportsDynamicUpdate) {
            mVersion = version;
            if (version < FIRST_VERSION_WITH_PARENT_ADDRESS && hasParentAddress) {
                throw new RuntimeException("Parent addresses are only supported with versions "
                        + FIRST_VERSION_WITH_PARENT_ADDRESS + " and ulterior.");
            }
            mHasParentAddress = hasParentAddress;

            if (version < FIRST_VERSION_WITH_LINKEDLIST_NODE && hasLinkedListNode) {
                throw new RuntimeException("Linked list nodes are only supported with versions "
                        + FIRST_VERSION_WITH_LINKEDLIST_NODE + " and ulterior.");
            }
            if (!hasParentAddress && hasLinkedListNode) {
                throw new RuntimeException("Linked list nodes need parent addresses.");
            if (version < FIRST_VERSION_WITH_DYNAMIC_UPDATE && supportsDynamicUpdate) {
                throw new RuntimeException("Dynamic updates are only supported with versions "
                        + FIRST_VERSION_WITH_DYNAMIC_UPDATE + " and ulterior.");
            }
            mHasLinkedListNode = hasLinkedListNode;
            mSupportsDynamicUpdate = supportsDynamicUpdate;
        }
    }

+16 −24
Original line number Diff line number Diff line
@@ -65,13 +65,10 @@ public class BinaryDictIOTests extends AndroidTestCase {
            CollectionUtils.newSparseArray();

    private static final FormatSpec.FormatOptions VERSION2 = new FormatSpec.FormatOptions(2);
    private static final FormatSpec.FormatOptions VERSION3_WITHOUT_PARENTADDRESS =
            new FormatSpec.FormatOptions(3, false /* hasParentAddress */);
    private static final FormatSpec.FormatOptions VERSION3_WITH_PARENTADDRESS =
            new FormatSpec.FormatOptions(3, true /* hasParentAddress */);
    private static final FormatSpec.FormatOptions VERSION3_WITH_LINKEDLIST_NODE =
            new FormatSpec.FormatOptions(3, true /* hasParentAddress */,
                    true /* hasLinkedListNode */);
    private static final FormatSpec.FormatOptions VERSION3_WITHOUT_DYNAMIC_UPDATE =
            new FormatSpec.FormatOptions(3, false /* supportsDynamicUpdate */);
    private static final FormatSpec.FormatOptions VERSION3_WITH_DYNAMIC_UPDATE =
            new FormatSpec.FormatOptions(3, true /* supportsDynamicUpdate */);

    private static final String[] CHARACTERS = {
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
@@ -240,8 +237,7 @@ public class BinaryDictIOTests extends AndroidTestCase {
        String result = " : buffer type = "
                + ((bufferType == USE_BYTE_BUFFER) ? "byte buffer" : "byte array");
        result += " : version = " + formatOptions.mVersion;
        return result + ", hasParentAddress = " + formatOptions.mHasParentAddress
                + ", hasLinkedListNode = " + formatOptions.mHasLinkedListNode;
        return result + ", supportsDynamicUpdate = " + formatOptions.mSupportsDynamicUpdate;
    }

    // Tests for readDictionaryBinary and writeDictionaryBinary
@@ -308,9 +304,8 @@ public class BinaryDictIOTests extends AndroidTestCase {
        final List<String> results = CollectionUtils.newArrayList();

        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION2);
        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION3_WITHOUT_PARENTADDRESS);
        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION3_WITH_PARENTADDRESS);
        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION3_WITH_LINKEDLIST_NODE);
        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION3_WITHOUT_DYNAMIC_UPDATE);
        runReadAndWriteTests(results, USE_BYTE_BUFFER, VERSION3_WITH_DYNAMIC_UPDATE);

        for (final String result : results) {
            Log.d(TAG, result);
@@ -321,9 +316,8 @@ public class BinaryDictIOTests extends AndroidTestCase {
        final List<String> results = CollectionUtils.newArrayList();

        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION2);
        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION3_WITHOUT_PARENTADDRESS);
        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION3_WITH_PARENTADDRESS);
        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION3_WITH_LINKEDLIST_NODE);
        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION3_WITHOUT_DYNAMIC_UPDATE);
        runReadAndWriteTests(results, USE_BYTE_ARRAY, VERSION3_WITH_DYNAMIC_UPDATE);

        for (final String result : results) {
            Log.d(TAG, result);
@@ -455,9 +449,8 @@ public class BinaryDictIOTests extends AndroidTestCase {
        final List<String> results = CollectionUtils.newArrayList();

        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION2);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION3_WITHOUT_PARENTADDRESS);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION3_WITH_PARENTADDRESS);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION3_WITH_LINKEDLIST_NODE);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION3_WITHOUT_DYNAMIC_UPDATE);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_BUFFER, VERSION3_WITH_DYNAMIC_UPDATE);

        for (final String result : results) {
            Log.d(TAG, result);
@@ -468,9 +461,8 @@ public class BinaryDictIOTests extends AndroidTestCase {
        final List<String> results = CollectionUtils.newArrayList();

        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION2);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION3_WITHOUT_PARENTADDRESS);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION3_WITH_PARENTADDRESS);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION3_WITH_LINKEDLIST_NODE);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION3_WITHOUT_DYNAMIC_UPDATE);
        runReadUnigramsAndBigramsTests(results, USE_BYTE_ARRAY, VERSION3_WITH_DYNAMIC_UPDATE);

        for (final String result : results) {
            Log.d(TAG, result);
@@ -528,7 +520,7 @@ public class BinaryDictIOTests extends AndroidTestCase {
                new FusionDictionary.DictionaryOptions(
                        new HashMap<String, String>(), false, false));
        addUnigrams(sWords.size(), dict, sWords, null /* shortcutMap */);
        timeWritingDictToFile(file, dict, VERSION3_WITH_LINKEDLIST_NODE);
        timeWritingDictToFile(file, dict, VERSION3_WITH_DYNAMIC_UPDATE);

        final FusionDictionaryBufferInterface buffer = getBuffer(file, USE_BYTE_ARRAY);

@@ -569,7 +561,7 @@ public class BinaryDictIOTests extends AndroidTestCase {
    public void testDeleteWord() {
        File file = null;
        try {
            file = File.createTempFile("testGetTerminalPosition", ".dict");
            file = File.createTempFile("testDeleteWord", ".dict");
        } catch (IOException e) {
            // do nothing
        }
@@ -579,7 +571,7 @@ public class BinaryDictIOTests extends AndroidTestCase {
                new FusionDictionary.DictionaryOptions(
                        new HashMap<String, String>(), false, false));
        addUnigrams(sWords.size(), dict, sWords, null /* shortcutMap */);
        timeWritingDictToFile(file, dict, VERSION3_WITH_LINKEDLIST_NODE);
        timeWritingDictToFile(file, dict, VERSION3_WITH_DYNAMIC_UPDATE);

        final FusionDictionaryBufferInterface buffer = getBuffer(file, USE_BYTE_ARRAY);