dic_node_priority_queue.h revision 80ca7abea32a97acefcd8a8cb6145f0cdc8f0503
138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka/*
238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project
338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License");
538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * you may not use this file except in compliance with the License.
638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * You may obtain a copy of the License at
738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *      http://www.apache.org/licenses/LICENSE-2.0
938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
1038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software
1138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS,
1238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * See the License for the specific language governing permissions and
1438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * limitations under the License.
1538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka */
1638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
1738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#ifndef LATINIME_DIC_NODE_PRIORITY_QUEUE_H
1838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#define LATINIME_DIC_NODE_PRIORITY_QUEUE_H
1938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include <queue>
2138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include <vector>
2238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include "defines.h"
24a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_node.h"
25a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_node_release_listener.h"
2638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokanamespace latinime {
2838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokaclass DicNodePriorityQueue : public DicNodeReleaseListener {
3038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka public:
3180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    AK_FORCE_INLINE explicit DicNodePriorityQueue(const int capacity)
3280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi            : mCapacity(capacity), mMaxSize(capacity), mDicNodesBuf(),
3380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi              mUnusedNodeIndices(), mNextUnusedNodeId(0), mDicNodesQueue() {
3480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        mDicNodesBuf.resize(mCapacity + 1);
3580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        mUnusedNodeIndices.resize(mCapacity + 1);
3680ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        clearAndResizeToCapacity();
3738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
3838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
3938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // Non virtual inline destructor -- never inherit this class
4038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE ~DicNodePriorityQueue() {}
4138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
4238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int getSize() const {
4338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return static_cast<int>(mDicNodesQueue.size());
4438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
4538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
4638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int getMaxSize() const {
4738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return mMaxSize;
4838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
4938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
5038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void setMaxSize(const int maxSize) {
5180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        ASSERT(maxSize <= mCapacity);
5280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        mMaxSize = min(maxSize, mCapacity);
5338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
5438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
5580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    AK_FORCE_INLINE void clearAndResizeToCapacity() {
5680ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        clearAndResize(mCapacity);
5738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
5838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
5938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void clear() {
6038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        clearAndResize(mMaxSize);
6138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
6238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
6338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void clearAndResize(const int maxSize) {
6480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        ASSERT(maxSize <= mCapacity);
6538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        while (!mDicNodesQueue.empty()) {
6638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mDicNodesQueue.pop();
6738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
6838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        setMaxSize(maxSize);
6980ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        for (int i = 0; i < mCapacity + 1; ++i) {
7038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mDicNodesBuf[i].remove();
7138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mDicNodesBuf[i].setReleaseListener(this);
7280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi            mUnusedNodeIndices[i] = i == mCapacity ? NOT_A_NODE_ID : static_cast<int>(i) + 1;
7338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
7438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mNextUnusedNodeId = 0;
7538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
7638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
7738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // Copy
7838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE DicNode *copyPush(DicNode *dicNode) {
7938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return copyPush(dicNode, mMaxSize);
8038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
8138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
8238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void copyPop(DicNode *dest) {
8338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (mDicNodesQueue.empty()) {
8438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            ASSERT(false);
8538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return;
8638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
8738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        DicNode *node = mDicNodesQueue.top();
8838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (dest) {
8938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            DicNodeUtils::initByCopy(node, dest);
9038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
9138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        node->remove();
9238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mDicNodesQueue.pop();
9338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
9438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
9538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void onReleased(DicNode *dicNode) {
9638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        const int index = static_cast<int>(dicNode - &mDicNodesBuf[0]);
9738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (mUnusedNodeIndices[index] != NOT_A_NODE_ID) {
9838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            // it's already released
9938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return;
10038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
10138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mUnusedNodeIndices[index] = mNextUnusedNodeId;
10238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mNextUnusedNodeId = index;
10380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        ASSERT(index >= 0 && index < (mCapacity + 1));
10438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
10538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
10638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void dump() const {
10738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        AKLOGI("\n\n\n\n\n===========================");
10880ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        for (int i = 0; i < mCapacity + 1; ++i) {
10938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            if (mDicNodesBuf[i].isUsed()) {
11038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka                mDicNodesBuf[i].dump("QUEUE: ");
11138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            }
11238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
11338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        AKLOGI("===========================\n\n\n\n\n");
11438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
11538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
11638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka private:
11780ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    DISALLOW_IMPLICIT_CONSTRUCTORS(DicNodePriorityQueue);
11838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    static const int NOT_A_NODE_ID = -1;
11938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
12038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE static bool compareDicNode(DicNode *left, DicNode *right) {
12138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return left->compare(right);
12238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
12338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
12438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    struct DicNodeComparator {
12538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        bool operator ()(DicNode *left, DicNode *right) {
12638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return compareDicNode(left, right);
12738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
12838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    };
12938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
13038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    typedef std::priority_queue<DicNode *, std::vector<DicNode *>, DicNodeComparator> DicNodesQueue;
13180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    const int mCapacity;
13238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int mMaxSize;
13338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    std::vector<DicNode> mDicNodesBuf; // of each element of mDicNodesBuf respectively
13438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    std::vector<int> mUnusedNodeIndices;
13538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int mNextUnusedNodeId;
13638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    DicNodesQueue mDicNodesQueue;
13738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
13838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    inline bool isFull(const int maxSize) const {
13938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return getSize() >= maxSize;
14038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
14138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
14238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void pop() {
14338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        copyPop(0);
14438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
14538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
14638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE bool betterThanWorstDicNode(DicNode *dicNode) const {
14738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        DicNode *worstNode = mDicNodesQueue.top();
14838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (!worstNode) {
14938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return true;
15038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
15138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return compareDicNode(dicNode, worstNode);
15238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
15338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
15438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE DicNode *searchEmptyDicNode() {
15580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        if (mCapacity == 0) {
15638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return 0;
15738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
15838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (mNextUnusedNodeId == NOT_A_NODE_ID) {
15938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            AKLOGI("No unused node found.");
16080ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi            for (int i = 0; i < mCapacity + 1; ++i) {
16138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka                AKLOGI("Dump node availability, %d, %d, %d",
16238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka                        i, mDicNodesBuf[i].isUsed(), mUnusedNodeIndices[i]);
16338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            }
16438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            ASSERT(false);
16538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return 0;
16638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
16738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        DicNode *dicNode = &mDicNodesBuf[mNextUnusedNodeId];
16838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        markNodeAsUsed(dicNode);
16938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return dicNode;
17038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
17138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
17238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE void markNodeAsUsed(DicNode *dicNode) {
17338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        const int index = static_cast<int>(dicNode - &mDicNodesBuf[0]);
17438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mNextUnusedNodeId = mUnusedNodeIndices[index];
17538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mUnusedNodeIndices[index] = NOT_A_NODE_ID;
17680ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        ASSERT(index >= 0 && index < (mCapacity + 1));
17738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
17838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
17938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE DicNode *pushPoolNodeWithMaxSize(DicNode *dicNode, const int maxSize) {
18038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (!dicNode) {
18138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return 0;
18238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
18338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (!isFull(maxSize)) {
18438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mDicNodesQueue.push(dicNode);
18538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return dicNode;
18638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
18738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (betterThanWorstDicNode(dicNode)) {
18838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            pop();
18938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mDicNodesQueue.push(dicNode);
19038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            return dicNode;
19138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
19238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        dicNode->remove();
19338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return 0;
19438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
19538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
19638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // Copy
19738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    AK_FORCE_INLINE DicNode *copyPush(DicNode *dicNode, const int maxSize) {
19838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return pushPoolNodeWithMaxSize(newDicNode(dicNode), maxSize);
19938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
20080ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi
20180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    AK_FORCE_INLINE DicNode *newDicNode(DicNode *dicNode) {
20280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        DicNode *newNode = searchEmptyDicNode();
20380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        if (newNode) {
20480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi            DicNodeUtils::initByCopy(dicNode, newNode);
20580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        }
20680ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi        return newNode;
20780ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi    }
20880ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi
20938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka};
21038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka} // namespace latinime
21138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#endif // LATINIME_DIC_NODE_PRIORITY_QUEUE_H
212