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