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