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