#include "LWF/Nothrow/Allocator.h" #include "LWF/Nothrow/Array/Allocator.h" #include "LWF/Placement/Allocator.h" #include "LWF/Std/Allocator.h" #include "LWF/Std/Array/Allocator.h" #include "LWF/Std/Typed/Allocator.h" #include "LWF/Custom/Allocator.h" #include "LWF/Custom/Array/Allocator.h" #include "LWF/Deleter.h" #include "LWF/Destroying/Deleter.h" #include "LWF/Placement/Deleter.h" #include "LWF/Deallocation/Deleter.h"
A life cycle of each object comprises:
| Kind | Description |
|---|---|
| Allocator | A class intended to provide the memory to accommodate an object |
| C++::new statement | The statement which initializes an object by calling a specified Object’s::constructor(…) on memory allocated by the Allocator |
| Deallocator | Frees the memory allocated by the Allocator |
| Deleter | Combines invoking of the Object’s::~destructor() and the Deallocator |

| Deallocator | |
|---|---|
| Void | deallocate(Void *memory) const |
| Dellocates a block of specified memory | |
| Allocator : Deallocator | |
| Void * | allocate(UInt size) const |
| Allocates a block of memory of specified size | |
| namespace Std:: | |
|---|---|
| Classes of this namespace operate with the memory in a way trivial C++ new and delete statements do. | |
| Deallocator | |
| Void | deallocate(Void *memory) const |
| Allocator | |
| Void * | allocate(UInt size) const |
| Void | deallocate(Void *memory) const |
| Array::Deallocator | |
| Void | deallocate(Void *memory) const |
| Array::Allocator | |
| Void * | allocate(UInt size) const |
| Void | deallocate(Void *memory) const |
| namespace Std::Typed:: | |
| The same as Std:: (extends and overloads it) but these classes automatically calculate memory size based on specified type of Object | |
| template<typename T> Allocator : Std::Allocator | |
| T * | allocate() const |
| template<typename T> Array::Allocator<T[]> : Std::Array::Allocator | |
| T * | allocate(UInt count) const |
| namespace Nothrow:: | |
| Similar to Std:: but uses std::nothrow version of C++ new and delete statements and should be rarely used. | |
| Deallocator | |
| Void | deallocate(Void *memory) const |
| Allocator | |
| Void * | allocate(UInt size) const |
| Void | deallocate(Void *memory) const |
| namespace Placement:: | |
| Just provides an Allocator/Deallocator interface for already allocated memory. Notice no array-specific implementation exists it’s the same as this one. |
|
| Deallocator | |
| Void | deallocate(Void *memory) const |
| Allocator | |
| Allocator(Void *memory) | |
| Void | allocate(UInt) const |
| :: | |
|---|---|
| Aimed to delete objects allocated with C++ new statement | |
| template<typename T> Deleter | |
| Void | Delete(T *object) const |
| template<typename T> Deleter<T[]> | |
| Void | Delete(T *objects) const |
| namespace Destroying:: | |
| Destructs an than deallocate objest(s) by specified deallocator | |
| template<typename T, typename Deallocator> Deleter : Deallocator | |
| Deleter(const Deallocator &deallocator) | |
| Void | Delete(T *object) const |
| template<typename T, typename Deallocator> Deleter<T[]> : Deallocator | |
| Deleter(const Deallocator &deallocator) | |
| Void | Delete(T *objects, UInt count) const |
| namespace Placement:: | |
| Destructs objest(s) allocated by Placement::Allocator | |
| template<typename T> Deleter : Destroying::Deleter<T, Placement::Deallocator> | |
| Deleter(const Placement::Deallocator &deallocator) | |
| namespace Deallocation:: | |
| Just represents a Deleter interface to the Deallocator object | |
| template<typename T> Deleter : Destroying::Deleter<T, Placement::Deallocator> | |
| Deleter(const Deallocator &deallocator) | |
| Void | Delete(Void *objects) const |
| Class | Implementation | |
|---|---|---|
| ::Allocator::allocate(UInt size) const | ::Deallocator::deallocate(Void *memory) const | |
| Std::Allocator/Deallocator | ::operator new(size) | ::operator delete(memory) |
| Std::Array::Allocator/Deallocator | ::operator new[](size) | ::operator delete[](memory) |
| Std::Typed::Allocator/Deallocator<T> | Std::Allocator::allocate(sizeof(T))) | Std::Deallocator::deallocate(memory) |
| Std::Typed::Allocator/Deallocator<T[]> | Std::Array::Allocator::allocate(count * sizeof(T)) | Std::Array::Deallocator::deallocate(memory) |
| Nothrow::Allocator/Deallocator | ::operator new(size, std::nothrow) | ::operator delete(memory, std::nothrow) |
| Nothrow::Array::Allocator/Deallocator | ::operator new[](size, std::nothrow) | ::operator delete[](memory, std::nothrow) |
| Placement::Allocator/Deallocator | Just returns already allocated memory passed through a constructor | Does nothing |
| Class | Delete(object) implementation | |
|---|---|---|
| Destruction | Deallocation | |
| Deleter<Type> | delete object | |
| Deleter<Type[]> | delete [] object | |
| Destroying::Deleter<Type, Deallocator> | object.~Type() | deallocator.deallocate(object) |
| Destroying::Deleter<Type[], Array::Deallocator> | object[count].~Type() | deallocator.deallocate(object) |
| Placement::Deleter |
same as Destroying::Deleter<Type> | Placemenet::Deallocator::deallocate(object) |
| Placement::Deleter<Type[]> | same as Destroying::Deleter<Type[]> | Placemenet::Deallocator::deallocate(object) |
| Deallocation::Deleter<Deallocator> | Does nothing | deallocator.deallocate(object) |
| Usecase:: | Object | ||
|---|---|---|---|
| Creation | Destroying | ||
| Standard:: | Plain |
Type *ptr = new Type; | Deleter<Type >().Delete(ptr); |
| Array |
Type *ptr = new Type[N]; | Deleter<Type[]>().Delete(ptr); | |
| Nothrow:: | Plain |
Type *ptr = new (nothrow) Type; | Deleter<Type >().Delete(ptr); |
| Array |
Type *ptr = new (nothrow) Type[N]; | Deleter<Type[]>().Delete(ptr); | |
| Placement:: | Plain |
Type *ptr = new (Placement::Allocator(memory)) Type; | Placement::Deleter |
| Array |
Type *ptr = new (Placement::Allocator(memory)) Type[N]; | Placement::Deleter<Type[]>().Delete(ptr, N); | |
| Custom:: | Plain |
typedef Std::Allocator Allocator; Allocator allocator; Type *ptr = new (allocator) Type; |
Destroying::Deleter<Type, Allocator>(allocator).Delete(ptr); |
| Array |
typedef Std::Array::Allocator Allocator; Allocator allocator; Type *ptr = new (allocator) Type[N]; |
Destroying::Deleter<Type[], Allocator>(allocator).Delete(ptr, N); | |
| Preallocated:: | Plain |
typedef Std::Typed::Allocator<Type> Allocator; Allocator allocator; Type *ptr = allocator.allocate( ); Usecase::Placement::Plain(ptr); |
Deallocation::Deleter<Allocator>(allocator).Delete(ptr); |
| Array |
typedef Std::Typed::Allocator<Type[]> Allocator; Allocator allocator; Type *ptr = allocator.allocate(N); Usecase::Placement::Array(ptr); |
Deallocation::Deleter<Allocator>(allocator).Delete(ptr); | |