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