• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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         int mPos;
34         bool mHasNextShortcutTarget;
35 
36      public:
ShortcutIterator(const uint8_t * dict,const int pos,const uint8_t flags)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 
hasNextShortcutTarget()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.
getNextShortcutTarget(const int maxDepth,uint16_t * outWord,int * outFreq)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 
TerminalAttributes(const uint8_t * const dict,const uint8_t flags,const int pos)64     TerminalAttributes(const uint8_t *const dict, const uint8_t flags, const int pos)
65             : mDict(dict), mFlags(flags), mStartPos(pos) {
66     }
67 
getShortcutIterator()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 
isBlacklistedOrNotAWord()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