Move correction state to stack memory
*Before (0) 13.18 (0.01%) (1) 93025.41 (62.06%) (2) 10.75 (0.01%) (3) 10.50 (0.01%) (4) 117.50 (0.08%) (5) 55678.98 (37.14%) (6) 9.09 (0.01%) (20) 883.84 (0.59%) Total 149898.24 (sum of others 149749.25) *After (0) 17.41 (0.01%) (1) 92673.41 (61.95%) (2) 10.62 (0.01%) (3) 10.37 (0.01%) (4) 120.96 (0.08%) (5) 55741.18 (37.26%) (6) 11.01 (0.01%) (20) 862.72 (0.58%) Total 149595.52 (sum of others 149447.68) Change-Id: Ia5a25a544fc388e4dab1e08d8f78d5117b249cf3main
parent
78573f2e8a
commit
1bc038c5e4
|
@ -26,6 +26,7 @@ namespace latinime {
|
||||||
|
|
||||||
class AdditionalProximityChars {
|
class AdditionalProximityChars {
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(AdditionalProximityChars);
|
||||||
static const std::string LOCALE_EN_US;
|
static const std::string LOCALE_EN_US;
|
||||||
static const int EN_US_ADDITIONAL_A_SIZE = 4;
|
static const int EN_US_ADDITIONAL_A_SIZE = 4;
|
||||||
static const int32_t EN_US_ADDITIONAL_A[];
|
static const int32_t EN_US_ADDITIONAL_A[];
|
||||||
|
|
|
@ -36,6 +36,7 @@ class BigramDictionary {
|
||||||
bool isValidBigram(const int32_t *word1, int length1, const int32_t *word2, int length2);
|
bool isValidBigram(const int32_t *word1, int length1, const int32_t *word2, int length2);
|
||||||
~BigramDictionary();
|
~BigramDictionary();
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(BigramDictionary);
|
||||||
bool addWordBigram(unsigned short *word, int length, int frequency);
|
bool addWordBigram(unsigned short *word, int length, int frequency);
|
||||||
int getBigramAddress(int *pos, bool advance);
|
int getBigramAddress(int *pos, bool advance);
|
||||||
int getBigramFreq(int *pos);
|
int getBigramFreq(int *pos);
|
||||||
|
|
|
@ -25,6 +25,7 @@ namespace latinime {
|
||||||
|
|
||||||
class BinaryFormat {
|
class BinaryFormat {
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(BinaryFormat);
|
||||||
const static int32_t MINIMAL_ONE_BYTE_CHARACTER_VALUE = 0x20;
|
const static int32_t MINIMAL_ONE_BYTE_CHARACTER_VALUE = 0x20;
|
||||||
const static int32_t CHARACTER_ARRAY_TERMINATOR = 0x1F;
|
const static int32_t CHARACTER_ARRAY_TERMINATOR = 0x1F;
|
||||||
const static int MULTIPLE_BYTE_CHARACTER_ADDITIONAL_SIZE = 2;
|
const static int MULTIPLE_BYTE_CHARACTER_ADDITIONAL_SIZE = 2;
|
||||||
|
|
|
@ -106,11 +106,6 @@ inline bool Correction::isQuote(const unsigned short c) {
|
||||||
// Correction //
|
// Correction //
|
||||||
////////////////
|
////////////////
|
||||||
|
|
||||||
Correction::Correction(const int typedLetterMultiplier, const int fullWordMultiplier)
|
|
||||||
: TYPED_LETTER_MULTIPLIER(typedLetterMultiplier), FULL_WORD_MULTIPLIER(fullWordMultiplier) {
|
|
||||||
initEditDistance(mEditDistanceTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Correction::resetCorrection() {
|
void Correction::resetCorrection() {
|
||||||
mTotalTraverseCount = 0;
|
mTotalTraverseCount = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ class Correction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Correction(const int typedLetterMultiplier, const int fullWordMultiplier);
|
Correction() {};
|
||||||
void resetCorrection();
|
void resetCorrection();
|
||||||
void initCorrection(
|
void initCorrection(
|
||||||
const ProximityInfo *pi, const int inputLength, const int maxWordLength);
|
const ProximityInfo *pi, const int inputLength, const int maxWordLength);
|
||||||
|
@ -175,8 +175,6 @@ class Correction {
|
||||||
private:
|
private:
|
||||||
static const int CODE_SPACE = ' ';
|
static const int CODE_SPACE = ' ';
|
||||||
static const int MAX_INITIAL_SCORE = 255;
|
static const int MAX_INITIAL_SCORE = 255;
|
||||||
static const int TYPED_LETTER_MULTIPLIER = 2;
|
|
||||||
static const int FULL_WORD_MULTIPLIER = 2;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// proximity info state
|
// proximity info state
|
||||||
|
@ -195,6 +193,7 @@ class Correction {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(Correction);
|
||||||
inline void incrementInputIndex();
|
inline void incrementInputIndex();
|
||||||
inline void incrementOutputIndex();
|
inline void incrementOutputIndex();
|
||||||
inline void startToTraverseAllNodes();
|
inline void startToTraverseAllNodes();
|
||||||
|
@ -206,8 +205,8 @@ class Correction {
|
||||||
inline int getFinalProbabilityInternal(const int probability, unsigned short **word,
|
inline int getFinalProbabilityInternal(const int probability, unsigned short **word,
|
||||||
int* wordLength, const int inputLength);
|
int* wordLength, const int inputLength);
|
||||||
|
|
||||||
const int TYPED_LETTER_MULTIPLIER;
|
static const int TYPED_LETTER_MULTIPLIER = 2;
|
||||||
const int FULL_WORD_MULTIPLIER;
|
static const int FULL_WORD_MULTIPLIER = 2;
|
||||||
const ProximityInfo *mProximityInfo;
|
const ProximityInfo *mProximityInfo;
|
||||||
|
|
||||||
bool mUseFullEditDistance;
|
bool mUseFullEditDistance;
|
||||||
|
|
|
@ -292,6 +292,14 @@ template<typename T> inline T max(T a, T b) { return a > b ? a : b; }
|
||||||
#define INPUTLENGTH_FOR_DEBUG -1
|
#define INPUTLENGTH_FOR_DEBUG -1
|
||||||
#define MIN_OUTPUT_INDEX_FOR_DEBUG -1
|
#define MIN_OUTPUT_INDEX_FOR_DEBUG -1
|
||||||
|
|
||||||
|
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||||
|
TypeName(const TypeName&); \
|
||||||
|
void operator=(const TypeName&)
|
||||||
|
|
||||||
|
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
|
||||||
|
TypeName(); \
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(TypeName)
|
||||||
|
|
||||||
// Used as a return value for character comparison
|
// Used as a return value for character comparison
|
||||||
typedef enum {
|
typedef enum {
|
||||||
// Same char, possibly with different case or accent
|
// Same char, possibly with different case or accent
|
||||||
|
|
|
@ -38,7 +38,6 @@ Dictionary::Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust,
|
||||||
AKLOGI("IN NATIVE SUGGEST Version: %d", (mDict[0] & 0xFF));
|
AKLOGI("IN NATIVE SUGGEST Version: %d", (mDict[0] & 0xFF));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mCorrection = new Correction(typedLetterMultiplier, fullWordMultiplier);
|
|
||||||
mWordsPriorityQueuePool = new WordsPriorityQueuePool(
|
mWordsPriorityQueuePool = new WordsPriorityQueuePool(
|
||||||
maxWords, SUB_QUEUE_MAX_WORDS, maxWordLength);
|
maxWords, SUB_QUEUE_MAX_WORDS, maxWordLength);
|
||||||
const unsigned int headerSize = BinaryFormat::getHeaderSize(mDict);
|
const unsigned int headerSize = BinaryFormat::getHeaderSize(mDict);
|
||||||
|
@ -49,7 +48,6 @@ Dictionary::Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust,
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary::~Dictionary() {
|
Dictionary::~Dictionary() {
|
||||||
delete mCorrection;
|
|
||||||
delete mWordsPriorityQueuePool;
|
delete mWordsPriorityQueuePool;
|
||||||
delete mUnigramDictionary;
|
delete mUnigramDictionary;
|
||||||
delete mBigramDictionary;
|
delete mBigramDictionary;
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
|
|
||||||
#include "bigram_dictionary.h"
|
#include "bigram_dictionary.h"
|
||||||
#include "char_utils.h"
|
#include "char_utils.h"
|
||||||
#include "correction.h"
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "proximity_info.h"
|
#include "proximity_info.h"
|
||||||
#include "unigram_dictionary.h"
|
#include "unigram_dictionary.h"
|
||||||
|
@ -42,7 +41,7 @@ class Dictionary {
|
||||||
mBigramDictionary->fillBigramAddressToFrequencyMapAndFilter(prevWordChars,
|
mBigramDictionary->fillBigramAddressToFrequencyMapAndFilter(prevWordChars,
|
||||||
prevWordLength, &bigramMap, bigramFilter);
|
prevWordLength, &bigramMap, bigramFilter);
|
||||||
return mUnigramDictionary->getSuggestions(proximityInfo, mWordsPriorityQueuePool,
|
return mUnigramDictionary->getSuggestions(proximityInfo, mWordsPriorityQueuePool,
|
||||||
mCorrection, xcoordinates, ycoordinates, codes, codesSize, &bigramMap,
|
xcoordinates, ycoordinates, codes, codesSize, &bigramMap,
|
||||||
bigramFilter, useFullEditDistance, outWords, frequencies);
|
bigramFilter, useFullEditDistance, outWords, frequencies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,6 +64,7 @@ class Dictionary {
|
||||||
static int wideStrLen(unsigned short *str);
|
static int wideStrLen(unsigned short *str);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Dictionary);
|
||||||
const unsigned char *mDict;
|
const unsigned char *mDict;
|
||||||
|
|
||||||
// Used only for the mmap version of dictionary loading, but we use these as dummy variables
|
// Used only for the mmap version of dictionary loading, but we use these as dummy variables
|
||||||
|
@ -73,10 +73,9 @@ class Dictionary {
|
||||||
const int mMmapFd;
|
const int mMmapFd;
|
||||||
const int mDictBufAdjust;
|
const int mDictBufAdjust;
|
||||||
|
|
||||||
UnigramDictionary *mUnigramDictionary;
|
const UnigramDictionary *mUnigramDictionary;
|
||||||
BigramDictionary *mBigramDictionary;
|
BigramDictionary *mBigramDictionary;
|
||||||
WordsPriorityQueuePool *mWordsPriorityQueuePool;
|
WordsPriorityQueuePool *mWordsPriorityQueuePool;
|
||||||
Correction *mCorrection;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// public static utility methods
|
// public static utility methods
|
||||||
|
|
|
@ -99,6 +99,7 @@ class ProximityInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfo);
|
||||||
// The max number of the keys in one keyboard layout
|
// The max number of the keys in one keyboard layout
|
||||||
static const int MAX_KEY_COUNT_IN_A_KEYBOARD = 64;
|
static const int MAX_KEY_COUNT_IN_A_KEYBOARD = 64;
|
||||||
// The upper limit of the char code in mCodeToKeyIndex
|
// The upper limit of the char code in mCodeToKeyIndex
|
||||||
|
|
|
@ -49,6 +49,7 @@ class ProximityInfoState {
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
// Defined here //
|
// Defined here //
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
ProximityInfoState() {};
|
||||||
inline const int* getProximityCharsAt(const int index) const {
|
inline const int* getProximityCharsAt(const int index) const {
|
||||||
return mInputCodes + (index * MAX_PROXIMITY_CHARS_SIZE_INTERNAL);
|
return mInputCodes + (index * MAX_PROXIMITY_CHARS_SIZE_INTERNAL);
|
||||||
}
|
}
|
||||||
|
@ -162,6 +163,7 @@ class ProximityInfoState {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(ProximityInfoState);
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
// Defined in proximity_info_state.cpp //
|
// Defined in proximity_info_state.cpp //
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
|
|
@ -62,6 +62,7 @@ class TerminalAttributes {
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(TerminalAttributes);
|
||||||
const uint8_t* const mDict;
|
const uint8_t* const mDict;
|
||||||
const uint8_t mFlags;
|
const uint8_t mFlags;
|
||||||
const int mStartPos;
|
const int mStartPos;
|
||||||
|
|
|
@ -170,14 +170,14 @@ void UnigramDictionary::getWordWithDigraphSuggestionsRec(ProximityInfo *proximit
|
||||||
// bigramFilter is a bloom filter for fast rejection: see functions setInFilter and isInFilter
|
// bigramFilter is a bloom filter for fast rejection: see functions setInFilter and isInFilter
|
||||||
// in bigram_dictionary.cpp
|
// in bigram_dictionary.cpp
|
||||||
int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo,
|
int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo,
|
||||||
WordsPriorityQueuePool *queuePool, Correction *correction, const int *xcoordinates,
|
WordsPriorityQueuePool *queuePool, const int *xcoordinates,
|
||||||
const int *ycoordinates, const int *codes, const int codesSize,
|
const int *ycoordinates, const int *codes, const int codesSize,
|
||||||
const std::map<int, int> *bigramMap, const uint8_t *bigramFilter,
|
const std::map<int, int> *bigramMap, const uint8_t *bigramFilter,
|
||||||
const bool useFullEditDistance, unsigned short *outWords, int *frequencies) const {
|
const bool useFullEditDistance, unsigned short *outWords, int *frequencies) const {
|
||||||
|
|
||||||
queuePool->clearAll();
|
queuePool->clearAll();
|
||||||
Correction* masterCorrection = correction;
|
Correction masterCorrection;
|
||||||
correction->resetCorrection();
|
masterCorrection.resetCorrection();
|
||||||
if (BinaryFormat::REQUIRES_GERMAN_UMLAUT_PROCESSING & FLAGS)
|
if (BinaryFormat::REQUIRES_GERMAN_UMLAUT_PROCESSING & FLAGS)
|
||||||
{ // Incrementally tune the word and try all possibilities
|
{ // Incrementally tune the word and try all possibilities
|
||||||
int codesBuffer[getCodesBufferSize(codes, codesSize)];
|
int codesBuffer[getCodesBufferSize(codes, codesSize)];
|
||||||
|
@ -185,7 +185,7 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo,
|
||||||
int yCoordinatesBuffer[codesSize];
|
int yCoordinatesBuffer[codesSize];
|
||||||
getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
||||||
xCoordinatesBuffer, yCoordinatesBuffer, codesSize, bigramMap, bigramFilter,
|
xCoordinatesBuffer, yCoordinatesBuffer, codesSize, bigramMap, bigramFilter,
|
||||||
useFullEditDistance, codes, codesSize, 0, codesBuffer, masterCorrection,
|
useFullEditDistance, codes, codesSize, 0, codesBuffer, &masterCorrection,
|
||||||
queuePool, GERMAN_UMLAUT_DIGRAPHS,
|
queuePool, GERMAN_UMLAUT_DIGRAPHS,
|
||||||
sizeof(GERMAN_UMLAUT_DIGRAPHS) / sizeof(GERMAN_UMLAUT_DIGRAPHS[0]));
|
sizeof(GERMAN_UMLAUT_DIGRAPHS) / sizeof(GERMAN_UMLAUT_DIGRAPHS[0]));
|
||||||
} else if (BinaryFormat::REQUIRES_FRENCH_LIGATURES_PROCESSING & FLAGS) {
|
} else if (BinaryFormat::REQUIRES_FRENCH_LIGATURES_PROCESSING & FLAGS) {
|
||||||
|
@ -194,28 +194,28 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo,
|
||||||
int yCoordinatesBuffer[codesSize];
|
int yCoordinatesBuffer[codesSize];
|
||||||
getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
||||||
xCoordinatesBuffer, yCoordinatesBuffer, codesSize, bigramMap, bigramFilter,
|
xCoordinatesBuffer, yCoordinatesBuffer, codesSize, bigramMap, bigramFilter,
|
||||||
useFullEditDistance, codes, codesSize, 0, codesBuffer, masterCorrection,
|
useFullEditDistance, codes, codesSize, 0, codesBuffer, &masterCorrection,
|
||||||
queuePool, FRENCH_LIGATURES_DIGRAPHS,
|
queuePool, FRENCH_LIGATURES_DIGRAPHS,
|
||||||
sizeof(FRENCH_LIGATURES_DIGRAPHS) / sizeof(FRENCH_LIGATURES_DIGRAPHS[0]));
|
sizeof(FRENCH_LIGATURES_DIGRAPHS) / sizeof(FRENCH_LIGATURES_DIGRAPHS[0]));
|
||||||
} else { // Normal processing
|
} else { // Normal processing
|
||||||
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, codesSize,
|
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, codesSize,
|
||||||
bigramMap, bigramFilter, useFullEditDistance, masterCorrection, queuePool);
|
bigramMap, bigramFilter, useFullEditDistance, &masterCorrection, queuePool);
|
||||||
}
|
}
|
||||||
|
|
||||||
PROF_START(20);
|
PROF_START(20);
|
||||||
if (DEBUG_DICT) {
|
if (DEBUG_DICT) {
|
||||||
float ns = queuePool->getMasterQueue()->getHighestNormalizedScore(
|
float ns = queuePool->getMasterQueue()->getHighestNormalizedScore(
|
||||||
correction->getPrimaryInputWord(), codesSize, 0, 0, 0);
|
masterCorrection.getPrimaryInputWord(), codesSize, 0, 0, 0);
|
||||||
ns += 0;
|
ns += 0;
|
||||||
AKLOGI("Max normalized score = %f", ns);
|
AKLOGI("Max normalized score = %f", ns);
|
||||||
}
|
}
|
||||||
const int suggestedWordsCount =
|
const int suggestedWordsCount =
|
||||||
queuePool->getMasterQueue()->outputSuggestions(
|
queuePool->getMasterQueue()->outputSuggestions(
|
||||||
correction->getPrimaryInputWord(), codesSize, frequencies, outWords);
|
masterCorrection.getPrimaryInputWord(), codesSize, frequencies, outWords);
|
||||||
|
|
||||||
if (DEBUG_DICT) {
|
if (DEBUG_DICT) {
|
||||||
float ns = queuePool->getMasterQueue()->getHighestNormalizedScore(
|
float ns = queuePool->getMasterQueue()->getHighestNormalizedScore(
|
||||||
correction->getPrimaryInputWord(), codesSize, 0, 0, 0);
|
masterCorrection.getPrimaryInputWord(), codesSize, 0, 0, 0);
|
||||||
ns += 0;
|
ns += 0;
|
||||||
AKLOGI("Returning %d words", suggestedWordsCount);
|
AKLOGI("Returning %d words", suggestedWordsCount);
|
||||||
/// Print the returned words
|
/// Print the returned words
|
||||||
|
|
|
@ -78,13 +78,14 @@ class UnigramDictionary {
|
||||||
int getFrequency(const int32_t* const inWord, const int length) const;
|
int getFrequency(const int32_t* const inWord, const int length) const;
|
||||||
int getBigramPosition(int pos, unsigned short *word, int offset, int length) const;
|
int getBigramPosition(int pos, unsigned short *word, int offset, int length) const;
|
||||||
int getSuggestions(ProximityInfo *proximityInfo, WordsPriorityQueuePool *queuePool,
|
int getSuggestions(ProximityInfo *proximityInfo, WordsPriorityQueuePool *queuePool,
|
||||||
Correction *correction, const int *xcoordinates, const int *ycoordinates,
|
const int *xcoordinates, const int *ycoordinates,
|
||||||
const int *codes, const int codesSize, const std::map<int, int> *bigramMap,
|
const int *codes, const int codesSize, const std::map<int, int> *bigramMap,
|
||||||
const uint8_t *bigramFilter, const bool useFullEditDistance, unsigned short *outWords,
|
const uint8_t *bigramFilter, const bool useFullEditDistance, unsigned short *outWords,
|
||||||
int *frequencies) const;
|
int *frequencies) const;
|
||||||
virtual ~UnigramDictionary();
|
virtual ~UnigramDictionary();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(UnigramDictionary);
|
||||||
void getWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
void getWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
||||||
const int *ycoordinates, const int *codes, const int inputLength,
|
const int *ycoordinates, const int *codes, const int inputLength,
|
||||||
const std::map<int, int> *bigramMap, const uint8_t *bigramFilter,
|
const std::map<int, int> *bigramMap, const uint8_t *bigramFilter,
|
||||||
|
|
|
@ -182,6 +182,7 @@ class WordsPriorityQueue {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(WordsPriorityQueue);
|
||||||
struct wordComparator {
|
struct wordComparator {
|
||||||
bool operator ()(SuggestedWord * left, SuggestedWord * right) {
|
bool operator ()(SuggestedWord * left, SuggestedWord * right) {
|
||||||
return left->mScore > right->mScore;
|
return left->mScore > right->mScore;
|
||||||
|
|
|
@ -85,6 +85,7 @@ class WordsPriorityQueuePool {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(WordsPriorityQueuePool);
|
||||||
WordsPriorityQueue* mMasterQueue;
|
WordsPriorityQueue* mMasterQueue;
|
||||||
WordsPriorityQueue* mSubQueues[SUB_QUEUE_MAX_COUNT * MULTIPLE_WORDS_SUGGESTION_MAX_WORDS];
|
WordsPriorityQueue* mSubQueues[SUB_QUEUE_MAX_COUNT * MULTIPLE_WORDS_SUGGESTION_MAX_WORDS];
|
||||||
char mMasterQueueBuf[sizeof(WordsPriorityQueue)];
|
char mMasterQueueBuf[sizeof(WordsPriorityQueue)];
|
||||||
|
|
Loading…
Reference in New Issue