1 /* 2 * Copyright (C) 2012 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_TERMINAL_ATTRIBUTES_H 18 #define LATINIME_TERMINAL_ATTRIBUTES_H 19 20 #include "unigram_dictionary.h" 21 22 namespace latinime { 23 24 /** 25 * This class encapsulates information about a terminal that allows to 26 * retrieve local node attributes like the list of shortcuts without 27 * exposing the format structure to the client. 28 */ 29 class TerminalAttributes { 30 public: 31 class ShortcutIterator { 32 const uint8_t* const mDict; 33 bool mHasNextShortcutTarget; 34 int mPos; 35 36 public: 37 ShortcutIterator(const uint8_t* dict, const int pos, const uint8_t flags) : mDict(dict), 38 mPos(pos) { 39 mHasNextShortcutTarget = (0 != (flags & UnigramDictionary::FLAG_HAS_SHORTCUT_TARGETS)); 40 } 41 42 inline bool hasNextShortcutTarget() const { 43 return mHasNextShortcutTarget; 44 } 45 46 // Gets the shortcut target itself as a uint16_t string. For parameters and return value 47 // see BinaryFormat::getWordAtAddress. 48 // TODO: make the output an uint32_t* to handle the whole unicode range. 49 inline int getNextShortcutTarget(const int maxDepth, uint16_t* outWord) { 50 const int shortcutFlags = BinaryFormat::getFlagsAndForwardPointer(mDict, &mPos); 51 mHasNextShortcutTarget = 52 0 != (shortcutFlags & UnigramDictionary::FLAG_ATTRIBUTE_HAS_NEXT); 53 unsigned int i; 54 for (i = 0; i < MAX_WORD_LENGTH_INTERNAL; ++i) { 55 const int charCode = BinaryFormat::getCharCodeAndForwardPointer(mDict, &mPos); 56 if (NOT_A_CHARACTER == charCode) break; 57 outWord[i] = (uint16_t)charCode; 58 } 59 mPos += BinaryFormat::CHARACTER_ARRAY_TERMINATOR_SIZE; 60 return i; 61 } 62 }; 63 64 private: 65 const uint8_t* const mDict; 66 const uint8_t mFlags; 67 const int mStartPos; 68 69 public: 70 TerminalAttributes(const uint8_t* const dict, const uint8_t flags, const int pos) : 71 mDict(dict), mFlags(flags), mStartPos(pos) { 72 } 73 74 inline ShortcutIterator getShortcutIterator() const { 75 // The size of the shortcuts is stored here so that the whole shortcut chunk can be 76 // skipped quickly, so we ignore it. 77 return ShortcutIterator(mDict, mStartPos + BinaryFormat::SHORTCUT_LIST_SIZE_SIZE, mFlags); 78 } 79 }; 80 } // namespace latinime 81 82 #endif // LATINIME_TERMINAL_ATTRIBUTES_H 83