diff options
Diffstat (limited to 'native/src/words_priority_queue.h')
-rw-r--r-- | native/src/words_priority_queue.h | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/native/src/words_priority_queue.h b/native/src/words_priority_queue.h deleted file mode 100644 index 249962eec..000000000 --- a/native/src/words_priority_queue.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef LATINIME_WORDS_PRIORITY_QUEUE_H -#define LATINIME_WORDS_PRIORITY_QUEUE_H - -#include <cstring> // for memcpy() -#include <iostream> -#include <queue> -#include "defines.h" - -namespace latinime { - -class WordsPriorityQueue { - public: - class SuggestedWord { - public: - int mScore; - unsigned short mWord[MAX_WORD_LENGTH_INTERNAL]; - int mWordLength; - bool mUsed; - - void setParams(int score, unsigned short* word, int wordLength) { - mScore = score; - mWordLength = wordLength; - memcpy(mWord, word, sizeof(unsigned short) * wordLength); - mUsed = true; - } - }; - - WordsPriorityQueue(int maxWords, int maxWordLength) : - MAX_WORDS((unsigned int) maxWords), MAX_WORD_LENGTH( - (unsigned int) maxWordLength) { - mSuggestedWords = new SuggestedWord[maxWordLength]; - for (int i = 0; i < maxWordLength; ++i) { - mSuggestedWords[i].mUsed = false; - } - mHighestSuggestedWord = 0; - } - - ~WordsPriorityQueue() { - delete[] mSuggestedWords; - } - - void push(int score, unsigned short* word, int wordLength) { - SuggestedWord* sw = 0; - if (mSuggestions.size() >= MAX_WORDS) { - sw = mSuggestions.top(); - const int minScore = sw->mScore; - if (minScore >= score) { - return; - } else { - sw->mUsed = false; - mSuggestions.pop(); - } - } - if (sw == 0) { - sw = getFreeSuggestedWord(score, word, wordLength); - } else { - sw->setParams(score, word, wordLength); - } - if (sw == 0) { - AKLOGE("SuggestedWord is accidentally null."); - return; - } - if (DEBUG_WORDS_PRIORITY_QUEUE) { - AKLOGI("Push word. %d, %d", score, wordLength); - DUMP_WORD(word, wordLength); - } - mSuggestions.push(sw); - if (!mHighestSuggestedWord || mHighestSuggestedWord->mScore < sw->mScore) { - mHighestSuggestedWord = sw; - } - } - - SuggestedWord* top() { - if (mSuggestions.empty()) return 0; - SuggestedWord* sw = mSuggestions.top(); - return sw; - } - - int outputSuggestions(int *frequencies, unsigned short *outputChars) { - mHighestSuggestedWord = 0; - const unsigned int size = min( - MAX_WORDS, static_cast<unsigned int>(mSuggestions.size())); - int index = size - 1; - while (!mSuggestions.empty() && index >= 0) { - SuggestedWord* sw = mSuggestions.top(); - if (DEBUG_WORDS_PRIORITY_QUEUE) { - AKLOGI("dump word. %d", sw->mScore); - DUMP_WORD(sw->mWord, sw->mWordLength); - } - const unsigned int wordLength = sw->mWordLength; - char* targetAdr = (char*) outputChars - + (index) * MAX_WORD_LENGTH * sizeof(short); - frequencies[index] = sw->mScore; - memcpy(targetAdr, sw->mWord, (wordLength) * sizeof(short)); - if (wordLength < MAX_WORD_LENGTH) { - ((unsigned short*) targetAdr)[wordLength] = 0; - } - sw->mUsed = false; - mSuggestions.pop(); - --index; - } - return size; - } - - int size() const { - return mSuggestions.size(); - } - - void clear() { - mHighestSuggestedWord = 0; - while (!mSuggestions.empty()) { - SuggestedWord* sw = mSuggestions.top(); - if (DEBUG_WORDS_PRIORITY_QUEUE) { - AKLOGI("Clear word. %d", sw->mScore); - DUMP_WORD(sw->mWord, sw->mWordLength); - } - sw->mUsed = false; - mSuggestions.pop(); - } - } - - void dumpTopWord() { - if (size() <= 0) { - return; - } - DUMP_WORD(mHighestSuggestedWord->mWord, mHighestSuggestedWord->mWordLength); - } - - double getHighestNormalizedScore(const unsigned short* before, const int beforeLength, - unsigned short** outWord, int *outScore, int *outLength) { - if (!mHighestSuggestedWord) { - return 0.0; - } - SuggestedWord* sw = mHighestSuggestedWord; - const int score = sw->mScore; - unsigned short* word = sw->mWord; - const int wordLength = sw->mWordLength; - if (outScore) { - *outScore = score; - } - if (outWord) { - *outWord = word; - } - if (outLength) { - *outLength = wordLength; - } - return Correction::RankingAlgorithm::calcNormalizedScore( - before, beforeLength, word, wordLength, score); - } - - private: - struct wordComparator { - bool operator ()(SuggestedWord * left, SuggestedWord * right) { - return left->mScore > right->mScore; - } - }; - - SuggestedWord* getFreeSuggestedWord(int score, unsigned short* word, - int wordLength) { - for (unsigned int i = 0; i < MAX_WORD_LENGTH; ++i) { - if (!mSuggestedWords[i].mUsed) { - mSuggestedWords[i].setParams(score, word, wordLength); - return &mSuggestedWords[i]; - } - } - return 0; - } - - typedef std::priority_queue<SuggestedWord*, std::vector<SuggestedWord*>, - wordComparator> Suggestions; - Suggestions mSuggestions; - const unsigned int MAX_WORDS; - const unsigned int MAX_WORD_LENGTH; - SuggestedWord* mSuggestedWords; - SuggestedWord* mHighestSuggestedWord; -}; -} - -#endif // LATINIME_WORDS_PRIORITY_QUEUE_H |