patricia_trie_reading_utils.cpp revision 90619ae02b1861e644db6a0d72d0e5f9c195ef3e
1647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi/*
2647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * Copyright (C) 2013, The Android Open Source Project
3647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi *
4647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License");
5647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * you may not use this file except in compliance with the License.
6647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * You may obtain a copy of the License at
7647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi *
8647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi *     http://www.apache.org/licenses/LICENSE-2.0
9647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi *
10647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software
11647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS,
12647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * See the License for the specific language governing permissions and
14647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi * limitations under the License.
15647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi */
16647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
17647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi#include "suggest/policyimpl/dictionary/patricia_trie_reading_utils.h"
18647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
19647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi#include "defines.h"
2090619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/utils/byte_array_utils.h"
21647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
22647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynaginamespace latinime {
23647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
24647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagitypedef PatriciaTrieReadingUtils PtReadingUtils;
25647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
26647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::MASK_GROUP_ADDRESS_TYPE = 0xC0;
27647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_GROUP_ADDRESS_TYPE_NOADDRESS = 0x00;
28647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_GROUP_ADDRESS_TYPE_ONEBYTE = 0x40;
29647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_GROUP_ADDRESS_TYPE_TWOBYTES = 0x80;
30647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_GROUP_ADDRESS_TYPE_THREEBYTES = 0xC0;
31647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
32647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for single/multiple char group
33647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_HAS_MULTIPLE_CHARS = 0x20;
34647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for terminal groups
35647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_IS_TERMINAL = 0x10;
36647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for shortcut targets presence
37647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_HAS_SHORTCUT_TARGETS = 0x08;
38647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for bigram presence
39647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_HAS_BIGRAMS = 0x04;
40647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for non-words (typically, shortcut only entries)
41647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_IS_NOT_A_WORD = 0x02;
42647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi// Flag for blacklist
43647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagiconst PtReadingUtils::NodeFlags PtReadingUtils::FLAG_IS_BLACKLISTED = 0x01;
44647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
45647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi/* static */ int PtReadingUtils::readChildrenPositionAndAdvancePosition(
46647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi        const uint8_t *const buffer, const NodeFlags flags, int *const pos) {
47647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi    const int base = *pos;
48647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi    int offset = 0;
49647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi    switch (MASK_GROUP_ADDRESS_TYPE & flags) {
50647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi        case FLAG_GROUP_ADDRESS_TYPE_ONEBYTE:
51647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            offset = ByteArrayUtils::readUint8AndAdvancePosition(buffer, pos);
52647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            break;
53647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi        case FLAG_GROUP_ADDRESS_TYPE_TWOBYTES:
54647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            offset = ByteArrayUtils::readUint16AndAdvancePosition(buffer, pos);
55647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            break;
56647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi        case FLAG_GROUP_ADDRESS_TYPE_THREEBYTES:
57647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            offset = ByteArrayUtils::readUint24AndAdvancePosition(buffer, pos);
58647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            break;
59647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi        default:
60647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            // If we come here, it means we asked for the children of a word with
61647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            // no children.
62647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi            return NOT_A_DICT_POS;
63647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi    }
64647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi    return base + offset;
65647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi}
66647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi
67647c00070712067fc5ae415f9106be5ca4e17464Keisuke Kuroynagi} // namespace latinime
68