55 lines
		
	
	
		
			833 B
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			833 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;
 | |
| 	}
 | |
| };
 | |
| 
 | |
| }
 |