std.experimental.allocator.building_blocks.segregator.Segregator
- multiple declarations
Struct Segregator
Dispatches allocations (and deallocations) between two allocators (SmallAllocator
and LargeAllocator
) depending on the size allocated, as
follows. All allocations smaller than or equal to threshold
will be
dispatched to SmallAllocator
. The others will go to LargeAllocator
.
struct Segregator(ulong threshold, SmallAllocator, LargeAllocator)
;
If both allocators are shared
, the Segregator
will also offer shared
methods.
Methods
Name | Description |
---|---|
alignedAllocate
(, )
|
This method is defined if both allocators define it, and forwards to
SmallAllocator or LargeAllocator appropriately.
|
alignedReallocate
(b, s, a)
|
This method is defined only if at least one of the allocators defines
it, and work similarly to reallocate .
|
allocate
()
|
The memory is obtained from SmallAllocator if s <= threshold ,
or LargeAllocator otherwise.
|
allocatorForSize
()
|
Composite allocators involving nested instantiations of Segregator make
it difficult to access individual sub-allocators stored within. allocatorForSize simplifies the task by supplying the allocator nested
inside a Segregator that is responsible for a specific size s .
|
deallocate
(b)
|
This function is defined only if both allocators define it, and forwards
appropriately depending on b .
|
deallocateAll
()
|
This function is defined only if both allocators define it, and calls
deallocateAll for them in turn.
|
empty
()
|
This function is defined only if both allocators define it, and returns
the conjunction of empty calls for the two.
|
expand
(b, delta)
|
This method is defined only if at least one of the allocators defines
it. If SmallAllocator defines expand and b , the call is forwarded to SmallAllocator . If LargeAllocator defines expand and b , the
call is forwarded to LargeAllocator . Otherwise, the call returns
false .
|
goodAllocSize
(s)
|
This method is defined only if at least one of the allocators defines
it. The good allocation size is obtained from SmallAllocator if s <= threshold , or LargeAllocator otherwise. (If one of the
allocators does not define goodAllocSize , the default
implementation in this module applies.)
|
owns
(b)
|
This method is defined only if both allocators define it. The call is
forwarded to SmallAllocator if b , or LargeAllocator otherwise.
|
reallocate
(b, s)
|
This method is defined only if at least one of the allocators defines
it. If SmallAllocator defines reallocate and b , the call is forwarded to SmallAllocator . If LargeAllocator defines expand and b , the call is forwarded to LargeAllocator . Otherwise, the call returns false .
|
Example
import std .experimental .allocator .building_blocks .free_list : FreeList;
import std .experimental .allocator .gc_allocator : GCAllocator;
import std .experimental .allocator .mallocator : Mallocator;
alias A =
Segregator!(
1024 * 4,
Segregator!(
128, FreeList!(Mallocator, 0, 128),
GCAllocator),
Segregator!(
1024 * 1024, Mallocator,
GCAllocator)
);
A a;
auto b = a .allocate(200);
writeln(b .length); // 200
a .deallocate(b);
Alias Segregator
A Segregator
with more than three arguments expands to a composition of
elemental Segregator
s, as illustrated by the following example:
alias Segregator(Args...)
= Segregator!(Args[cutPoint],.Segregator!(Args[0..cutPoint],Args[cutPoint+1]),.Segregator!(Args[cutPoint+2..__dollar]));
alias A =
Segregator!(
n1, A1,
n2, A2,
n3, A3,
A4
);
With this definition, allocation requests for n1
bytes or less are directed
to A1
; requests between n1 + 1
and n2
bytes (inclusive) are
directed to A2
; requests between n2 + 1
and n3
bytes (inclusive)
are directed to A3
; and requests for more than n3
bytes are directed
to A4
. If some particular range should not be handled, NullAllocator
may be used appropriately.
Example
import std .experimental .allocator .building_blocks .free_list : FreeList;
import std .experimental .allocator .gc_allocator : GCAllocator;
import std .experimental .allocator .mallocator : Mallocator;
alias A =
Segregator!(
128, FreeList!(Mallocator, 0, 128),
1024 * 4, GCAllocator,
1024 * 1024, Mallocator,
GCAllocator
);
A a;
auto b = a .allocate(201);
writeln(b .length); // 201
a .deallocate(b);