Pigweed
 
Loading...
Searching...
No Matches
pw::allocator::BlockWithLayout< Derived > Class Template Reference

#include <with_layout.h>

Inheritance diagram for pw::allocator::BlockWithLayout< Derived >:
pw::allocator::internal::BaseWithLayout

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)
 

Detailed Description

template<typename Derived>
class pw::allocator::BlockWithLayout< Derived >

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:

  • size_t RequestedSize() const
    • Returns the size of the original layout
  • size_t RequestedAlignment() const
    • Returns the alignment of the original layout
  • void SetRequestedSize(size_t)
    • Records the size of the original layout
  • void SetRequestedAlignment(size_t)
    • Records the alignment from the original layout

Member Function Documentation

◆ DoAllocFirst()

template<typename Derived >
constexpr BlockResult< Derived > pw::allocator::BlockWithLayout< Derived >::DoAllocFirst ( Derived *&&  block,
Layout  layout 
)
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.

Precondition
The block must not be in use.
Returns
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.
* 
*  

◆ DoAllocLast()

template<typename Derived >
constexpr BlockResult< Derived > pw::allocator::BlockWithLayout< Derived >::DoAllocLast ( Derived *&&  block,
Layout  layout 
)
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.

Precondition
The block must not be in use.
Returns
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.
* 
*  

◆ DoFree()

template<typename Derived >
constexpr BlockResult< Derived > pw::allocator::BlockWithLayout< Derived >::DoFree ( Derived *&&  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.

◆ DoResize()

template<typename Derived >
constexpr BlockResult< Derived > pw::allocator::BlockWithLayout< Derived >::DoResize ( size_t  new_inner_size,
bool  shifted = false 
)
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.

Precondition
The block must be in use.
Returns
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.
* 
*  

◆ RequestedLayout()

template<typename Derived >
constexpr Layout pw::allocator::BlockWithLayout< Derived >::RequestedLayout
constexpr
Returns
The memory layout that was requested using AllocFirst, AllocLast, or Resize.
Precondition
The block must be in use.

The documentation for this class was generated from the following file: