[FD1] Move parents' address computation outside

There is no need to do it repeatedly in this loop: it's
clearer and faster to do it at the end only.

Bug: 8526576
Change-Id: I707571179c89479830891ec6d4fd06a9fffed7c1
main
Jean Chalard 2013-07-10 18:28:34 +09:00
parent 4d5939fc0a
commit 257750d988
1 changed files with 23 additions and 3 deletions

View File

@ -559,9 +559,6 @@ public final class BinaryDictInputOutput {
} else if (null != group.mChildren) { } else if (null != group.mChildren) {
final int offsetBasePoint = groupSize + node.mCachedAddress + size; final int offsetBasePoint = groupSize + node.mCachedAddress + size;
final int offset = group.mChildren.mCachedAddress - offsetBasePoint; 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) { if (formatOptions.mSupportsDynamicUpdate) {
groupSize += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE; groupSize += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE;
} else { } else {
@ -620,6 +617,26 @@ public final class BinaryDictInputOutput {
return nodeOffset; return nodeOffset;
} }
/**
* 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. * Compute the addresses and sizes of an ordered node array.
* *
@ -660,6 +677,9 @@ public final class BinaryDictInputOutput {
if (passes > MAX_PASSES) throw new RuntimeException("Too many passes - probably a bug"); if (passes > MAX_PASSES) throw new RuntimeException("Too many passes - probably a bug");
} while (changesDone); } while (changesDone);
if (formatOptions.mSupportsDynamicUpdate) {
computeParentAddresses(flatNodes);
}
final Node lastNode = flatNodes.get(flatNodes.size() - 1); final Node lastNode = flatNodes.get(flatNodes.size() - 1);
MakedictLog.i("Compression complete in " + passes + " passes."); MakedictLog.i("Compression complete in " + passes + " passes.");
MakedictLog.i("After address compression : " MakedictLog.i("After address compression : "