#include <with_layout.h>
Public Member Functions | |
constexpr Layout | RequestedLayout () const |
Protected Member Functions | |
constexpr BlockResult< Derived > | DoResize (size_t new_inner_size, bool shifted=false) |
Static Protected Member Functions | |
static constexpr BlockResult< Derived > | DoAllocFirst (Derived *&&block, Layout layout) |
static constexpr BlockResult< Derived > | DoAllocLast (Derived *&&block, Layout layout) |
static constexpr BlockResult< Derived > | DoFree (Derived *&&block) |
Mix-in for blocks that can retrieve the layout used to allocate them.
Block mix-ins are stateless and trivially constructible. See BasicBlock
for details on how mix-ins can be combined to implement blocks.
This mix-in requires its derived type also derive from AlignableBlock
and provide the following symbols:
|
staticconstexprprotected |
Splits an aligned block from the start of the block, and marks it as used.
If successful, block
will be replaced by a block that has an inner size of at least inner_size
, and whose starting address is aligned to an alignment
boundary. If unsuccessful, block
will be unmodified.
This method is static in order to consume the given block pointer. On success, a pointer to the new, smaller block is returned. In total, up to two additional blocks may be created: one to pad the returned block to an alignment boundary and one for the trailing space. On error, the original pointer is returned.
For larger alignments, the AllocLast
method is generally preferable to this method, as this method may create an additional fragments both before and after the returned block in order to align the usable space.
embed:rst:leading-asterisk * * .. pw-status-codes:: * * OK: The split completed successfully. The `BlockAllocType` indicates * how extra memory was distributed to other blocks. * * FAILED_PRECONDITION: This block is in use and cannot be split. * * RESOURCE_EXHAUSTED: The available space is insufficient to fulfill the * request. This may be due to a large requested size, or insufficient * remaining space to fulfill the requested alignment create a valid * leading block, and/or create a valid trailing block. * *
|
staticconstexprprotected |
Splits an aligned block from the end of the block, and marks it as used.
If successful, block
will be replaced by a block that has an inner size of at least inner_size
, and whose starting address is aligned to an alignment
boundary. If unsuccessful, block
will be unmodified.
This method is static in order to consume the given block pointer. On success, a pointer to the new, smaller block is returned. In total, up to two additional blocks may be created: one to pad the returned block to an alignment boundary and one for the trailing space. On error, the original pointer is returned.
embed:rst:leading-asterisk * * .. pw-status-codes:: * * OK: The split completed successfully. The `BlockAllocType` indicates * how extra memory was distributed to other blocks. * * FAILED_PRECONDITION: This block is in use and cannot be split. * * RESOURCE_EXHAUSTED: The available space is insufficient to fulfill the * request. This may be due to a large requested size, or insufficient * remaining space to fulfill the requested alignment create a valid * leading block, and/or create a valid trailing block. * *
|
staticconstexprprotected |
Marks the block as free.
This method is static in order to consume the given block pointer. It returns a pointer to a freed block that is the result of merging the given block with either or both of its neighbors, if they were free.
Note: Freeing may modify the adjacent blocks if they are free. Allocators that track free blocks must be prepared to handle this merge.
|
constexprprotected |
Grows or shrinks the block.
If successful, block
may be merged with the block after it in order to provide additional memory (when growing) or to merge released memory (when shrinking). If unsuccessful, block
will be unmodified.
Note: Resizing may modify the block following this one if it is free. Allocators that track free blocks based on their size must be prepared to handle this size change.
embed:rst:leading-asterisk * * .. pw-status-codes:: * * OK: The resize completed successfully. * * FAILED_PRECONDITION: This block is not in use. * * RESOURCE_EXHAUSTED: The available space is insufficient to fulfill the * request. This may be due to a large requested size, or insufficient * remaining space to fulfill the requested alignment create a valid * leading block, and/or create a valid trailing block. * *
|
constexpr |