am c2fdf0df
: Make readNode read linked list nodes.
* commit 'c2fdf0dfbf1c43f7ed8fdf3d91576bbf71146ef3': Make readNode read linked list nodes.
This commit is contained in:
commit
3c9a822ba4
1 changed files with 52 additions and 34 deletions
|
@ -1347,43 +1347,61 @@ public class BinaryDictInputOutput {
|
||||||
final Map<Integer, Node> reverseNodeMap, final Map<Integer, CharGroup> reverseGroupMap,
|
final Map<Integer, Node> reverseNodeMap, final Map<Integer, CharGroup> reverseGroupMap,
|
||||||
final FormatOptions options)
|
final FormatOptions options)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
final int nodeOrigin = buffer.position() - headerSize;
|
|
||||||
final int count = readCharGroupCount(buffer);
|
|
||||||
final ArrayList<CharGroup> nodeContents = new ArrayList<CharGroup>();
|
final ArrayList<CharGroup> nodeContents = new ArrayList<CharGroup>();
|
||||||
int groupOffset = nodeOrigin + getGroupCountSize(count);
|
final int nodeOrigin = buffer.position() - headerSize;
|
||||||
for (int i = count; i > 0; --i) {
|
|
||||||
CharGroupInfo info = readCharGroup(buffer, groupOffset, options);
|
do { // Scan the linked-list node.
|
||||||
ArrayList<WeightedString> shortcutTargets = info.mShortcutTargets;
|
final int nodeHeadPosition = buffer.position() - headerSize;
|
||||||
ArrayList<WeightedString> bigrams = null;
|
final int count = readCharGroupCount(buffer);
|
||||||
if (null != info.mBigrams) {
|
int groupOffset = nodeHeadPosition + getGroupCountSize(count);
|
||||||
bigrams = new ArrayList<WeightedString>();
|
for (int i = count; i > 0; --i) { // Scan the array of CharGroup.
|
||||||
for (PendingAttribute bigram : info.mBigrams) {
|
CharGroupInfo info = readCharGroup(buffer, groupOffset, options);
|
||||||
final String word = getWordAtAddress(
|
ArrayList<WeightedString> shortcutTargets = info.mShortcutTargets;
|
||||||
buffer, headerSize, bigram.mAddress, options);
|
ArrayList<WeightedString> bigrams = null;
|
||||||
bigrams.add(new WeightedString(word, bigram.mFrequency));
|
if (null != info.mBigrams) {
|
||||||
|
bigrams = new ArrayList<WeightedString>();
|
||||||
|
for (PendingAttribute bigram : info.mBigrams) {
|
||||||
|
final String word = getWordAtAddress(
|
||||||
|
buffer, headerSize, bigram.mAddress, options);
|
||||||
|
bigrams.add(new WeightedString(word, bigram.mFrequency));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasChildrenAddress(info.mChildrenAddress)) {
|
||||||
|
Node children = reverseNodeMap.get(info.mChildrenAddress);
|
||||||
|
if (null == children) {
|
||||||
|
final int currentPosition = buffer.position();
|
||||||
|
buffer.position(info.mChildrenAddress + headerSize);
|
||||||
|
children = readNode(
|
||||||
|
buffer, headerSize, reverseNodeMap, reverseGroupMap, options);
|
||||||
|
buffer.position(currentPosition);
|
||||||
|
}
|
||||||
|
nodeContents.add(
|
||||||
|
new CharGroup(info.mCharacters, shortcutTargets, bigrams,
|
||||||
|
info.mFrequency,
|
||||||
|
0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
|
||||||
|
0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED), children));
|
||||||
|
} else {
|
||||||
|
nodeContents.add(
|
||||||
|
new CharGroup(info.mCharacters, shortcutTargets, bigrams,
|
||||||
|
info.mFrequency,
|
||||||
|
0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
|
||||||
|
0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED)));
|
||||||
|
}
|
||||||
|
groupOffset = info.mEndAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reach the end of the array.
|
||||||
|
if (options.mHasLinkedListNode) {
|
||||||
|
final int nextAddress = buffer.readUnsignedInt24();
|
||||||
|
if (nextAddress >= 0 && nextAddress < buffer.limit()) {
|
||||||
|
buffer.position(nextAddress);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasChildrenAddress(info.mChildrenAddress)) {
|
} while (options.mHasLinkedListNode &&
|
||||||
Node children = reverseNodeMap.get(info.mChildrenAddress);
|
buffer.position() != FormatSpec.NO_FORWARD_LINK_ADDRESS);
|
||||||
if (null == children) {
|
|
||||||
final int currentPosition = buffer.position();
|
|
||||||
buffer.position(info.mChildrenAddress + headerSize);
|
|
||||||
children = readNode(
|
|
||||||
buffer, headerSize, reverseNodeMap, reverseGroupMap, options);
|
|
||||||
buffer.position(currentPosition);
|
|
||||||
}
|
|
||||||
nodeContents.add(
|
|
||||||
new CharGroup(info.mCharacters, shortcutTargets, bigrams, info.mFrequency,
|
|
||||||
0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
|
|
||||||
0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED), children));
|
|
||||||
} else {
|
|
||||||
nodeContents.add(
|
|
||||||
new CharGroup(info.mCharacters, shortcutTargets, bigrams, info.mFrequency,
|
|
||||||
0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
|
|
||||||
0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED)));
|
|
||||||
}
|
|
||||||
groupOffset = info.mEndAddress;
|
|
||||||
}
|
|
||||||
final Node node = new Node(nodeContents);
|
final Node node = new Node(nodeContents);
|
||||||
node.mCachedAddress = nodeOrigin;
|
node.mCachedAddress = nodeOrigin;
|
||||||
reverseNodeMap.put(node.mCachedAddress, node);
|
reverseNodeMap.put(node.mCachedAddress, node);
|
||||||
|
|
Loading…
Reference in a new issue