#include <allocator.h>
Public Member Functions | |
void * | Allocate (Layout layout) |
template<typename T , int &... kExplicitGuard, typename... Args> | |
std::enable_if_t<!std::is_array_v< T >, T * > | New (Args &&... args) |
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
ElementType * | New (size_t count) |
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
ElementType * | New (size_t count, size_t alignment) |
template<typename T > | |
T * | NewArray (size_t count) |
template<typename T > | |
T * | NewArray (size_t count, size_t alignment) |
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args> | |
UniquePtr< T > | MakeUnique (Args &&... args) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
UniquePtr< T > | MakeUnique (size_t size) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
UniquePtr< T > | MakeUnique (size_t size, size_t alignment) |
template<typename T > | |
UniquePtr< T[]> | MakeUniqueArray (size_t size) |
template<typename T > | |
UniquePtr< T[]> | MakeUniqueArray (size_t size, size_t alignment) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args> | |
void | MakeUnique (Args &&...)=delete |
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args> | |
SharedPtr< T > | MakeShared (Args &&... args) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
SharedPtr< T > | MakeShared (size_t size) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
SharedPtr< T > | MakeShared (size_t size, size_t alignment) |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args> | |
std::enable_if_t< is_bounded_array_v< T > > | MakeShared (Args &&...)=delete |
bool | Resize (void *ptr, size_t new_size) |
bool | Resize (void *ptr, Layout layout, size_t new_size) |
void * | Reallocate (void *ptr, Layout new_layout) |
void * | Reallocate (void *ptr, Layout old_layout, size_t new_size) |
size_t | GetAllocated () const |
![]() | |
constexpr const Capabilities & | capabilities () const |
bool | HasCapability (Capability capability) const |
Returns whether a given capabilityis enabled for this object. | |
void | Deallocate (void *ptr) |
void | Deallocate (void *ptr, Layout layout) |
template<typename T > | |
void | Delete (T *ptr) |
StatusWithSize | GetCapacity () const |
bool | IsEqual (const Deallocator &other) const |
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args> | |
void | WrapUnique (Args &&...)=delete |
Protected Member Functions | |
constexpr | Allocator ()=default |
TODO(b/326509341): Remove when downstream consumers migrate. | |
constexpr | Allocator (const Capabilities &capabilities) |
![]() | |
constexpr | Deallocator ()=default |
TODO(b/326509341): Remove when downstream consumers migrate. | |
constexpr | Deallocator (const Capabilities &capabilities) |
template<typename T , std::enable_if_t<!std::is_array_v< T >, int > = 0> | |
UniquePtr< T > | WrapUnique (T *ptr) |
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> | |
UniquePtr< T > | WrapUnique (ElementType *ptr, size_t size) |
template<typename T > | |
UniquePtr< T[]> | WrapUniqueArray (T *ptr, size_t size) |
Private Member Functions | |
virtual void * | DoAllocate (Layout layout)=0 |
virtual bool | DoResize (void *, size_t) |
virtual bool | DoResize (void *, Layout, size_t) |
virtual void * | DoReallocate (void *ptr, Layout new_layout) |
virtual void * | DoReallocate (void *ptr, Layout old_layout, size_t new_size) |
virtual size_t | DoGetAllocated () const |
Additional Inherited Members | |
![]() | |
using | Capabilities = allocator::Capabilities |
using | Capability = allocator::Capability |
using | Layout = allocator::Layout |
![]() | |
template<typename T > | |
static constexpr bool | is_bounded_array_v |
template<typename T > | |
static constexpr bool | is_unbounded_array_v |
Abstract interface for variable-layout memory allocation.
The interface makes no guarantees about its implementation. Consumers of the generic interface must not make any assumptions around allocator behavior, thread safety, or performance.
|
inline |
Allocates a block of memory with the specified size and alignment.
Returns nullptr
if the allocation cannot be made, or the layout
has a size of 0.
[in] | layout | Describes the memory to be allocated. |
|
privatepure virtual |
Virtual Allocate
function implemented by derived classes.
[in] | layout | Describes the memory to be allocated. Guaranteed to have a non-zero size. |
Implemented in pw::allocator::BlockAllocator< BlockType_ >, pw::allocator::BlockAllocator< BestFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< BucketBlock<> >, pw::allocator::BlockAllocator< DlBlock< uintptr_t > >, pw::allocator::BlockAllocator< FirstFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< TlsfBlock< uint32_t > >, pw::allocator::BlockAllocator< WorstFitBlock< uintptr_t > >, pw::allocator::BuddyAllocator< kMinOuterSize_, kNumBuckets >, pw::allocator::BumpAllocator, pw::allocator::FallbackAllocator, pw::allocator::LibCAllocator, pw::allocator::SynchronizedAllocator< LockType >, pw::allocator::SynchronizedAllocator< pw::sync::Mutex >, pw::allocator::test::AllocatorForTest< kBufferSize, BlockType_, MetricsType >, pw::allocator::test::AllocatorForTest< 1024 >, pw::allocator::TrackingAllocator< MetricsType >, pw::allocator::TrackingAllocator< internal::AllMetrics >, and pw::allocator::NullAllocator.
|
inlineprivatevirtual |
Virtual GetAllocated
function that can be overridden by derived classes.
The default implementation simply returns size_t(-1)
, indicating that tracking total allocated bytes is not supported.
Reimplemented in pw::allocator::BlockAllocator< BlockType_ >, pw::allocator::BlockAllocator< BestFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< BucketBlock<> >, pw::allocator::BlockAllocator< DlBlock< uintptr_t > >, pw::allocator::BlockAllocator< FirstFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< TlsfBlock< uint32_t > >, pw::allocator::BlockAllocator< WorstFitBlock< uintptr_t > >, pw::allocator::BumpAllocator, pw::allocator::FallbackAllocator, pw::allocator::SynchronizedAllocator< LockType >, pw::allocator::SynchronizedAllocator< pw::sync::Mutex >, pw::allocator::test::AllocatorForTest< kBufferSize, BlockType_, MetricsType >, pw::allocator::test::AllocatorForTest< 1024 >, pw::allocator::TrackingAllocator< MetricsType >, and pw::allocator::TrackingAllocator< internal::AllMetrics >.
|
privatevirtual |
Virtual Reallocate
function that can be overridden by derived classes.
The default implementation will first try to Resize
the data. If that is unsuccessful, it will allocate an entirely new block, copy existing data, and deallocate the given block.
[in] | ptr | Pointer to memory, guaranteed to not be null. |
[in] | new_layout | Describes the memory to be allocated. Guaranteed to have a non-zero size. |
Reimplemented in pw::allocator::LibCAllocator, pw::allocator::SynchronizedAllocator< LockType >, pw::allocator::SynchronizedAllocator< pw::sync::Mutex >, pw::allocator::TrackingAllocator< MetricsType >, and pw::allocator::TrackingAllocator< internal::AllMetrics >.
|
privatevirtual |
Deprecated version of DoReallocate
that takes a Layout
. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inlineprivatevirtual |
Deprecated version of DoResize
that takes a Layout
. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inlineprivatevirtual |
Virtual Resize
function implemented by derived classes.
The default implementation simply returns false
, indicating that resizing is not supported.
[in] | ptr | Pointer to memory, guaranteed to not be null. |
[in] | new_size | Requested size, guaranteed to be non-zero.. |
Reimplemented in pw::allocator::BlockAllocator< BlockType_ >, pw::allocator::BlockAllocator< BestFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< BucketBlock<> >, pw::allocator::BlockAllocator< DlBlock< uintptr_t > >, pw::allocator::BlockAllocator< FirstFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< TlsfBlock< uint32_t > >, pw::allocator::BlockAllocator< WorstFitBlock< uintptr_t > >, pw::allocator::FallbackAllocator, pw::allocator::SynchronizedAllocator< LockType >, pw::allocator::SynchronizedAllocator< pw::sync::Mutex >, pw::allocator::test::AllocatorForTest< kBufferSize, BlockType_, MetricsType >, pw::allocator::test::AllocatorForTest< 1024 >, pw::allocator::TrackingAllocator< MetricsType >, and pw::allocator::TrackingAllocator< internal::AllMetrics >.
|
inline |
Returns the total bytes that have been allocated by this allocator, or size_t(-1)
if this allocator does not track its total allocated bytes.
|
inline |
|
inline |
|
inline |
Constructs an alignment
-byte aligned array of count
objects, and wraps it in a SharedPtr
The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the SharedPtr
.
T | An array type. |
[in] | count | Number of objects to allocate. |
[in] | alignment | Object alignment. |
|
inline |
|
inline |
|
inline |
Constructs an alignment
-byte aligned array of count
objects of type T
, and wraps it in a UniquePtr
The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr
.
T | An array type. |
[in] | count | Number of objects to allocate. |
[in] | alignment | Object alignment. |
|
inline |
Deprecated version of MakeUnique
with a different name and templated on the object type instead of the array type. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Deprecated version of MakeUnique
with a different name and templated on the object type instead of the array type. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Constructs an object of type T
from the given args
The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.
[in] | args... | Arguments passed to the object constructor. |
|
inline |
Constructs an array of count
objects of type T
The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.
[in] | count | Number of objects to allocate. |
|
inline |
Constructs an alignment
-byte aligned array of count
objects of type T
The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.
[in] | count | Number of objects to allocate. |
[in] | alignment | Alignment to use for the start of the array. |
|
inline |
Deprecated version of New
with a different name and templated on the object type instead of the array type. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Deprecated version of New
with a different name and templated on the object type instead of the array type. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Modifies the size of a previously-allocated block of memory.
Returns pointer to the modified block of memory, or nullptr
if the memory could not be modified.
The data stored by the memory being modified must be trivially copyable. If it is not, callers should themselves attempt to Resize
, then Allocate
, move the data, and Deallocate
as needed.
If nullptr
is returned, the block of memory is unchanged. In particular, if the new_layout
has a size of 0, the given pointer will NOT be deallocated.
TODO(b/331290408): This error condition needs to be better communicated to module users, who may assume the pointer is freed.
Unlike Resize
, providing a null pointer will return a new allocation.
If the request can be satisfied using Resize
, the alignment
parameter may be ignored.
[in] | ptr | Pointer to previously-allocated memory. |
[in] | new_layout | Describes the memory to be allocated. |
|
inline |
Deprecated version of Reallocate
that takes a Layout
. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Deprecated version of Resize
that takes a Layout
. Do not use this method. It will be removed. TODO(b/326509341): Remove when downstream consumers migrate.
|
inline |
Modifies the size of an previously-allocated block of memory without copying any data.
Returns true if its size was changed without copying data to a new allocation; otherwise returns false.
In particular, it always returns true if the old_layout.size()
equals new_size
, and always returns false if the given pointer is null, the old_layout.size()
is 0, or the new_size
is 0.
[in] | ptr | Pointer to previously-allocated memory. |
[in] | new_size | Requested new size for the memory allocation. |