1cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi/* 2cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Copyright (C) 2013, The Android Open Source Project 3cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 4cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License"); 5cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * you may not use this file except in compliance with the License. 6cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * You may obtain a copy of the License at 7cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 8cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * http://www.apache.org/licenses/LICENSE-2.0 9cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 10cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software 11cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS, 12cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * See the License for the specific language governing permissions and 14cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * limitations under the License. 15cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi */ 16cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 1788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/dynamic_pt_reading_utils.h" 18cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 19cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi#include "defines.h" 2088bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/byte_array_utils.h" 21cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 22cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynaginamespace latinime { 23cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 242fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst DynamicPtReadingUtils::NodeFlags DynamicPtReadingUtils::MASK_MOVED = 0xC0; 252fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst DynamicPtReadingUtils::NodeFlags DynamicPtReadingUtils::FLAG_IS_NOT_MOVED = 0xC0; 262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst DynamicPtReadingUtils::NodeFlags DynamicPtReadingUtils::FLAG_IS_MOVED = 0x40; 272fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst DynamicPtReadingUtils::NodeFlags DynamicPtReadingUtils::FLAG_IS_DELETED = 0x80; 282fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst DynamicPtReadingUtils::NodeFlags DynamicPtReadingUtils::FLAG_WILL_BECOME_NON_TERMINAL = 0x00; 29cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 30f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi// TODO: Make DICT_OFFSET_ZERO_OFFSET = 0. 31f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi// Currently, DICT_OFFSET_INVALID is 0 in Java side but offset can be 0 during GC. So, the maximum 32f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi// value of offsets, which is 0x7FFFFF is used to represent 0 offset. 332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst int DynamicPtReadingUtils::DICT_OFFSET_INVALID = 0; 342fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaconst int DynamicPtReadingUtils::DICT_OFFSET_ZERO_OFFSET = 0x7FFFFF; 35f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi 362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ int DynamicPtReadingUtils::getForwardLinkPosition(const uint8_t *const buffer, 379ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi const int pos) { 389ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi int linkAddressPos = pos; 399ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi return ByteArrayUtils::readSint24AndAdvancePosition(buffer, &linkAddressPos); 409ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi} 419ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi 422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ int DynamicPtReadingUtils::getParentPtNodePosOffsetAndAdvancePosition( 43f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi const uint8_t *const buffer, int *const pos) { 449ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi return ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos); 459ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi} 469ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi 472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ int DynamicPtReadingUtils::getParentPtNodePos(const int parentOffset, 482fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int ptNodePos) { 49f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi if (parentOffset == DICT_OFFSET_INVALID) { 50f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi return NOT_A_DICT_POS; 51f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi } else if (parentOffset == DICT_OFFSET_ZERO_OFFSET) { 52f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi return ptNodePos; 53f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi } else { 54f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi return parentOffset + ptNodePos; 55f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi } 56f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi} 57f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi 582fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ int DynamicPtReadingUtils::readChildrenPositionAndAdvancePosition( 591c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi const uint8_t *const buffer, int *const pos) { 601c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi const int base = *pos; 611c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi const int offset = ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos); 62f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi if (offset == DICT_OFFSET_INVALID) { 63f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi // The PtNode does not have children. 64cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi return NOT_A_DICT_POS; 65f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi } else if (offset == DICT_OFFSET_ZERO_OFFSET) { 66f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi return base; 671c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi } else { 681c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi return base + offset; 69cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi } 70cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi} 71cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 72cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi} // namespace latinime 73