16bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/* 26bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Copyright (C) 2013, The Android Open Source Project 36bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 46bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 56bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * you may not use this file except in compliance with the License. 66bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * You may obtain a copy of the License at 76bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 86bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 96bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 116bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 126bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * See the License for the specific language governing permissions and 146bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * limitations under the License. 156bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */ 166bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 176bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/* 186bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * !!!!! DO NOT EDIT THIS FILE !!!!! 196bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 206bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * This file was generated from 2188bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi * dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp 226bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */ 236bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h" 256bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 2688bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/header/header_policy.h" 2788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/dynamic_pt_reading_utils.h" 2888bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/patricia_trie_reading_utils.h" 2988bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/backward/v402/content/probability_dict_content.h" 3088bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/backward/v402/content/probability_entry.h" 3188bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/backward/v402/ver4_patricia_trie_reading_utils.h" 3288bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/buffer_with_extendable_buffer.h" 3388bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/forgetting_curve_utils.h" 346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace latinime { 366bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward { 3707e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanaginamespace v402 { 386bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiconst PtNodeParams Ver4PatriciaTrieNodeReader::fetchPtNodeInfoFromBufferAndProcessMovedPtNode( 406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int ptNodePos, const int siblingNodePos) const { 416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (ptNodePos < 0 || ptNodePos >= mBuffer->getTailPosition()) { 426bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // Reading invalid position because of bug or broken dictionary. 436bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi AKLOGE("Fetching PtNode info from invalid dictionary position: %d, dictionary size: %d", 446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi ptNodePos, mBuffer->getTailPosition()); 456bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi ASSERT(false); 466bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return PtNodeParams(); 476bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 486bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(ptNodePos); 496bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const uint8_t *const dictBuf = mBuffer->getBuffer(usesAdditionalBuffer); 506bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int pos = ptNodePos; 516bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int headPos = ptNodePos; 526bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 536bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi pos -= mBuffer->getOriginalBufferSize(); 546bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 556bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const PatriciaTrieReadingUtils::NodeFlags flags = 566bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); 576bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int parentPosOffset = 586bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi DynamicPtReadingUtils::getParentPtNodePosOffsetAndAdvancePosition( 596bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi dictBuf, &pos); 606bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int parentPos = 616bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi DynamicPtReadingUtils::getParentPtNodePos(parentPosOffset, headPos); 626bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int codePoints[MAX_WORD_LENGTH]; 63fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto const int codePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( 64fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto dictBuf, flags, MAX_WORD_LENGTH, mHeaderPolicy->getCodePointTable(), codePoints, &pos); 656bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int terminalIdFieldPos = NOT_A_DICT_POS; 666bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int terminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; 676bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int probability = NOT_A_PROBABILITY; 686bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (PatriciaTrieReadingUtils::isTerminal(flags)) { 696bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi terminalIdFieldPos = pos; 706bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 716bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi terminalIdFieldPos += mBuffer->getOriginalBufferSize(); 726bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 736bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi terminalId = Ver4PatriciaTrieReadingUtils::getTerminalIdAndAdvancePosition(dictBuf, &pos); 746bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const ProbabilityEntry probabilityEntry = 756bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi mProbabilityDictContent->getProbabilityEntry(terminalId); 766bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (probabilityEntry.hasHistoricalInfo()) { 776bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi probability = ForgettingCurveUtils::decodeProbability( 786bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi probabilityEntry.getHistoricalInfo(), mHeaderPolicy); 796bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } else { 806bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi probability = probabilityEntry.getProbability(); 816bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 826bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 836bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int childrenPosFieldPos = pos; 846bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 856bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi childrenPosFieldPos += mBuffer->getOriginalBufferSize(); 866bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 876bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int childrenPos = DynamicPtReadingUtils::readChildrenPositionAndAdvancePosition( 886bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi dictBuf, &pos); 896bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer && childrenPos != NOT_A_DICT_POS) { 906bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi childrenPos += mBuffer->getOriginalBufferSize(); 916bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 926bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 936bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi pos += mBuffer->getOriginalBufferSize(); 946bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 956bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // Sibling position is the tail position of original PtNode. 966bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int newSiblingNodePos = (siblingNodePos == NOT_A_DICT_POS) ? pos : siblingNodePos; 976bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // Read destination node if the read node is a moved node. 986bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (DynamicPtReadingUtils::isMoved(flags)) { 996bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // The destination position is stored at the same place as the parent position. 1006bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(parentPos, newSiblingNodePos); 1016bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } else { 102fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto return PtNodeParams(headPos, flags, parentPos, codePointCount, codePoints, 1036bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi terminalIdFieldPos, terminalId, probability, childrenPosFieldPos, childrenPos, 1046bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi newSiblingNodePos); 1056bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 1066bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} 1076bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 10807e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi} // namespace v402 1096bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward 1106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace latinime 111