1a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi/*
2a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * Copyright (C) 2013 The Android Open Source Project
3a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi *
4a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License");
5a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * you may not use this file except in compliance with the License.
6a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * You may obtain a copy of the License at
7a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi *
8a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi *      http://www.apache.org/licenses/LICENSE-2.0
9a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi *
10a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software
11a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS,
12a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * See the License for the specific language governing permissions and
14a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi * limitations under the License.
15a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi */
16a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi
17f1e383ed454b4115436d2ce7429ab944560a19a4Keisuke Kuroyanagi#include "suggest/policyimpl/dictionary/shortcut/shortcut_list_reading_utils.h"
18a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi
199ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/utils/byte_array_utils.h"
209ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi
21a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynaginamespace latinime {
22a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi
23a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi// Flag for presence of more attributes
24f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagiconst ShortcutListReadingUtils::ShortcutFlags
25f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi        ShortcutListReadingUtils::FLAG_ATTRIBUTE_HAS_NEXT = 0x80;
26a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi// Mask for attribute probability, stored on 4 bits inside the flags byte.
27f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagiconst ShortcutListReadingUtils::ShortcutFlags
28f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi        ShortcutListReadingUtils::MASK_ATTRIBUTE_PROBABILITY = 0x0F;
29f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagiconst int ShortcutListReadingUtils::SHORTCUT_LIST_SIZE_FIELD_SIZE = 2;
305ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi// The numeric value of the shortcut probability that means 'whitelist'.
31f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagiconst int ShortcutListReadingUtils::WHITELIST_SHORTCUT_PROBABILITY = 15;
32a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi
339ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi/* static */ ShortcutListReadingUtils::ShortcutFlags
349ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi        ShortcutListReadingUtils::getFlagsAndForwardPointer(const uint8_t *const dictRoot,
359ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi                int *const pos) {
369ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi    return ByteArrayUtils::readUint8AndAdvancePosition(dictRoot, pos);
379ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi}
389ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi
399ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi/* static */ int ShortcutListReadingUtils::getShortcutListSizeAndForwardPointer(
409ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi        const uint8_t *const dictRoot, int *const pos) {
419ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi    // readUint16andAdvancePosition() returns an offset *including* the uint16 field itself.
429ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi    return ByteArrayUtils::readUint16AndAdvancePosition(dictRoot, pos)
439ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi            - SHORTCUT_LIST_SIZE_FIELD_SIZE;
449ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi}
459ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi
469ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi/* static */ int ShortcutListReadingUtils::readShortcutTarget(
479ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi        const uint8_t *const dictRoot, const int maxLength,  int *const outWord, int *const pos) {
489ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi    return ByteArrayUtils::readStringAndAdvancePosition(dictRoot, maxLength, outWord, pos);
499ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi}
509ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi
51a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi} // namespace latinime
52