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