std.experimental.allocator.building_blocks.bucketizer
- struct Bucketizer(Allocator, size_t min, size_t max, size_t step);
-
A
Bucketizer
uses distinct allocators for handling allocations of sizes in the intervals[min, min + step - 1]
,[min + step, min + 2 * step - 1]
,[min + 2 * step, min + 3 * step - 1]
,...
,[max - step + 1, max]
.Bucketizer
holds a fixed-size array of allocators and dispatches calls to them appropriately. The size of the array is(max + 1 - min) / step
, which must be an exact division.
Allocations for sizes smaller thanmin
or larger thanmax
are illegal forBucketizer
. To handle them separately,Segregator
may be of use.- Examples:
-
import std.algorithm.comparison : max; import std.experimental.allocator.building_blocks.allocator_list : AllocatorList; import std.experimental.allocator.building_blocks.free_list : FreeList; import std.experimental.allocator.building_blocks.region : Region; import std.experimental.allocator.common : unbounded; import std.experimental.allocator.mallocator : Mallocator; import std.typecons : Ternary; Bucketizer!( FreeList!( AllocatorList!( (size_t n) => Region!Mallocator(max(n, 1024 * 1024))), 0, unbounded), 65, 512, 64) a; auto b = a.allocate(400); writeln(b.length); // 400 writeln(a.owns(b)); // Ternary.yes a.deallocate(b);
- Allocator[(max + 1 - min) / step] buckets;
-
The array of allocators is publicly available for e.g. initialization and inspection.
- enum uint alignment;
-
The alignment offered is the same as
Allocator.alignment
. - const pure nothrow @nogc @safe size_t goodAllocSize(size_t bytes);
-
Rounds up to the maximum size of the bucket in which
bytes
falls. - void[] allocate(size_t bytes);
-
Directs the call to either one of the
buckets
allocators. - void[] alignedAllocate(size_t bytes, uint alignment);
-
Allocates the requested
bytes
of memory with specifiedalignment
. Directs the call to either one of thebuckets
allocators. Defined only ifAllocator
definesalignedAllocate
. - bool expand(ref void[] b, size_t delta);
-
This method allows expansion within the respective bucket range. It succeeds if both
b.length
andb.length + delta
fall in a range of the form[min + k * step, min + (k + 1) * step - 1]
. - bool reallocate(ref void[] b, size_t size);
-
This method allows reallocation within the respective bucket range. If both
b.length
andsize
fall in a range of the form[min + k * step, min + (k + 1) * step - 1]
, then reallocation is in place. Otherwise, reallocation with moving is attempted. - bool alignedReallocate(ref void[] b, size_t size, uint a);
-
Similar to
reallocate
, with alignment. Defined only ifAllocator
definesalignedReallocate
. - Ternary owns(void[] b);
-
Defined only if
Allocator
definesowns
. Finds the owner ofb
and forwards the call to it. - bool deallocate(void[] b);
-
This method is only defined if
Allocator
definesdeallocate
. - bool deallocateAll();
-
This method is only defined if all allocators involved define
deallocateAll
, and calls it for each bucket in turn. Returnstrue
if all allocators could deallocate all. - Ternary resolveInternalPointer(const void* p, ref void[] result);
-
This method is only defined if all allocators involved define
resolveInternalPointer
, and tries it for each bucket in turn.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_experimental_allocator_building_blocks_bucketizer.html