Use placement new to construct the queue

Change-Id: I455f9954165bd4524f2883db7ea24a6fed3015f9
diff --git a/native/src/defines.h b/native/src/defines.h
index d636e51..fdca0b2 100644
--- a/native/src/defines.h
+++ b/native/src/defines.h
@@ -205,6 +205,7 @@
 // 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 84f2523..97d45c1 100644
--- a/native/src/words_priority_queue.h
+++ b/native/src/words_priority_queue.h
@@ -48,6 +48,7 @@
             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 3862976..bf9619e 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 <assert.h>
+#include <new>
 #include "words_priority_queue.h"
 
 namespace latinime {
@@ -24,30 +26,45 @@
 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)];
 };
 }