#ifndef HOARD_BUMPALLOC_H
#define HOARD_BUMPALLOC_H
#include "mallocinfo.h"
namespace Hoard {
template <int ChunkSize,
class SuperHeap>
class BumpAlloc : public SuperHeap {
public:
enum { Alignment = HL::MallocInfo::Alignment };
BumpAlloc()
: _bump (nullptr),
_remaining (0)
{}
inline void * malloc (size_t sz) {
if (sz < HL::MallocInfo::MinSize) {
sz = HL::MallocInfo::MinSize;
}
sz = HL::align<HL::MallocInfo::Alignment>(sz);
if (_remaining < sz) {
refill(sz);
}
if (_bump) {
char * old = _bump;
_bump += sz;
_remaining -= sz;
assert ((size_t) old % Alignment == 0);
return old;
} else {
return nullptr;
}
}
inline void free (void *) {}
private:
char * _bump;
size_t _remaining;
void refill (size_t sz) {
if (sz < ChunkSize) {
sz = ChunkSize;
}
_bump = (char *) SuperHeap::malloc (sz);
assert ((size_t) _bump % Alignment == 0);
if (_bump) {
_remaining = sz;
} else {
_remaining = 0;
}
}
};
}
#endif