am fd10db04
: Move shortcut iteration methods to poilcy.
* commit 'fd10db04e02ddad88d0c6fca82583493955a7c7e': Move shortcut iteration methods to poilcy.
This commit is contained in:
commit
ad49fa9f2c
13 changed files with 203 additions and 90 deletions
|
@ -20,7 +20,6 @@
|
|||
#include <stdint.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/core/dictionary/byte_array_utils.h"
|
||||
|
||||
namespace latinime {
|
||||
|
@ -47,16 +46,14 @@ class BinaryDictionaryTerminalAttributesReadingUtils {
|
|||
// This method returns the size of the shortcut list region excluding the shortcut list size
|
||||
// field at the beginning.
|
||||
static AK_FORCE_INLINE int getShortcutListSizeAndForwardPointer(
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo, int *const pos) {
|
||||
const uint8_t *const dictRoot, int *const pos) {
|
||||
// readUint16andAdvancePosition() returns an offset *including* the uint16 field itself.
|
||||
return ByteArrayUtils::readUint16AndAdvancePosition(
|
||||
binaryDictionaryInfo->getDictRoot(), pos) - SHORTCUT_LIST_SIZE_FIELD_SIZE;
|
||||
return ByteArrayUtils::readUint16AndAdvancePosition(dictRoot, pos)
|
||||
- SHORTCUT_LIST_SIZE_FIELD_SIZE;
|
||||
}
|
||||
|
||||
static AK_FORCE_INLINE void skipShortcuts(
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo, int *const pos) {
|
||||
const int shortcutListSize = getShortcutListSizeAndForwardPointer(
|
||||
binaryDictionaryInfo, pos);
|
||||
static AK_FORCE_INLINE void skipShortcuts(const uint8_t *const dictRoot, int *const pos) {
|
||||
const int shortcutListSize = getShortcutListSizeAndForwardPointer(dictRoot, pos);
|
||||
*pos += shortcutListSize;
|
||||
}
|
||||
|
||||
|
@ -65,10 +62,9 @@ class BinaryDictionaryTerminalAttributesReadingUtils {
|
|||
}
|
||||
|
||||
static AK_FORCE_INLINE int readShortcutTarget(
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo, const int maxLength,
|
||||
int *const outWord, int *const pos) {
|
||||
return ByteArrayUtils::readStringAndAdvancePosition(
|
||||
binaryDictionaryInfo->getDictRoot(), maxLength, outWord, pos);
|
||||
const uint8_t *const dictRoot, const int maxLength, int *const outWord,
|
||||
int *const pos) {
|
||||
return ByteArrayUtils::readStringAndAdvancePosition(dictRoot, maxLength, outWord, pos);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -19,8 +19,7 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_terminal_attributes_reading_utils.h"
|
||||
#include "suggest/core/policy/dictionary_shortcuts_structure_policy.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
|
@ -33,9 +32,9 @@ class TerminalAttributes {
|
|||
public:
|
||||
class ShortcutIterator {
|
||||
public:
|
||||
ShortcutIterator(const BinaryDictionaryInfo *const binaryDictionaryInfo,
|
||||
ShortcutIterator(const DictionaryShortcutsStructurePolicy *const shortcutStructurePolicy,
|
||||
const int shortcutPos, const bool hasShortcutList)
|
||||
: mBinaryDictionaryInfo(binaryDictionaryInfo), mPos(shortcutPos),
|
||||
: mShortcutStructurePolicy(shortcutStructurePolicy), mPos(shortcutPos),
|
||||
mHasNextShortcutTarget(hasShortcutList) {}
|
||||
|
||||
inline bool hasNextShortcutTarget() const {
|
||||
|
@ -47,46 +46,34 @@ class TerminalAttributes {
|
|||
AK_FORCE_INLINE void nextShortcutTarget(
|
||||
const int maxDepth, int *const outTarget, int *const outTargetLength,
|
||||
bool *const outIsWhitelist) {
|
||||
const BinaryDictionaryTerminalAttributesReadingUtils::ShortcutFlags flags =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::getFlagsAndForwardPointer(
|
||||
mBinaryDictionaryInfo->getDictRoot(), &mPos);
|
||||
mHasNextShortcutTarget =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::hasNext(flags);
|
||||
if (outIsWhitelist) {
|
||||
*outIsWhitelist =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::isWhitelist(flags);
|
||||
}
|
||||
if (outTargetLength) {
|
||||
*outTargetLength =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::readShortcutTarget(
|
||||
mBinaryDictionaryInfo, maxDepth, outTarget, &mPos);
|
||||
}
|
||||
mShortcutStructurePolicy->getNextShortcut(maxDepth, outTarget, outTargetLength,
|
||||
outIsWhitelist, &mHasNextShortcutTarget, &mPos);
|
||||
}
|
||||
|
||||
private:
|
||||
const BinaryDictionaryInfo *const mBinaryDictionaryInfo;
|
||||
const DictionaryShortcutsStructurePolicy *const mShortcutStructurePolicy;
|
||||
int mPos;
|
||||
bool mHasNextShortcutTarget;
|
||||
};
|
||||
|
||||
TerminalAttributes(const BinaryDictionaryInfo *const binaryDictionaryInfo,
|
||||
TerminalAttributes(const DictionaryShortcutsStructurePolicy *const shortcutStructurePolicy,
|
||||
const int shortcutPos)
|
||||
: mBinaryDictionaryInfo(binaryDictionaryInfo), mShortcutListSizePos(shortcutPos) {}
|
||||
: mShortcutStructurePolicy(shortcutStructurePolicy),
|
||||
mShortcutListSizePos(shortcutPos) {}
|
||||
|
||||
inline ShortcutIterator getShortcutIterator() const {
|
||||
int shortcutPos = mShortcutListSizePos;
|
||||
const bool hasShortcutList = shortcutPos != NOT_A_DICT_POS;
|
||||
if (hasShortcutList) {
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::getShortcutListSizeAndForwardPointer(
|
||||
mBinaryDictionaryInfo, &shortcutPos);
|
||||
shortcutPos = mShortcutStructurePolicy->getStartPos(shortcutPos);
|
||||
}
|
||||
// shortcutPos is never used if hasShortcutList is false.
|
||||
return ShortcutIterator(mBinaryDictionaryInfo, shortcutPos, hasShortcutList);
|
||||
return ShortcutIterator(mShortcutStructurePolicy, shortcutPos, hasShortcutList);
|
||||
}
|
||||
|
||||
private:
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(TerminalAttributes);
|
||||
const BinaryDictionaryInfo *const mBinaryDictionaryInfo;
|
||||
const DictionaryShortcutsStructurePolicy *const mShortcutStructurePolicy;
|
||||
const int mShortcutListSizePos;
|
||||
};
|
||||
} // namespace latinime
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LATINIME_DICTIONARY_SHORTCUTS_STRUCTURE_POLICY_H
|
||||
#define LATINIME_DICTIONARY_SHORTCUTS_STRUCTURE_POLICY_H
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
/*
|
||||
* This class abstracts structure of shortcuts.
|
||||
*/
|
||||
class DictionaryShortcutsStructurePolicy {
|
||||
public:
|
||||
virtual ~DictionaryShortcutsStructurePolicy() {}
|
||||
|
||||
virtual int getStartPos(const int pos) const = 0;
|
||||
|
||||
virtual void getNextShortcut(const int maxCodePointCount, int *const outCodePoint,
|
||||
int *const outCodePointCount, bool *const outIsWhitelist, bool *const outHasNext,
|
||||
int *const pos) const = 0;
|
||||
|
||||
virtual void skipAllShortcuts(int *const pos) const = 0;
|
||||
|
||||
protected:
|
||||
DictionaryShortcutsStructurePolicy() {}
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(DictionaryShortcutsStructurePolicy);
|
||||
};
|
||||
} // namespace latinime
|
||||
#endif /* LATINIME_DICTIONARY_SHORTCUTS_STRUCTURE_POLICY_H */
|
|
@ -24,6 +24,7 @@ namespace latinime {
|
|||
class DicNode;
|
||||
class DicNodeVector;
|
||||
class DictionaryBigramsStructurePolicy;
|
||||
class DictionaryShortcutsStructurePolicy;
|
||||
|
||||
/*
|
||||
* This class abstracts structure of dictionaries.
|
||||
|
@ -66,6 +67,8 @@ class DictionaryStructureWithBufferPolicy {
|
|||
|
||||
virtual const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const = 0;
|
||||
|
||||
virtual const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const = 0;
|
||||
|
||||
protected:
|
||||
DictionaryStructureWithBufferPolicy() {}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "suggest/core/dicnode/dic_node.h"
|
||||
#include "suggest/core/dicnode/dic_node_priority_queue.h"
|
||||
#include "suggest/core/dicnode/dic_node_vector.h"
|
||||
// TODO: Use DictionaryStructurePolicy instead of BinaryDictionaryInfo.
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/core/dictionary/dictionary.h"
|
||||
#include "suggest/core/dictionary/digraph_utils.h"
|
||||
|
@ -211,11 +212,11 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen
|
|||
}
|
||||
|
||||
if (!terminalDicNode->hasMultipleWords()) {
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo =
|
||||
traverseSession->getBinaryDictionaryInfo();
|
||||
const TerminalAttributes terminalAttributes(traverseSession->getBinaryDictionaryInfo(),
|
||||
binaryDictionaryInfo->getStructurePolicy()->getShortcutPositionOfNode(
|
||||
terminalDicNode->getPos()));
|
||||
const DictionaryStructureWithBufferPolicy *const structurePolicy =
|
||||
traverseSession->getBinaryDictionaryInfo()->getStructurePolicy();
|
||||
const TerminalAttributes terminalAttributes(
|
||||
structurePolicy->getShortcutsStructurePolicy(),
|
||||
structurePolicy->getShortcutPositionOfNode(terminalDicNode->getPos()));
|
||||
// Shortcut is not supported for multiple words suggestions.
|
||||
// TODO: Check shortcuts during traversal for multiple words suggestions.
|
||||
const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode);
|
||||
|
|
|
@ -28,11 +28,9 @@ namespace latinime {
|
|||
const BinaryDictionaryInfo *const binaryDictionaryInfo) {
|
||||
switch (binaryDictionaryInfo->getFormat()) {
|
||||
case BinaryDictionaryFormatUtils::VERSION_2:
|
||||
return new PatriciaTriePolicy(binaryDictionaryInfo->getDictRoot(),
|
||||
binaryDictionaryInfo);
|
||||
return new PatriciaTriePolicy(binaryDictionaryInfo->getDictRoot());
|
||||
case BinaryDictionaryFormatUtils::VERSION_3:
|
||||
return new DynamicPatriciaTriePolicy(binaryDictionaryInfo->getDictRoot(),
|
||||
binaryDictionaryInfo);
|
||||
return new DynamicPatriciaTriePolicy(binaryDictionaryInfo->getDictRoot());
|
||||
default:
|
||||
ASSERT(false);
|
||||
return 0;
|
||||
|
|
|
@ -16,42 +16,40 @@
|
|||
|
||||
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h"
|
||||
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_terminal_attributes_reading_utils.h"
|
||||
#include "suggest/core/policy/dictionary_bigrams_structure_policy.h"
|
||||
#include "suggest/core/policy/dictionary_shortcuts_structure_policy.h"
|
||||
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
void DynamicPatriciaTrieNodeReader::fetchNodeInfoFromBufferAndProcessMovedNode(const int nodePos,
|
||||
const int maxCodePointCount, int *const outCodePoints) {
|
||||
const uint8_t *const dictRoot = mBinaryDictionaryInfo->getDictRoot();
|
||||
int pos = nodePos;
|
||||
mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos);
|
||||
mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos);
|
||||
const int parentPos =
|
||||
DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictRoot, &pos);
|
||||
DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(mDictRoot, &pos);
|
||||
mParentPos = (parentPos != 0) ? mNodePos + parentPos : NOT_A_DICT_POS;
|
||||
if (outCodePoints != 0) {
|
||||
mCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition(
|
||||
dictRoot, mFlags, maxCodePointCount, outCodePoints, &pos);
|
||||
mDictRoot, mFlags, maxCodePointCount, outCodePoints, &pos);
|
||||
} else {
|
||||
mCodePointCount = PatriciaTrieReadingUtils::skipCharacters(
|
||||
dictRoot, mFlags, MAX_WORD_LENGTH, &pos);
|
||||
mDictRoot, mFlags, MAX_WORD_LENGTH, &pos);
|
||||
}
|
||||
if (isTerminal()) {
|
||||
mProbability = PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(dictRoot, &pos);
|
||||
mProbability = PatriciaTrieReadingUtils::readProbabilityAndAdvancePosition(mDictRoot, &pos);
|
||||
} else {
|
||||
mProbability = NOT_A_PROBABILITY;
|
||||
}
|
||||
if (hasChildren()) {
|
||||
mChildrenPos = DynamicPatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(
|
||||
dictRoot, mFlags, &pos);
|
||||
mDictRoot, mFlags, &pos);
|
||||
} else {
|
||||
mChildrenPos = NOT_A_DICT_POS;
|
||||
}
|
||||
if (PatriciaTrieReadingUtils::hasShortcutTargets(mFlags)) {
|
||||
mShortcutPos = pos;
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(mBinaryDictionaryInfo, &pos);
|
||||
mShortcutsPolicy->skipAllShortcuts(&pos);
|
||||
} else {
|
||||
mShortcutPos = NOT_A_DICT_POS;
|
||||
}
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
|
||||
namespace latinime {
|
||||
|
||||
class BinaryDictionaryInfo;
|
||||
class DictionaryBigramsStructurePolicy;
|
||||
class DictionaryShortcutsStructurePolicy;
|
||||
|
||||
/*
|
||||
* This class is used for helping to read nodes of dynamic patricia trie. This class handles moved
|
||||
|
@ -34,13 +34,14 @@ class DictionaryBigramsStructurePolicy;
|
|||
*/
|
||||
class DynamicPatriciaTrieNodeReader {
|
||||
public:
|
||||
DynamicPatriciaTrieNodeReader(const BinaryDictionaryInfo *const binaryDictionaryInfo,
|
||||
const DictionaryBigramsStructurePolicy *const bigramsPolicy)
|
||||
: mBinaryDictionaryInfo(binaryDictionaryInfo), mBigramsPolicy(bigramsPolicy),
|
||||
mNodePos(NOT_A_VALID_WORD_POS), mFlags(0), mParentPos(NOT_A_DICT_POS),
|
||||
mCodePointCount(0), mProbability(NOT_A_PROBABILITY), mChildrenPos(NOT_A_DICT_POS),
|
||||
mShortcutPos(NOT_A_DICT_POS), mBigramPos(NOT_A_DICT_POS),
|
||||
mSiblingPos(NOT_A_VALID_WORD_POS) {}
|
||||
DynamicPatriciaTrieNodeReader(const uint8_t *const dictRoot,
|
||||
const DictionaryBigramsStructurePolicy *const bigramsPolicy,
|
||||
const DictionaryShortcutsStructurePolicy *const shortcutsPolicy)
|
||||
: mDictRoot(dictRoot), mBigramsPolicy(bigramsPolicy),
|
||||
mShortcutsPolicy(shortcutsPolicy), mNodePos(NOT_A_VALID_WORD_POS), mFlags(0),
|
||||
mParentPos(NOT_A_DICT_POS), mCodePointCount(0), mProbability(NOT_A_PROBABILITY),
|
||||
mChildrenPos(NOT_A_DICT_POS), mShortcutPos(NOT_A_DICT_POS),
|
||||
mBigramPos(NOT_A_DICT_POS), mSiblingPos(NOT_A_VALID_WORD_POS) {}
|
||||
|
||||
~DynamicPatriciaTrieNodeReader() {}
|
||||
|
||||
|
@ -120,8 +121,10 @@ class DynamicPatriciaTrieNodeReader {
|
|||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(DynamicPatriciaTrieNodeReader);
|
||||
|
||||
const BinaryDictionaryInfo *const mBinaryDictionaryInfo;
|
||||
// TODO: Consolidate mDictRoot.
|
||||
const uint8_t *const mDictRoot;
|
||||
const DictionaryBigramsStructurePolicy *const mBigramsPolicy;
|
||||
const DictionaryShortcutsStructurePolicy *const mShortcutsPolicy;
|
||||
int mNodePos;
|
||||
DynamicPatriciaTrieReadingUtils::NodeFlags mFlags;
|
||||
int mParentPos;
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include "defines.h"
|
||||
#include "suggest/core/dicnode/dic_node.h"
|
||||
#include "suggest/core/dicnode/dic_node_vector.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.h"
|
||||
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h"
|
||||
#include "suggest/policyimpl/dictionary/patricia_trie_reading_utils.h"
|
||||
|
@ -34,7 +33,8 @@ void DynamicPatriciaTriePolicy::createAndGetAllChildNodes(const DicNode *const d
|
|||
if (!dicNode->hasChildren()) {
|
||||
return;
|
||||
}
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
int mergedNodeCodePoints[MAX_WORD_LENGTH];
|
||||
int nextPos = dicNode->getChildrenPos();
|
||||
int totalChildCount = 0;
|
||||
|
@ -79,7 +79,8 @@ int DynamicPatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCoun
|
|||
int mergedNodeCodePoints[maxCodePointCount];
|
||||
int codePointCount = 0;
|
||||
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
// First, read terminal node and get its probability.
|
||||
nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(nodePos, maxCodePointCount,
|
||||
mergedNodeCodePoints);
|
||||
|
@ -123,7 +124,8 @@ int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const in
|
|||
int mergedNodeCodePoints[MAX_WORD_LENGTH];
|
||||
int currentLength = 0;
|
||||
int pos = getRootPosition();
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
while (currentLength <= length) {
|
||||
// When foundMatchedNode becomes true, currentLength is increased at least once.
|
||||
bool foundMatchedNode = false;
|
||||
|
@ -194,7 +196,8 @@ int DynamicPatriciaTriePolicy::getUnigramProbability(const int nodePos) const {
|
|||
if (nodePos == NOT_A_VALID_WORD_POS) {
|
||||
return NOT_A_PROBABILITY;
|
||||
}
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
nodeReader.fetchNodeInfoFromBuffer(nodePos);
|
||||
if (nodeReader.isDeleted() || nodeReader.isBlacklisted() || nodeReader.isNotAWord()) {
|
||||
return NOT_A_PROBABILITY;
|
||||
|
@ -206,7 +209,8 @@ int DynamicPatriciaTriePolicy::getShortcutPositionOfNode(const int nodePos) cons
|
|||
if (nodePos == NOT_A_VALID_WORD_POS) {
|
||||
return NOT_A_DICT_POS;
|
||||
}
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
nodeReader.fetchNodeInfoFromBuffer(nodePos);
|
||||
if (nodeReader.isDeleted()) {
|
||||
return NOT_A_DICT_POS;
|
||||
|
@ -218,7 +222,8 @@ int DynamicPatriciaTriePolicy::getBigramsPositionOfNode(const int nodePos) const
|
|||
if (nodePos == NOT_A_VALID_WORD_POS) {
|
||||
return NOT_A_DICT_POS;
|
||||
}
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mBinaryDictionaryInfo, getBigramsStructurePolicy());
|
||||
DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
|
||||
getShortcutsStructurePolicy());
|
||||
nodeReader.fetchNodeInfoFromBuffer(nodePos);
|
||||
if (nodeReader.isDeleted()) {
|
||||
return NOT_A_DICT_POS;
|
||||
|
|
|
@ -22,19 +22,17 @@
|
|||
#include "defines.h"
|
||||
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
|
||||
#include "suggest/policyimpl/dictionary/bigram/bigram_list_policy.h"
|
||||
#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
class BinaryDictionaryInfo;
|
||||
class DicNode;
|
||||
class DicNodeVector;
|
||||
|
||||
class DynamicPatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
||||
public:
|
||||
DynamicPatriciaTriePolicy(const uint8_t *const dictRoot,
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo)
|
||||
: mDictRoot(dictRoot), mBinaryDictionaryInfo(binaryDictionaryInfo),
|
||||
mBigramListPolicy(dictRoot) {}
|
||||
DynamicPatriciaTriePolicy(const uint8_t *const dictRoot)
|
||||
: mDictRoot(dictRoot), mBigramListPolicy(dictRoot), mShortcutListPolicy(dictRoot) {}
|
||||
|
||||
~DynamicPatriciaTriePolicy() {}
|
||||
|
||||
|
@ -62,14 +60,18 @@ class DynamicPatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
|||
return &mBigramListPolicy;
|
||||
}
|
||||
|
||||
const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
|
||||
return &mShortcutListPolicy;
|
||||
}
|
||||
|
||||
private:
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicPatriciaTriePolicy);
|
||||
static const int MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP;
|
||||
|
||||
// TODO: Consolidate mDictRoot.
|
||||
const uint8_t *const mDictRoot;
|
||||
// TODO: remove
|
||||
const BinaryDictionaryInfo *const mBinaryDictionaryInfo;
|
||||
const BigramListPolicy mBigramListPolicy;
|
||||
const ShortcutListPolicy mShortcutListPolicy;
|
||||
};
|
||||
} // namespace latinime
|
||||
#endif // LATINIME_DYNAMIC_PATRICIA_TRIE_POLICY_H
|
||||
|
|
|
@ -20,8 +20,6 @@
|
|||
#include "defines.h"
|
||||
#include "suggest/core/dicnode/dic_node.h"
|
||||
#include "suggest/core/dicnode/dic_node_vector.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_info.h"
|
||||
#include "suggest/core/dictionary/binary_dictionary_terminal_attributes_reading_utils.h"
|
||||
#include "suggest/policyimpl/dictionary/binary_format.h"
|
||||
#include "suggest/policyimpl/dictionary/patricia_trie_reading_utils.h"
|
||||
|
||||
|
@ -112,7 +110,7 @@ int PatriciaTriePolicy::getBigramsPositionOfNode(const int nodePos) const {
|
|||
PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(mDictRoot, flags, &pos);
|
||||
}
|
||||
if (PatriciaTrieReadingUtils::hasShortcutTargets(flags)) {
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(mBinaryDictionaryInfo, &pos);
|
||||
mShortcutListPolicy.skipAllShortcuts(&pos);;
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
@ -133,7 +131,7 @@ int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNod
|
|||
PatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition(
|
||||
mDictRoot, flags, &pos) : NOT_A_DICT_POS;
|
||||
if (PatriciaTrieReadingUtils::hasShortcutTargets(flags)) {
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::skipShortcuts(mBinaryDictionaryInfo, &pos);
|
||||
getShortcutsStructurePolicy()->skipAllShortcuts(&pos);
|
||||
}
|
||||
if (PatriciaTrieReadingUtils::hasBigrams(flags)) {
|
||||
getBigramsStructurePolicy()->skipAllBigrams(&pos);
|
||||
|
|
|
@ -22,19 +22,17 @@
|
|||
#include "defines.h"
|
||||
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
|
||||
#include "suggest/policyimpl/dictionary/bigram/bigram_list_policy.h"
|
||||
#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_policy.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
class BinaryDictionaryInfo;
|
||||
class DicNode;
|
||||
class DicNodeVector;
|
||||
|
||||
class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
||||
public:
|
||||
PatriciaTriePolicy(const uint8_t *const dictRoot,
|
||||
const BinaryDictionaryInfo *const binaryDictionaryInfo)
|
||||
: mDictRoot(dictRoot), mBinaryDictionaryInfo(binaryDictionaryInfo),
|
||||
mBigramListPolicy(dictRoot) {}
|
||||
PatriciaTriePolicy(const uint8_t *const dictRoot)
|
||||
: mDictRoot(dictRoot), mBigramListPolicy(dictRoot), mShortcutListPolicy(dictRoot) {}
|
||||
|
||||
~PatriciaTriePolicy() {}
|
||||
|
||||
|
@ -62,13 +60,16 @@ class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
|
|||
return &mBigramListPolicy;
|
||||
}
|
||||
|
||||
const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
|
||||
return &mShortcutListPolicy;
|
||||
}
|
||||
|
||||
private:
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(PatriciaTriePolicy);
|
||||
|
||||
const uint8_t *const mDictRoot;
|
||||
// TODO: remove
|
||||
const BinaryDictionaryInfo *const mBinaryDictionaryInfo;
|
||||
const BigramListPolicy mBigramListPolicy;
|
||||
const ShortcutListPolicy mShortcutListPolicy;
|
||||
|
||||
int createAndGetLeavingChildNode(const DicNode *const dicNode, const int nodePos,
|
||||
const NodeFilter *const nodeFilter, DicNodeVector *const childDicNodes) const;
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LATINIME_SHORTCUT_LIST_POLICY_H
|
||||
#define LATINIME_SHORTCUT_LIST_POLICY_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "suggest/core/policy/dictionary_shortcuts_structure_policy.h"
|
||||
// TODO: Move shortcuts reading methods to policyimpl.
|
||||
#include "suggest/core/dictionary/binary_dictionary_terminal_attributes_reading_utils.h"
|
||||
|
||||
namespace latinime {
|
||||
|
||||
class ShortcutListPolicy : public DictionaryShortcutsStructurePolicy {
|
||||
public:
|
||||
explicit ShortcutListPolicy(const uint8_t *const shortcutBuf)
|
||||
: mShortcutsBuf(shortcutBuf) {}
|
||||
|
||||
~ShortcutListPolicy() {}
|
||||
|
||||
int getStartPos(const int pos) const {
|
||||
int listPos = pos;
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::getShortcutListSizeAndForwardPointer(
|
||||
mShortcutsBuf, &listPos);
|
||||
return listPos;
|
||||
}
|
||||
|
||||
void getNextShortcut(const int maxCodePointCount, int *const outCodePoint,
|
||||
int *const outCodePointCount, bool *const outIsWhitelist, bool *const outHasNext,
|
||||
int *const pos) const {
|
||||
const BinaryDictionaryTerminalAttributesReadingUtils::ShortcutFlags flags =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::getFlagsAndForwardPointer(
|
||||
mShortcutsBuf, pos);
|
||||
if (outHasNext) {
|
||||
*outHasNext = BinaryDictionaryTerminalAttributesReadingUtils::hasNext(flags);
|
||||
}
|
||||
if (outIsWhitelist) {
|
||||
*outIsWhitelist =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::isWhitelist(flags);
|
||||
}
|
||||
if (outCodePoint) {
|
||||
*outCodePointCount =
|
||||
BinaryDictionaryTerminalAttributesReadingUtils::readShortcutTarget(
|
||||
mShortcutsBuf, maxCodePointCount, outCodePoint, pos);
|
||||
}
|
||||
}
|
||||
|
||||
void skipAllShortcuts(int *const pos) const {
|
||||
const int shortcutListSize = BinaryDictionaryTerminalAttributesReadingUtils
|
||||
::getShortcutListSizeAndForwardPointer(mShortcutsBuf, pos);
|
||||
*pos += shortcutListSize;
|
||||
}
|
||||
|
||||
private:
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(ShortcutListPolicy);
|
||||
|
||||
const uint8_t *const mShortcutsBuf;
|
||||
};
|
||||
} // namespace latinime
|
||||
#endif // LATINIME_SHORTCUT_LIST_POLICY_H
|
Loading…
Reference in a new issue