Merge "Combine mHasParentAddress with mHasLinkedListNode into mSupportsDynamicUpdate." into jb-mr1-dev
This commit is contained in:
commit
5274a4a630
4 changed files with 42 additions and 68 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.");
|
||||
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.");
|
||||
}
|
||||
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.");
|
||||
}
|
||||
mHasLinkedListNode = hasLinkedListNode;
|
||||
mSupportsDynamicUpdate = supportsDynamicUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue