1fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi/*
2fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * Copyright (C) 2013 The Android Open Source Project
3fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi *
4fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
5fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * you may not use this file except in compliance with the License.
6fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * You may obtain a copy of the License at
7fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi *
8fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
9fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi *
10fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
11fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
12fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * See the License for the specific language governing permissions and
14fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi * limitations under the License.
15fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi */
16fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
17fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi#ifndef LATINIME_SHORTCUT_LIST_POLICY_H
18fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi#define LATINIME_SHORTCUT_LIST_POLICY_H
19fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
20cafab169cdb21244c82b99c09983c98066113d87Ken Wakasa#include <cstdint>
21fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
22fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi#include "defines.h"
2388bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/interface/dictionary_shortcuts_structure_policy.h"
2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/shortcut/shortcut_list_reading_utils.h"
2559ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi#include "utils/byte_array_view.h"
26fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
27fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanaginamespace latinime {
28fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
29fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagiclass ShortcutListPolicy : public DictionaryShortcutsStructurePolicy {
30fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi public:
3159ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi    explicit ShortcutListPolicy(const ReadOnlyByteArrayView buffer) : mBuffer(buffer) {}
32fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
33fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    ~ShortcutListPolicy() {}
34fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
35fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    int getStartPos(const int pos) const {
36dfecc86f255538840461c1a30e98cf6eba445c2eKeisuke Kuroyanagi        if (pos == NOT_A_DICT_POS) {
37dfecc86f255538840461c1a30e98cf6eba445c2eKeisuke Kuroyanagi            return NOT_A_DICT_POS;
38dfecc86f255538840461c1a30e98cf6eba445c2eKeisuke Kuroyanagi        }
39fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        int listPos = pos;
4059ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi        ShortcutListReadingUtils::getShortcutListSizeAndForwardPointer(mBuffer, &listPos);
41fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        return listPos;
42fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    }
43fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
44fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    void getNextShortcut(const int maxCodePointCount, int *const outCodePoint,
45fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi            int *const outCodePointCount, bool *const outIsWhitelist, bool *const outHasNext,
46fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi            int *const pos) const {
47f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi        const ShortcutListReadingUtils::ShortcutFlags flags =
4859ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi                ShortcutListReadingUtils::getFlagsAndForwardPointer(mBuffer, pos);
49fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        if (outHasNext) {
50f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi            *outHasNext = ShortcutListReadingUtils::hasNext(flags);
51fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        }
52fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        if (outIsWhitelist) {
53f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi            *outIsWhitelist = ShortcutListReadingUtils::isWhitelist(flags);
54fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        }
55fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        if (outCodePoint) {
56f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi            *outCodePointCount = ShortcutListReadingUtils::readShortcutTarget(
5759ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi                    mBuffer, maxCodePointCount, outCodePoint, pos);
58fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        }
59fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    }
60fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
61fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    void skipAllShortcuts(int *const pos) const {
62f4688f8df09419dee4c3eaca47bce61967bd9926Keisuke Kuroyanagi        const int shortcutListSize = ShortcutListReadingUtils
6359ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi                ::getShortcutListSizeAndForwardPointer(mBuffer, pos);
64fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi        *pos += shortcutListSize;
65fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    }
66fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
67fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi private:
68fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi    DISALLOW_IMPLICIT_CONSTRUCTORS(ShortcutListPolicy);
69fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi
7059ebd5171820785f4c7b893f48df8b9d65cc4902Keisuke Kuroyanagi    const ReadOnlyByteArrayView mBuffer;
71fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi};
72fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi} // namespace latinime
73fd10db04e02ddad88d0c6fca82583493955a7c7eKeisuke Kuroyanagi#endif // LATINIME_SHORTCUT_LIST_POLICY_H
74