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 
27 namespace latinime {
28 
29 class ShortcutListPolicy : public DictionaryShortcutsStructurePolicy {
30  public:
ShortcutListPolicy(const ReadOnlyByteArrayView buffer)31     explicit ShortcutListPolicy(const ReadOnlyByteArrayView buffer) : mBuffer(buffer) {}
32 
~ShortcutListPolicy()33     ~ShortcutListPolicy() {}
34 
getStartPos(const int pos)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 
getNextShortcut(const int maxCodePointCount,int * const outCodePoint,int * const outCodePointCount,bool * const outIsWhitelist,bool * const outHasNext,int * const pos)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 
skipAllShortcuts(int * const pos)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