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 17f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi#ifndef LATINIME_SHORTCUT_LIST_READING_UTILS_H 18f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi#define LATINIME_SHORTCUT_LIST_READING_UTILS_H 19a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 20cafab169cdb21244c82b99c09983c98066113d87Ken Wakasa#include <cstdint> 21a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 22a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi#include "defines.h" 23a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 24a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynaginamespace latinime { 25a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 26f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagiclass ShortcutListReadingUtils { 27a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi public: 28f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi typedef uint8_t ShortcutFlags; 29a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 309ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi static ShortcutFlags getFlagsAndForwardPointer(const uint8_t *const dictRoot, int *const pos); 31a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 32f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi static AK_FORCE_INLINE int getProbabilityFromFlags(const ShortcutFlags flags) { 33a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi return flags & MASK_ATTRIBUTE_PROBABILITY; 34a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi } 35a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 36f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi static AK_FORCE_INLINE bool hasNext(const ShortcutFlags flags) { 37af9d92f590a51d3e5f493c75c2bbee9d9ce1cbfcKeisuke Kuroynagi return (flags & FLAG_ATTRIBUTE_HAS_NEXT) != 0; 38a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi } 39a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 405ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi // This method returns the size of the shortcut list region excluding the shortcut list size 415ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi // field at the beginning. 429ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi static int getShortcutListSizeAndForwardPointer(const uint8_t *const dictRoot, int *const pos); 435ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi 442f0c1253e288d0670416bf8fc45b77962e68e250Keisuke Kuroyanagi static AK_FORCE_INLINE int getShortcutListSizeFieldSize() { 452f0c1253e288d0670416bf8fc45b77962e68e250Keisuke Kuroyanagi return SHORTCUT_LIST_SIZE_FIELD_SIZE; 462f0c1253e288d0670416bf8fc45b77962e68e250Keisuke Kuroyanagi } 472f0c1253e288d0670416bf8fc45b77962e68e250Keisuke Kuroyanagi 48fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi static AK_FORCE_INLINE void skipShortcuts(const uint8_t *const dictRoot, int *const pos) { 49fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi const int shortcutListSize = getShortcutListSizeAndForwardPointer(dictRoot, pos); 505ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi *pos += shortcutListSize; 515ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi } 525ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi 535ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi static AK_FORCE_INLINE bool isWhitelist(const ShortcutFlags flags) { 545ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi return getProbabilityFromFlags(flags) == WHITELIST_SHORTCUT_PROBABILITY; 555ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi } 565ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi 579ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi static int readShortcutTarget(const uint8_t *const dictRoot, const int maxLength, 589ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi int *const outWord, int *const pos); 595ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi 60a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi private: 61f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi DISALLOW_IMPLICIT_CONSTRUCTORS(ShortcutListReadingUtils); 62a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi 63f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi static const ShortcutFlags FLAG_ATTRIBUTE_HAS_NEXT; 64f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi static const ShortcutFlags MASK_ATTRIBUTE_PROBABILITY; 655ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi static const int SHORTCUT_LIST_SIZE_FIELD_SIZE; 665ac44bdc2aea383550b60907130f38ee2277f979Keisuke Kuroynagi static const int WHITELIST_SHORTCUT_PROBABILITY; 67a71ed8caa27c4a0174f25750171282980bc26880Keisuke Kuroynagi}; 68f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi} // namespace latinime 69f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi#endif // LATINIME_SHORTCUT_LIST_READING_UTILS_H 70