dic_nodes_cache.cpp revision 4c2767857a02c9cf18a9579aa0391fd09b3fe411
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#include <list>
183107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka
193107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka#include "defines.h"
20a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_node_priority_queue.h"
21a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_node_utils.h"
22a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "suggest/core/dicnode/dic_nodes_cache.h"
233107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka
243107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataokanamespace latinime {
253107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka
264c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi// The biggest value among MAX_CACHE_DIC_NODE_SIZE, MAX_CACHE_DIC_NODE_SIZE_FOR_SINGLE_POINT, ...
274c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagiconst int DicNodesCache::LARGE_PRIORITY_QUEUE_CAPACITY = 310;
284c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi// Capacity for reducing memory footprint.
294c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagiconst int DicNodesCache::SMALL_PRIORITY_QUEUE_CAPACITY = 100;
304c2767857a02c9cf18a9579aa0391fd09b3fe411Keisuke Kuroyanagi
313107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka/**
323107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Truncates all of the dicNodes so that they start at the given commit point.
333107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka * Only called for multi-word typing input.
343107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka */
353107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi KataokaDicNode *DicNodesCache::setCommitPoint(int commitPoint) {
363107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    std::list<DicNode> dicNodesList;
373107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    while (mCachedDicNodesForContinuousSuggestion->getSize() > 0) {
383107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        DicNode dicNode;
393107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        mCachedDicNodesForContinuousSuggestion->copyPop(&dicNode);
403107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        dicNodesList.push_front(dicNode);
413107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    }
423107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka
433107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    // Get the starting words of the top scoring dicNode (last dicNode popped from priority queue)
443107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    // up to the commit point. These words have already been committed to the text view.
453107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    DicNode *topDicNode = &dicNodesList.front();
463107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    DicNode topDicNodeCopy;
473107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    DicNodeUtils::initByCopy(topDicNode, &topDicNodeCopy);
483107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka
493107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    // Keep only those dicNodes that match the same starting words.
503107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    std::list<DicNode>::iterator iter;
513107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    for (iter = dicNodesList.begin(); iter != dicNodesList.end(); iter++) {
523107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        DicNode *dicNode = &*iter;
533107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        if (dicNode->truncateNode(&topDicNodeCopy, commitPoint)) {
543107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka            mCachedDicNodesForContinuousSuggestion->copyPush(dicNode);
553107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        } else {
563107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka            // Top dicNode should be reprocessed.
573107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka            ASSERT(dicNode != topDicNode);
583107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka            DicNode::managedDelete(dicNode);
593107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka        }
603107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    }
613107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    mInputIndex -= commitPoint;
623107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka    return topDicNode;
633107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka}
643107b467c91c471ce4e00c5d8de559f7b0da2cd6Satoshi Kataoka}  // namespace latinime
65