138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka/*
238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project
338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License");
538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * you may not use this file except in compliance with the License.
638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * You may obtain a copy of the License at
738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *      http://www.apache.org/licenses/LICENSE-2.0
938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
1038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software
1138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS,
1238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * See the License for the specific language governing permissions and
1438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * limitations under the License.
1538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka */
1638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
1738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#ifndef LATINIME_DIC_NODE_STATE_OUTPUT_H
1838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#define LATINIME_DIC_NODE_STATE_OUTPUT_H
1938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include <cstring> // for memcpy()
2138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include <stdint.h>
2238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include "defines.h"
2438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokanamespace latinime {
2638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokaclass DicNodeStateOutput {
2838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka public:
296379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi    DicNodeStateOutput() : mOutputtedCodePointCount(0) {
3038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        init();
3138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
3238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
3338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    virtual ~DicNodeStateOutput() {}
3438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
3538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void init() {
366379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        mOutputtedCodePointCount = 0;
376379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        mCodePointsBuf[0] = 0;
3838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
3938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
4038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void init(const DicNodeStateOutput *const stateOutput) {
416379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        memcpy(mCodePointsBuf, stateOutput->mCodePointsBuf,
426379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi                stateOutput->mOutputtedCodePointCount * sizeof(mCodePointsBuf[0]));
436379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        mOutputtedCodePointCount = stateOutput->mOutputtedCodePointCount;
446379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        if (mOutputtedCodePointCount < MAX_WORD_LENGTH) {
456379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi            mCodePointsBuf[mOutputtedCodePointCount] = 0;
4638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
4738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
4838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
496379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi    void addMergedNodeCodePoints(const uint16_t mergedNodeCodePointCount,
506379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi            const int *const mergedNodeCodePoints) {
516379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        if (mergedNodeCodePoints) {
524a65258bc7c284ecf61ba6e4399a7012e71d7952Keisuke Kuroyanagi            const int additionalCodePointCount = min(static_cast<int>(mergedNodeCodePointCount),
534a65258bc7c284ecf61ba6e4399a7012e71d7952Keisuke Kuroyanagi                    MAX_WORD_LENGTH - mOutputtedCodePointCount);
546379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi            memcpy(&mCodePointsBuf[mOutputtedCodePointCount], mergedNodeCodePoints,
554a65258bc7c284ecf61ba6e4399a7012e71d7952Keisuke Kuroyanagi                    additionalCodePointCount * sizeof(mCodePointsBuf[0]));
566379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi            mOutputtedCodePointCount = static_cast<uint16_t>(
576379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi                    mOutputtedCodePointCount + mergedNodeCodePointCount);
586379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi            if (mOutputtedCodePointCount < MAX_WORD_LENGTH) {
596379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi                mCodePointsBuf[mOutputtedCodePointCount] = 0;
6038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            }
6138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
6238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
6338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
6438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // TODO: Remove
656379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi    int getCodePointAt(const int index) const {
666379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi        return mCodePointsBuf[index];
6738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
6838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
6938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // TODO: Move to private
706379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi    int mCodePointsBuf[MAX_WORD_LENGTH];
7138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
7238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka private:
7338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // Caution!!!
7438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // Use a default copy constructor and an assign operator because shallow copies are ok
7538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // for this class
766379a4de29fee7019b32b93bc424eda720e02dcfKeisuke Kuroynagi    uint16_t mOutputtedCodePointCount;
7738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka};
7838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka} // namespace latinime
7938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#endif // LATINIME_DIC_NODE_STATE_OUTPUT_H
80