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 "binary_format.h" 21 22namespace 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 */ 29class TerminalAttributes { 30 public: 31 class ShortcutIterator { 32 const uint8_t *const mDict; 33 int mPos; 34 bool mHasNextShortcutTarget; 35 36 public: 37 ShortcutIterator(const uint8_t *dict, const int pos, const uint8_t flags) 38 : mDict(dict), mPos(pos), 39 mHasNextShortcutTarget(0 != (flags & BinaryFormat::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, int *outFreq) { 50 const int shortcutFlags = BinaryFormat::getFlagsAndForwardPointer(mDict, &mPos); 51 mHasNextShortcutTarget = 52 0 != (shortcutFlags & BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT); 53 unsigned int i; 54 for (i = 0; i < MAX_WORD_LENGTH_INTERNAL; ++i) { 55 const int codePoint = BinaryFormat::getCodePointAndForwardPointer(mDict, &mPos); 56 if (NOT_A_CODE_POINT == codePoint) break; 57 outWord[i] = (uint16_t)codePoint; 58 } 59 *outFreq = BinaryFormat::getAttributeFrequencyFromFlags(shortcutFlags); 60 return i; 61 } 62 }; 63 64 TerminalAttributes(const uint8_t *const dict, const uint8_t flags, const int pos) 65 : mDict(dict), mFlags(flags), mStartPos(pos) { 66 } 67 68 inline ShortcutIterator getShortcutIterator() const { 69 // The size of the shortcuts is stored here so that the whole shortcut chunk can be 70 // skipped quickly, so we ignore it. 71 return ShortcutIterator(mDict, mStartPos + BinaryFormat::SHORTCUT_LIST_SIZE_SIZE, mFlags); 72 } 73 74 bool isBlacklistedOrNotAWord() const { 75 return mFlags & (BinaryFormat::FLAG_IS_BLACKLISTED | BinaryFormat::FLAG_IS_NOT_A_WORD); 76 } 77 78 private: 79 DISALLOW_IMPLICIT_CONSTRUCTORS(TerminalAttributes); 80 const uint8_t *const mDict; 81 const uint8_t mFlags; 82 const int mStartPos; 83}; 84} // namespace latinime 85#endif // LATINIME_TERMINAL_ATTRIBUTES_H 86