diff options
-rw-r--r-- | java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java | 26 | ||||
-rw-r--r-- | tools/dicttool/Android.mk | 4 | ||||
-rw-r--r-- | tools/dicttool/compat/android/util/SparseArray.java | 84 |
3 files changed, 107 insertions, 7 deletions
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java index 467f6a053..29e7c28f3 100644 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java +++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java @@ -559,9 +559,6 @@ public final class BinaryDictInputOutput { } else if (null != group.mChildren) { final int offsetBasePoint = groupSize + node.mCachedAddress + size; final int offset = group.mChildren.mCachedAddress - offsetBasePoint; - // assign my address to children's parent address - group.mChildren.mCachedParentAddress = group.mCachedAddress - - group.mChildren.mCachedAddress; if (formatOptions.mSupportsDynamicUpdate) { groupSize += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE; } else { @@ -621,6 +618,26 @@ public final class BinaryDictInputOutput { } /** + * Compute the cached parent addresses after all has been updated. + * + * The parent addresses are used by some binary formats at write-to-disk time. Not all formats + * need them. In particular, version 2 does not need them, and version 3 does. + * + * @param flatNodes the flat array of nodes to fill in + */ + private static void computeParentAddresses(final ArrayList<Node> flatNodes) { + for (final Node node : flatNodes) { + for (CharGroup group : node.mData) { + if (null != group.mChildren) { + // assign my address to children's parent address + group.mChildren.mCachedParentAddress = group.mCachedAddress + - group.mChildren.mCachedAddress; + } + } + } + } + + /** * Compute the addresses and sizes of an ordered node array. * * This method takes a node array and will update its cached address and size values @@ -660,6 +677,9 @@ public final class BinaryDictInputOutput { if (passes > MAX_PASSES) throw new RuntimeException("Too many passes - probably a bug"); } while (changesDone); + if (formatOptions.mSupportsDynamicUpdate) { + computeParentAddresses(flatNodes); + } final Node lastNode = flatNodes.get(flatNodes.size() - 1); MakedictLog.i("Compression complete in " + passes + " passes."); MakedictLog.i("After address compression : " diff --git a/tools/dicttool/Android.mk b/tools/dicttool/Android.mk index 426e4419b..7832c1463 100644 --- a/tools/dicttool/Android.mk +++ b/tools/dicttool/Android.mk @@ -17,7 +17,6 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) BUILD_TOP := ../../../../.. -FRAMEWORK_TOP := $(BUILD_TOP)/frameworks/base/core/java LATINIME_DIR := $(BUILD_TOP)/packages/inputmethods/LatinIME LATINIME_BASE_SOURCE_DIRECTORY := $(LATINIME_DIR)/java/src/com/android/inputmethod LATINIME_CORE_SOURCE_DIRECTORY := $(LATINIME_BASE_SOURCE_DIRECTORY)/latin @@ -28,9 +27,6 @@ DICTTOOL_ONDEVICE_TESTS_DIRECTORY := \ $(LATINIME_DIR)/tests/src/com/android/inputmethod/latin/makedict/ USED_TARGETTED_UTILS := \ - $(FRAMEWORK_TOP)/android/util/ContainerHelpers.java \ - $(FRAMEWORK_TOP)/android/util/SparseArray.java \ - $(FRAMEWORK_TOP)/com/android/internal/util/ArrayUtils.java \ $(LATINIME_CORE_SOURCE_DIRECTORY)/ByteArrayWrapper.java \ $(LATINIME_CORE_SOURCE_DIRECTORY)/utils/CollectionUtils.java diff --git a/tools/dicttool/compat/android/util/SparseArray.java b/tools/dicttool/compat/android/util/SparseArray.java new file mode 100644 index 000000000..6c76f19f4 --- /dev/null +++ b/tools/dicttool/compat/android/util/SparseArray.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.util; + +import com.android.inputmethod.latin.utils.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collections; + +public class SparseArray<E> { + private final ArrayList<Integer> mKeys; + private final ArrayList<E> mValues; + + public SparseArray() { + this(10); + } + + public SparseArray(final int initialCapacity) { + mKeys = CollectionUtils.newArrayList(initialCapacity); + mValues = CollectionUtils.newArrayList(initialCapacity); + } + + public int size() { + return mKeys.size(); + } + + public void clear() { + mKeys.clear(); + mValues.clear(); + } + + public void put(final int key, final E value) { + final int index = Collections.binarySearch(mKeys, key); + if (index >= 0) { + mValues.set(index, value); + return; + } + final int insertIndex = ~index; + mKeys.add(insertIndex, key); + mValues.add(insertIndex, value); + } + + public E get(final int key) { + return get(key, null); + } + + public E get(final int key, final E valueIfKeyNotFound) { + final int index = Collections.binarySearch(mKeys, key); + if (index >= 0) { + return mValues.get(index); + } + return valueIfKeyNotFound; + } + + public int indexOfKey(final int key) { + return mKeys.indexOf(key); + } + + public int indexOfValue(final E value) { + return mValues.indexOf(value); + } + + public int keyAt(final int index) { + return mKeys.get(index); + } + + public E valueAt(final int index) { + return mValues.get(index); + } +} |