| Index: third_party/android_prediction/suggest/core/dicnode/internal/dic_node_state_output.h
|
| diff --git a/third_party/android_prediction/suggest/core/dicnode/internal/dic_node_state_output.h b/third_party/android_prediction/suggest/core/dicnode/internal/dic_node_state_output.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b7bf7c1abb24c81925489e7a75f7adc8ce68e45e
|
| --- /dev/null
|
| +++ b/third_party/android_prediction/suggest/core/dicnode/internal/dic_node_state_output.h
|
| @@ -0,0 +1,151 @@
|
| +/*
|
| + * Copyright (C) 2012 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_DIC_NODE_STATE_OUTPUT_H
|
| +#define LATINIME_DIC_NODE_STATE_OUTPUT_H
|
| +
|
| +#include <algorithm>
|
| +#include <cstdint>
|
| +#include <cstring> // for memmove()
|
| +
|
| +#include "third_party/android_prediction/defines.h"
|
| +
|
| +namespace latinime {
|
| +
|
| +// Class to have information to be output. This can contain previous words when the suggestion
|
| +// is a multi-word suggestion.
|
| +class DicNodeStateOutput {
|
| + public:
|
| + DicNodeStateOutput()
|
| + : mOutputtedCodePointCount(0), mCurrentWordStart(0), mPrevWordCount(0),
|
| + mPrevWordsLength(0), mPrevWordStart(0), mSecondWordFirstInputIndex(NOT_AN_INDEX) {}
|
| +
|
| + ~DicNodeStateOutput() {}
|
| +
|
| + // Init for root
|
| + void init() {
|
| + mOutputtedCodePointCount = 0;
|
| + mCurrentWordStart = 0;
|
| + mOutputCodePoints[0] = 0;
|
| + mPrevWordCount = 0;
|
| + mPrevWordsLength = 0;
|
| + mPrevWordStart = 0;
|
| + mSecondWordFirstInputIndex = NOT_AN_INDEX;
|
| + }
|
| +
|
| + // Init for next word.
|
| + void init(const DicNodeStateOutput *const stateOutput) {
|
| + mOutputtedCodePointCount = stateOutput->mOutputtedCodePointCount + 1;
|
| + memmove(mOutputCodePoints, stateOutput->mOutputCodePoints,
|
| + stateOutput->mOutputtedCodePointCount * sizeof(mOutputCodePoints[0]));
|
| + mOutputCodePoints[stateOutput->mOutputtedCodePointCount] = KEYCODE_SPACE;
|
| + mCurrentWordStart = stateOutput->mOutputtedCodePointCount + 1;
|
| + mPrevWordCount = std::min(static_cast<int16_t>(stateOutput->mPrevWordCount + 1),
|
| + static_cast<int16_t>(MAX_RESULTS));
|
| + mPrevWordsLength = stateOutput->mOutputtedCodePointCount + 1;
|
| + mPrevWordStart = stateOutput->mCurrentWordStart;
|
| + mSecondWordFirstInputIndex = stateOutput->mSecondWordFirstInputIndex;
|
| + }
|
| +
|
| + void initByCopy(const DicNodeStateOutput *const stateOutput) {
|
| + memmove(mOutputCodePoints, stateOutput->mOutputCodePoints,
|
| + stateOutput->mOutputtedCodePointCount * sizeof(mOutputCodePoints[0]));
|
| + mOutputtedCodePointCount = stateOutput->mOutputtedCodePointCount;
|
| + if (mOutputtedCodePointCount < MAX_WORD_LENGTH) {
|
| + mOutputCodePoints[mOutputtedCodePointCount] = 0;
|
| + }
|
| + mCurrentWordStart = stateOutput->mCurrentWordStart;
|
| + mPrevWordCount = stateOutput->mPrevWordCount;
|
| + mPrevWordsLength = stateOutput->mPrevWordsLength;
|
| + mPrevWordStart = stateOutput->mPrevWordStart;
|
| + mSecondWordFirstInputIndex = stateOutput->mSecondWordFirstInputIndex;
|
| + }
|
| +
|
| + void addMergedNodeCodePoints(const uint16_t mergedNodeCodePointCount,
|
| + const int *const mergedNodeCodePoints) {
|
| + if (mergedNodeCodePoints) {
|
| + const int additionalCodePointCount = std::min(
|
| + static_cast<int>(mergedNodeCodePointCount),
|
| + MAX_WORD_LENGTH - mOutputtedCodePointCount);
|
| + memmove(&mOutputCodePoints[mOutputtedCodePointCount], mergedNodeCodePoints,
|
| + additionalCodePointCount * sizeof(mOutputCodePoints[0]));
|
| + mOutputtedCodePointCount = static_cast<uint16_t>(
|
| + mOutputtedCodePointCount + additionalCodePointCount);
|
| + if (mOutputtedCodePointCount < MAX_WORD_LENGTH) {
|
| + mOutputCodePoints[mOutputtedCodePointCount] = 0;
|
| + }
|
| + }
|
| + }
|
| +
|
| + int getCurrentWordCodePointAt(const int index) const {
|
| + return mOutputCodePoints[mCurrentWordStart + index];
|
| + }
|
| +
|
| + const int *getCodePointBuf() const {
|
| + return mOutputCodePoints;
|
| + }
|
| +
|
| + void setSecondWordFirstInputIndex(const int inputIndex) {
|
| + mSecondWordFirstInputIndex = inputIndex;
|
| + }
|
| +
|
| + int getSecondWordFirstInputIndex() const {
|
| + return mSecondWordFirstInputIndex;
|
| + }
|
| +
|
| + // TODO: remove
|
| + int16_t getPrevWordsLength() const {
|
| + return mPrevWordsLength;
|
| + }
|
| +
|
| + int16_t getPrevWordCount() const {
|
| + return mPrevWordCount;
|
| + }
|
| +
|
| + int16_t getPrevWordStart() const {
|
| + return mPrevWordStart;
|
| + }
|
| +
|
| + int getOutputCodePointAt(const int id) const {
|
| + return mOutputCodePoints[id];
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(DicNodeStateOutput);
|
| +
|
| + // When the DicNode represents "this is a pen":
|
| + // mOutputtedCodePointCount is 13, which is total code point count of "this is a pen" including
|
| + // spaces.
|
| + // mCurrentWordStart indicates the head of "pen", thus it is 10.
|
| + // This contains 3 previous words, "this", "is" and "a"; thus, mPrevWordCount is 3.
|
| + // mPrevWordsLength is length of "this is a ", which is 10.
|
| + // mPrevWordStart is the start index of "a"; thus, it is 8.
|
| + // mSecondWordFirstInputIndex is the first input index of "is".
|
| +
|
| + uint16_t mOutputtedCodePointCount;
|
| + int mOutputCodePoints[MAX_WORD_LENGTH];
|
| + int16_t mCurrentWordStart;
|
| + // Previous word count in mOutputCodePoints.
|
| + int16_t mPrevWordCount;
|
| + // Total length of previous words in mOutputCodePoints. This is being used by the algorithm
|
| + // that may want to look at the previous word information.
|
| + int16_t mPrevWordsLength;
|
| + // Start index of the previous word in mOutputCodePoints. This is being used for auto commit.
|
| + int16_t mPrevWordStart;
|
| + int mSecondWordFirstInputIndex;
|
| +};
|
| +} // namespace latinime
|
| +#endif // LATINIME_DIC_NODE_STATE_OUTPUT_H
|
|
|