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