| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /*
- * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
- #include "linear_allocator.h"
- #include "memory.h"
- namespace crown
- {
- LinearAllocator::LinearAllocator(Allocator& backing, size_t size)
- : _backing(&backing)
- , _physical_start(NULL)
- , _total_size(size)
- , _offset(0)
- {
- _physical_start = backing.allocate(size);
- }
- LinearAllocator::LinearAllocator(void* start, size_t size)
- : _backing(NULL)
- , _physical_start(start)
- , _total_size(size)
- , _offset(0)
- {
- }
- LinearAllocator::~LinearAllocator()
- {
- if (_backing)
- {
- _backing->deallocate(_physical_start);
- }
- CE_ASSERT(_offset == 0, "Memory leak of %ld bytes, maybe you forgot to call clear()?", _offset);
- }
- void* LinearAllocator::allocate(size_t size, size_t align)
- {
- const size_t actual_size = size + align;
- // Memory exhausted
- if (_offset + actual_size > _total_size)
- {
- return NULL;
- }
- void* user_ptr = memory::align_top((char*) _physical_start + _offset, align);
- _offset += actual_size;
- return user_ptr;
- }
- void LinearAllocator::deallocate(void* /*data*/)
- {
- // Single deallocations not supported. Use clear().
- }
- void LinearAllocator::clear()
- {
- _offset = 0;
- }
- } // namespace crown
|