namespace factor { template 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; } }; }