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