my MemPool

This commit is contained in:
Hieu Hoang 2015-10-28 14:39:40 +00:00
parent a7c6c9a583
commit 77a2de1d9d
3 changed files with 127 additions and 0 deletions

View File

@ -13,6 +13,7 @@ import path ;
InputPaths.cpp
Main.cpp
Manager.cpp
MemPool.cpp
Phrase.cpp
PhraseTable.cpp
Scores.cpp

View File

@ -0,0 +1,62 @@
/*
* MemPool.cpp
*
* Created on: 28 Oct 2015
* Author: hieu
*/
#include "MemPool.h"
#include "util/scoped.hh"
MemPool::Page::Page(std::size_t vSize)
:size(vSize)
{
mem = (uint8_t*) util::MallocOrThrow(size);
end = mem + size;
}
MemPool::Page::~Page()
{
}
////////////////////////////////////////////////////
MemPool::MemPool(size_t initSize)
:m_currSize(initSize)
,m_currPage(0)
{
m_pages.push_back(Page(m_currSize));
}
MemPool::~MemPool() {
}
void *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);
m_pages.push_back(Page(amount));
Page &page = m_pages.back();
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);
}
}
}

View File

@ -0,0 +1,64 @@
/*
* MemPool.h
*
* Created on: 28 Oct 2015
* Author: hieu
*/
#ifndef MEMPOOL_H_
#define MEMPOOL_H_
#include <vector>
#include <stdint.h>
class MemPool {
struct Page {
uint8_t *mem;
uint8_t *end;
size_t size;
Page(std::size_t size);
~Page();
};
public:
MemPool(std::size_t initSize = 10000);
~MemPool();
void *Allocate(std::size_t size) {
void *ret = current_;
current_ += size;
Page &page = m_pages[m_currPage];
if (current_ < page.end) {
// return what we got
} else {
ret = More(size);
}
return ret;
}
template<typename T>
T *Allocate(size_t num = 1) {
void *ret = Allocate(sizeof(T) * num);
return (T*) ret;
}
private:
void *More(std::size_t size);
std::vector<Page> m_pages;
size_t m_currSize;
size_t m_currPage;
uint8_t *current_;
// no copying
MemPool(const MemPool &);
MemPool &operator=(const MemPool &);
};
#endif /* MEMPOOL_H_ */