1cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi/* 2cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Copyright (C) 2013, The Android Open Source Project 3cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 4cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License"); 5cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * you may not use this file except in compliance with the License. 6cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * You may obtain a copy of the License at 7cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 8cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * http://www.apache.org/licenses/LICENSE-2.0 9cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * 10cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software 11cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS, 12cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * See the License for the specific language governing permissions and 14cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * limitations under the License. 15cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi */ 16cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#ifndef LATINIME_DYNAMIC_PT_READING_UTILS_H 182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#define LATINIME_DYNAMIC_PT_READING_UTILS_H 19cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 20cafab169cdb21244c82b99c09983c98066113d87Ken Wakasa#include <cstdint> 21cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 22cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi#include "defines.h" 23cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 24cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynaginamespace latinime { 25cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaclass DynamicPtReadingUtils { 27cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi public: 28cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi typedef uint8_t NodeFlags; 29cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 30f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi static const int DICT_OFFSET_INVALID; 31f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi static const int DICT_OFFSET_ZERO_OFFSET; 32f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi 339ea9c61c99b2fc8ff9a5bbd02c0ad81a828b930cKeisuke Kuroyanagi static int getForwardLinkPosition(const uint8_t *const buffer, const int pos); 34cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 35cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static AK_FORCE_INLINE bool isValidForwardLinkPosition(const int forwardLinkAddress) { 36cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi return forwardLinkAddress != 0; 37cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi } 38cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 39f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi static int getParentPtNodePosOffsetAndAdvancePosition(const uint8_t *const buffer, 40f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi int *const pos); 41f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi 42f3cd38f2c71f013fcd1cdb43f3dd68e8335230ecKeisuke Kuroyanagi static int getParentPtNodePos(const int parentOffset, const int ptNodePos); 43cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 441c0fc852f650106367c92fdc1f809c503caa6232Keisuke Kuroyanagi static int readChildrenPositionAndAdvancePosition(const uint8_t *const buffer, int *const pos); 45cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 46cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi /** 47cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi * Node Flags 48cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi */ 49cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static AK_FORCE_INLINE bool isMoved(const NodeFlags flags) { 50cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi return FLAG_IS_MOVED == (MASK_MOVED & flags); 51cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi } 52cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 53cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static AK_FORCE_INLINE bool isDeleted(const NodeFlags flags) { 54cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi return FLAG_IS_DELETED == (MASK_MOVED & flags); 55cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi } 56cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 572fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa static AK_FORCE_INLINE bool willBecomeNonTerminal(const NodeFlags flags) { 582fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return FLAG_WILL_BECOME_NON_TERMINAL == (MASK_MOVED & flags); 592fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 61e4dcebe0c32760281376da52f543db62ece8b7b4Keisuke Kuroyanagi static AK_FORCE_INLINE NodeFlags updateAndGetFlags(const NodeFlags originalFlags, 622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const bool isMoved, const bool isDeleted, const bool willBecomeNonTerminal) { 63e4dcebe0c32760281376da52f543db62ece8b7b4Keisuke Kuroyanagi NodeFlags flags = originalFlags; 642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa flags = willBecomeNonTerminal ? 652fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ((flags & (~MASK_MOVED)) | FLAG_WILL_BECOME_NON_TERMINAL) : flags; 66f38969f3f8a0684e43dbc7411873e90bc0bea3feKeisuke Kuroyanagi flags = isMoved ? ((flags & (~MASK_MOVED)) | FLAG_IS_MOVED) : flags; 67f38969f3f8a0684e43dbc7411873e90bc0bea3feKeisuke Kuroyanagi flags = isDeleted ? ((flags & (~MASK_MOVED)) | FLAG_IS_DELETED) : flags; 682fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa flags = (!isMoved && !isDeleted && !willBecomeNonTerminal) ? 692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ((flags & (~MASK_MOVED)) | FLAG_IS_NOT_MOVED) : flags; 70e4dcebe0c32760281376da52f543db62ece8b7b4Keisuke Kuroyanagi return flags; 71e4dcebe0c32760281376da52f543db62ece8b7b4Keisuke Kuroyanagi } 72e4dcebe0c32760281376da52f543db62ece8b7b4Keisuke Kuroyanagi 73cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi private: 742fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicPtReadingUtils); 75cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi 76cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static const NodeFlags MASK_MOVED; 77cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static const NodeFlags FLAG_IS_NOT_MOVED; 78cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static const NodeFlags FLAG_IS_MOVED; 79cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi static const NodeFlags FLAG_IS_DELETED; 802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa static const NodeFlags FLAG_WILL_BECOME_NON_TERMINAL; 81cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi}; 82cf1f7675ea7dbcd98bedc688afbb57417e5f41b4Keisuke Kuroynagi} // namespace latinime 832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#endif /* LATINIME_DYNAMIC_PT_READING_UTILS_H */ 84