Defined only if parent.alignedAllocate exists and works similarly to allocate by forwarding to parent.alignedAllocate(goodAllocSize(n), a).
Defined only if ParentAllocator.alignedAllocate exists. Expansion occurs in place under the conditions required by expand. Shrinking occurs in place if goodAllocSize(b.length) == goodAllocSize(s).
Gets a larger buffer buf by calling parent.allocate(goodAllocSize(n)). If buf is null, returns null. Otherwise, returns buf[0 .. n].
Defined if ParentAllocator.deallocate exists and forwards to parent.deallocate(b.ptr[0 .. goodAllocSize(b.length)]).
First checks whether there's enough slack memory preallocated for b by evaluating b.length + delta <= goodAllocSize(b.length). If that's the case, expands b in place. Otherwise, attempts to use parent.expand appropriately if present.
Returns roundingFunction(n).
Expands or shrinks allocated block to an allocated size of goodAllocSize(s). Expansion occurs in place under the conditions required by expand. Shrinking occurs in place if goodAllocSize(b.length) == goodAllocSize(s).
Alignment is identical to that of the parent.
The parent allocator. Depending on whether ParentAllocator holds state or not, this is a member variable or an alias for ParentAllocator.instance.
import stdx.allocator.building_blocks.free_tree : FreeTree; import stdx.allocator.gc_allocator : GCAllocator; size_t roundUpToMultipleOf(size_t s, uint base) { auto rem = s % base; return rem ? s + base - rem : s; } // Quantize small allocations to a multiple of cache line, large ones to a // multiple of page size alias MyAlloc = Quantizer!( FreeTree!GCAllocator, n => roundUpToMultipleOf(n, n <= 16_384 ? 64 : 4096)); MyAlloc alloc; const buf = alloc.allocate(256); assert(buf.ptr);
This allocator sits on top of ParentAllocator and quantizes allocation sizes, usually from arbitrary positive numbers to a small set of round numbers (e.g. powers of two, page sizes etc). This technique is commonly used to:
The following methods are forwarded to the parent allocator if present: allocateAll, owns, deallocateAll, empty.
Preconditions: roundingFunction must satisfy three constraints. These are not enforced (save for the use of assert) for the sake of efficiency.