free_list_allocator(cell size, cell start);
void initial_free_list(cell occupied);
bool contains_p(Block* block);
- Block* next_allocated_block_after(Block* block);
bool can_allot_p(cell size);
Block* allot(cell size);
void free(Block* block);
return ((cell)block - start) < size;
}
-template <typename Block>
-Block* free_list_allocator<Block>::next_allocated_block_after(Block* block) {
- while ((cell)block != this->end && block->free_p()) {
- free_heap_block* free_block = (free_heap_block*)block;
- block = (Block*)((cell)free_block + free_block->size());
- }
-
- if ((cell)block == this->end)
- return NULL;
- else
- return block;
-}
-
template <typename Block>
bool free_list_allocator<Block>::can_allot_p(cell size) {
return free_blocks.can_allot_p(size);
void operator()(Block* block, cell size) {
if (this->state->marked_p((cell)block)) {
- *finger = (Block*)((char*)block + size);
+ *finger = (Block*)((cell)block + size);
memmove((Block*)address, block, size);
iter(block, (Block*)address, size);
address += size;
template <typename Block>
template <typename Iterator, typename Fixup>
void free_list_allocator<Block>::iterate(Iterator& iter, Fixup fixup) {
- Block* scan = (Block*)this->start;
- Block* end = (Block*)this->end;
-
- while (scan != end) {
- cell size = fixup.size(scan);
- Block* next = (Block*)((cell)scan + size);
- if (!scan->free_p())
- iter(scan, size);
- scan = next;
+ cell scan = this->start;
+ while (scan != this->end) {
+ cell size = fixup.size((Block*)scan);
+ if (!((Block*)scan)->free_p())
+ iter((Block*)scan, size);
+ scan += size;
}
}
return NULL;
}
+ cell next_allocated_object_after(cell scan) {
+ while (scan != this->end && ((object*)scan)->free_p()) {
+ free_heap_block* free_block = (free_heap_block*)scan;
+ scan = (cell)free_block + free_block->size();
+ }
+ return scan == this->end ? 0 : scan;
+ }
+
cell first_object() {
- return (cell)next_allocated_block_after((object*)this->start);
+ return next_allocated_object_after(this->start);
}
cell next_object_after(cell scan) {
cell size = ((object*)scan)->size();
- object* next = (object*)(scan + size);
- return (cell)next_allocated_block_after(next);
+ return next_allocated_object_after(scan + size);
}
void sweep() {