|
|
#pragma once |
|
|
#include "MemPool.h" |
|
|
|
|
|
namespace Moses2 |
|
|
{ |
|
|
|
|
|
template<typename T> |
|
|
class MemPoolAllocator |
|
|
{ |
|
|
public: |
|
|
typedef T value_type; |
|
|
typedef T* pointer; |
|
|
typedef const T* const_pointer; |
|
|
typedef T& reference; |
|
|
typedef const T& const_reference; |
|
|
typedef std::size_t size_type; |
|
|
typedef std::ptrdiff_t difference_type; |
|
|
|
|
|
template<class U> |
|
|
struct rebind { |
|
|
typedef MemPoolAllocator<U> other; |
|
|
}; |
|
|
|
|
|
MemPoolAllocator(Moses2::MemPool &pool) : |
|
|
m_pool(pool) { |
|
|
} |
|
|
MemPoolAllocator(const MemPoolAllocator &other) : |
|
|
m_pool(other.m_pool) { |
|
|
} |
|
|
|
|
|
template<class U> |
|
|
MemPoolAllocator(const MemPoolAllocator<U>& other) : |
|
|
m_pool(other.m_pool) { |
|
|
} |
|
|
|
|
|
size_type max_size() const { |
|
|
return std::numeric_limits<size_type>::max(); |
|
|
} |
|
|
|
|
|
void deallocate(pointer p, size_type n) { |
|
|
|
|
|
} |
|
|
|
|
|
pointer allocate(size_type n, std::allocator<void>::const_pointer hint = 0) { |
|
|
|
|
|
pointer ret = m_pool.Allocate<T>(n); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
void construct(pointer p, const_reference val) { |
|
|
|
|
|
new ((void *) p) T(val); |
|
|
} |
|
|
|
|
|
void destroy(pointer p) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
pointer address (reference value) const { |
|
|
return &value; |
|
|
} |
|
|
const_pointer address (const_reference value) const { |
|
|
return &value; |
|
|
} |
|
|
|
|
|
bool operator==(const MemPoolAllocator<T> &allocator) const { |
|
|
return true; |
|
|
} |
|
|
|
|
|
bool operator!=(const MemPoolAllocator<T> &allocator) const { |
|
|
return false; |
|
|
} |
|
|
|
|
|
MemPoolAllocator<T>& operator=(const MemPoolAllocator<T>& allocator) { |
|
|
return *this; |
|
|
} |
|
|
|
|
|
MemPool &m_pool; |
|
|
protected: |
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|