From b960477952101633d053b459e669db46d3234ac3 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 13 Jan 2012 15:41:17 +0900 Subject: [PATCH] Use placement new to construct the queue Change-Id: I455f9954165bd4524f2883db7ea24a6fed3015f9 --- native/src/defines.h | 1 + native/src/words_priority_queue.h | 1 + native/src/words_priority_queue_pool.h | 41 ++++++++++++++++++-------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/native/src/defines.h b/native/src/defines.h index d636e5197..fdca0b28b 100644 --- a/native/src/defines.h +++ b/native/src/defines.h @@ -205,6 +205,7 @@ static void dumpWord(const unsigned short* word, const int length) { // Word limit for sub queues used in WordsPriorityQueuePool. Sub queues are temporary queues used // for better performance. #define SUB_QUEUE_MAX_WORDS 5 +#define SUB_QUEUE_MAX_COUNT 10 #define MAX_DEPTH_MULTIPLIER 3 diff --git a/native/src/words_priority_queue.h b/native/src/words_priority_queue.h index 84f2523c2..97d45c1d9 100644 --- a/native/src/words_priority_queue.h +++ b/native/src/words_priority_queue.h @@ -48,6 +48,7 @@ class WordsPriorityQueue { mSuggestedWords[i].mUsed = false; } } + ~WordsPriorityQueue() { delete[] mSuggestedWords; } diff --git a/native/src/words_priority_queue_pool.h b/native/src/words_priority_queue_pool.h index 386297650..bf9619e19 100644 --- a/native/src/words_priority_queue_pool.h +++ b/native/src/words_priority_queue_pool.h @@ -17,6 +17,8 @@ #ifndef LATINIME_WORDS_PRIORITY_QUEUE_POOL_H #define LATINIME_WORDS_PRIORITY_QUEUE_POOL_H +#include +#include #include "words_priority_queue.h" namespace latinime { @@ -24,30 +26,45 @@ namespace latinime { class WordsPriorityQueuePool { public: WordsPriorityQueuePool(int mainQueueMaxWords, int subQueueMaxWords, int maxWordLength) { - mMasterQueue = new WordsPriorityQueue(mainQueueMaxWords, maxWordLength); - mSubQueue1 = new WordsPriorityQueue(subQueueMaxWords, maxWordLength); - mSubQueue2 = new WordsPriorityQueue(subQueueMaxWords, maxWordLength); + mMasterQueue = new(mMasterQueueBuf) WordsPriorityQueue(mainQueueMaxWords, maxWordLength); + for (int i = 0, subQueueBufOffset = 0; i < SUB_QUEUE_MAX_COUNT; + ++i, subQueueBufOffset += sizeof(WordsPriorityQueue)) { + mSubQueues1[i] = new(mSubQueueBuf1 + subQueueBufOffset) + WordsPriorityQueue(subQueueMaxWords, maxWordLength); + mSubQueues2[i] = new(mSubQueueBuf2 + subQueueBufOffset) + WordsPriorityQueue(subQueueMaxWords, maxWordLength); + } } - ~WordsPriorityQueuePool() { - delete mMasterQueue; + virtual ~WordsPriorityQueuePool() { } WordsPriorityQueue* getMasterQueue() { return mMasterQueue; } + // TODO: Come up with more generic pool - WordsPriorityQueue* getSubQueue1() { - return mSubQueue1; + WordsPriorityQueue* getSubQueue1(const int id) { + if (DEBUG_WORDS_PRIORITY_QUEUE) { + assert(id >= 0 && id < SUB_QUEUE_MAX_COUNT); + } + return mSubQueues1[id]; } - WordsPriorityQueue* getSubQueue2() { - return mSubQueue2; + + WordsPriorityQueue* getSubQueue2(const int id) { + if (DEBUG_WORDS_PRIORITY_QUEUE) { + assert(id >= 0 && id < SUB_QUEUE_MAX_COUNT); + } + return mSubQueues2[id]; } private: - WordsPriorityQueue *mMasterQueue; - WordsPriorityQueue *mSubQueue1; - WordsPriorityQueue *mSubQueue2; + WordsPriorityQueue* mMasterQueue; + WordsPriorityQueue* mSubQueues1[SUB_QUEUE_MAX_COUNT]; + WordsPriorityQueue* mSubQueues2[SUB_QUEUE_MAX_COUNT]; + char mMasterQueueBuf[sizeof(WordsPriorityQueue)]; + char mSubQueueBuf1[SUB_QUEUE_MAX_COUNT * sizeof(WordsPriorityQueue)]; + char mSubQueueBuf2[SUB_QUEUE_MAX_COUNT * sizeof(WordsPriorityQueue)]; }; }