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