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