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