42 lines
868 B
C++
42 lines
868 B
C++
namespace factor {
|
|
|
|
template <typename Block> struct bump_allocator {
|
|
/* offset of 'here' and 'end' is hardcoded in compiler backends */
|
|
cell here;
|
|
cell start;
|
|
cell end;
|
|
cell size;
|
|
|
|
explicit bump_allocator(cell size_, cell start_)
|
|
: here(start_), start(start_), end(start_ + size_), size(size_) {}
|
|
|
|
bool contains_p(Block* block) { return ((cell) block - start) < size; }
|
|
|
|
Block* allot(cell size) {
|
|
cell h = here;
|
|
here = h + align(size, data_alignment);
|
|
return (Block*)h;
|
|
}
|
|
|
|
cell occupied_space() { return here - start; }
|
|
|
|
cell free_space() { return end - here; }
|
|
|
|
cell next_object_after(cell scan) {
|
|
cell size = ((Block*)scan)->size();
|
|
if (scan + size < here)
|
|
return scan + size;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
cell first_object() {
|
|
if (start != here)
|
|
return start;
|
|
else
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
}
|