13107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka/* 23107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Copyright (C) 2012 The Android Open Source Project 33107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * 43107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 53107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * you may not use this file except in compliance with the License. 63107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * You may obtain a copy of the License at 73107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * 83107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 93107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * 103107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Unless required by applicable law or agreed to in writing, software 113107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 123107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * See the License for the specific language governing permissions and 143107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * limitations under the License. 153107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka */ 163107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 173107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#ifndef LATINIME_DIC_NODES_CACHE_H 183107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#define LATINIME_DIC_NODES_CACHE_H 193107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 203107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#include <stdint.h> 213107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 223107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#include "defines.h" 23a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_node_priority_queue.h" 243107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 253107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataokanamespace latinime { 263107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 273107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataokaclass DicNode; 283107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 293107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka/** 303107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Class for controlling dicNode search priority queue and lexicon trie traversal. 313107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka */ 323107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataokaclass DicNodesCache { 333107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka public: 344c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi AK_FORCE_INLINE explicit DicNodesCache(const bool usesLargeCapacityCache) 354c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi : mUsesLargeCapacityCache(usesLargeCapacityCache), 364c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi mDicNodePriorityQueue0(getCacheCapacity()), 374c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi mDicNodePriorityQueue1(getCacheCapacity()), 384c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi mDicNodePriorityQueue2(getCacheCapacity()), 3980ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mDicNodePriorityQueueForTerminal(MAX_RESULTS), 4080ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mActiveDicNodes(&mDicNodePriorityQueue0), 4180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mNextActiveDicNodes(&mDicNodePriorityQueue1), 4280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mCachedDicNodesForContinuousSuggestion(&mDicNodePriorityQueue2), 4380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mTerminalDicNodes(&mDicNodePriorityQueueForTerminal), 4480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mInputIndex(0), mLastCachedInputIndex(0) {} 453107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 463107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE virtual ~DicNodesCache() {} 473107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 483107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void reset(const int nextActiveSize, const int terminalSize) { 493107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mInputIndex = 0; 503107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mLastCachedInputIndex = 0; 5180ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // We want to use the max capacity for the current active dic node queue. 5280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mActiveDicNodes->clearAndResizeToCapacity(); 5380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // nextActiveSize is used to limit the next iteration's active dic node size. 544c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi const int nextActiveSizeFittingToTheCapacity = min(nextActiveSize, getCacheCapacity()); 554c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi mNextActiveDicNodes->clearAndResize(nextActiveSizeFittingToTheCapacity); 563107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mTerminalDicNodes->clearAndResize(terminalSize); 5780ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // We want to use the max capacity for the cached dic nodes that will be used for the 5880ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // continuous suggestion. 5980ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi mCachedDicNodesForContinuousSuggestion->clearAndResizeToCapacity(); 603107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 613107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 623107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void continueSearch() { 633107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka resetTemporaryCaches(); 643107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka restoreActiveDicNodesFromCache(); 653107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 663107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 673107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void advanceActiveDicNodes() { 683107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (DEBUG_DICT) { 693107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AKLOGI("Advance active %d nodes.", mNextActiveDicNodes->getSize()); 703107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 713107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (DEBUG_DICT_FULL) { 723107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mNextActiveDicNodes->dump(); 733107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 743107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mNextActiveDicNodes = 753107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka moveNodesAndReturnReusableEmptyQueue(mNextActiveDicNodes, &mActiveDicNodes); 763107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 773107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 783107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNode *setCommitPoint(int commitPoint); 793107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 803107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka int activeSize() const { return mActiveDicNodes->getSize(); } 813107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka int terminalSize() const { return mTerminalDicNodes->getSize(); } 823107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka bool isLookAheadCorrectionInputIndex(const int inputIndex) const { 833107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka return inputIndex == mInputIndex - 1; 843107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 853107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka void advanceInputIndex(const int inputSize) { 863107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (mInputIndex < inputSize) { 873107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mInputIndex++; 883107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 893107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 903107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 913107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void copyPushTerminal(DicNode *dicNode) { 923107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mTerminalDicNodes->copyPush(dicNode); 933107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 943107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 953107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void copyPushActive(DicNode *dicNode) { 963107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mActiveDicNodes->copyPush(dicNode); 973107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 983107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 993107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE bool copyPushContinue(DicNode *dicNode) { 1003107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka return mCachedDicNodesForContinuousSuggestion->copyPush(dicNode); 1013107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1023107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1033107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void copyPushNextActive(DicNode *dicNode) { 1043107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNode *pushedDicNode = mNextActiveDicNodes->copyPush(dicNode); 1053107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (!pushedDicNode) { 1063107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (dicNode->isCached()) { 1073107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka dicNode->remove(); 1083107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1093107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // We simply drop any dic node that was not cached, ignoring the slim chance 1103107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // that one of its children represents what the user really wanted. 1113107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1123107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1133107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1143107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka void popTerminal(DicNode *dest) { 1153107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mTerminalDicNodes->copyPop(dest); 1163107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1173107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1183107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka void popActive(DicNode *dest) { 1193107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mActiveDicNodes->copyPop(dest); 1203107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1213107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1223107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka bool hasCachedDicNodesForContinuousSuggestion() const { 1233107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka return mCachedDicNodesForContinuousSuggestion 1243107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka && mCachedDicNodesForContinuousSuggestion->getSize() > 0; 1253107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1263107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1273107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE bool isCacheBorderForTyping(const int inputSize) const { 1283107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // TODO: Move this variable to header 1293107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka static const int CACHE_BACK_LENGTH = 3; 1303107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka const int cacheInputIndex = inputSize - CACHE_BACK_LENGTH; 1313107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka const bool shouldCache = (cacheInputIndex == mInputIndex) 1323107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka && (cacheInputIndex != mLastCachedInputIndex); 1333107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka return shouldCache; 1343107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1353107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1363107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void updateLastCachedInputIndex() { 1373107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mLastCachedInputIndex = mInputIndex; 1383107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1393107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1403107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka private: 1413107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DISALLOW_COPY_AND_ASSIGN(DicNodesCache); 1423107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1433107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void restoreActiveDicNodesFromCache() { 1443107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (DEBUG_DICT) { 1453107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AKLOGI("Restore %d nodes. inputIndex = %d.", 1463107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mCachedDicNodesForContinuousSuggestion->getSize(), mLastCachedInputIndex); 1473107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1483107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka if (DEBUG_DICT_FULL || DEBUG_CACHE) { 1493107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mCachedDicNodesForContinuousSuggestion->dump(); 1503107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1513107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mInputIndex = mLastCachedInputIndex; 15211dc3a371d3bc682f7307586761ae637170d3505Ken Wakasa mCachedDicNodesForContinuousSuggestion = moveNodesAndReturnReusableEmptyQueue( 15311dc3a371d3bc682f7307586761ae637170d3505Ken Wakasa mCachedDicNodesForContinuousSuggestion, &mActiveDicNodes); 1543107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1553107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1563107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE static DicNodePriorityQueue *moveNodesAndReturnReusableEmptyQueue( 1573107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNodePriorityQueue *src, DicNodePriorityQueue **dest) { 1583107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka const int srcMaxSize = src->getMaxSize(); 1593107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka const int destMaxSize = (*dest)->getMaxSize(); 1603107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNodePriorityQueue *tmp = *dest; 1613107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka *dest = src; 1623107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka (*dest)->setMaxSize(destMaxSize); 1633107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka tmp->clearAndResize(srcMaxSize); 1643107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka return tmp; 1653107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1663107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1674c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi AK_FORCE_INLINE int getCacheCapacity() const { 1684c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi return mUsesLargeCapacityCache ? 1694c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi LARGE_PRIORITY_QUEUE_CAPACITY : SMALL_PRIORITY_QUEUE_CAPACITY; 1704c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi } 1714c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi 1723107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka AK_FORCE_INLINE void resetTemporaryCaches() { 1733107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mActiveDicNodes->clear(); 1743107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mNextActiveDicNodes->clear(); 1753107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka mTerminalDicNodes->clear(); 1763107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka } 1773107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka 1784c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi static const int LARGE_PRIORITY_QUEUE_CAPACITY; 1794c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi static const int SMALL_PRIORITY_QUEUE_CAPACITY; 1804c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi 1814c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi const bool mUsesLargeCapacityCache; 18280ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // Instances 18380ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi DicNodePriorityQueue mDicNodePriorityQueue0; 18480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi DicNodePriorityQueue mDicNodePriorityQueue1; 18580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi DicNodePriorityQueue mDicNodePriorityQueue2; 18680ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi DicNodePriorityQueue mDicNodePriorityQueueForTerminal; 18780ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi 1883107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // Active dicNodes currently being expanded. 1893107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNodePriorityQueue *mActiveDicNodes; 1903107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // Next dicNodes to be expanded. 1913107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNodePriorityQueue *mNextActiveDicNodes; 1923107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka // Cached dicNodes used for continuous suggestion. 1933107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka DicNodePriorityQueue *mCachedDicNodesForContinuousSuggestion; 19480ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi // Current top terminal dicNodes. 19580ca7abea32a97acefcd8a8cb6145f0cdc8f0503Keisuke Kuroyanagi DicNodePriorityQueue *mTerminalDicNodes; 1963107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka int mInputIndex; 1973107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka int mLastCachedInputIndex; 1983107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka}; 1993107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka} // namespace latinime 2003107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#endif // LATINIME_DIC_NODES_CACHE_H 201