Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/moses2/MemPool.cpp')
-rw-r--r--contrib/moses2/MemPool.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/moses2/MemPool.cpp b/contrib/moses2/MemPool.cpp
new file mode 100644
index 000000000..7e159117b
--- /dev/null
+++ b/contrib/moses2/MemPool.cpp
@@ -0,0 +1,83 @@
+/*
+ * MemPool.cpp
+ *
+ * Created on: 28 Oct 2015
+ * Author: hieu
+ */
+
+#include <boost/foreach.hpp>
+#include "MemPool.h"
+#include "util/scoped.hh"
+#include "legacy/Util2.h"
+
+using namespace std;
+
+namespace Moses2
+{
+
+MemPool::Page::Page(std::size_t vSize) :
+ size(vSize)
+{
+ mem = (uint8_t*) util::MallocOrThrow(size);
+ end = mem + size;
+}
+
+MemPool::Page::~Page()
+{
+ free(mem);
+}
+////////////////////////////////////////////////////
+MemPool::MemPool(size_t initSize) :
+ m_currSize(initSize), m_currPage(0)
+{
+ Page *page = new Page(m_currSize);
+ m_pages.push_back(page);
+
+ current_ = page->mem;
+ //cerr << "new memory pool";
+}
+
+MemPool::~MemPool()
+{
+ //cerr << "delete memory pool" << endl;
+ RemoveAllInColl(m_pages);
+}
+
+uint8_t *MemPool::More(std::size_t size)
+{
+ ++m_currPage;
+ if (m_currPage >= m_pages.size()) {
+ // add new page
+ m_currSize <<= 1;
+ std::size_t amount = std::max(m_currSize, size);
+
+ Page *page = new Page(amount);
+ m_pages.push_back(page);
+
+ uint8_t *ret = page->mem;
+ current_ = ret + size;
+ return ret;
+ }
+ else {
+ // use existing page
+ Page &page = *m_pages[m_currPage];
+ if (size <= page.size) {
+ uint8_t *ret = page.mem;
+ current_ = ret + size;
+ return ret;
+ }
+ else {
+ // recursive call More()
+ return More(size);
+ }
+ }
+}
+
+void MemPool::Reset()
+{
+ m_currPage = 0;
+ current_ = m_pages[0]->mem;
+}
+
+}
+