#include <alpaqa/util/type-erasure.hpp>
Class for polymorphism through type erasure.
Saves the entire vtable, and uses small buffer optimization.
Definition at line 194 of file type-erasure.hpp.
Classes | |
struct | Deallocator |
Deallocates the storage when destroyed. More... | |
Public Types | |
using | allocator_type = Allocator |
Public Member Functions | |
TypeErased () noexcept(noexcept(allocator_type()))=default | |
Default constructor. | |
template<class Alloc > | |
TypeErased (std::allocator_arg_t, const Alloc &alloc) | |
Default constructor (allocator aware). | |
TypeErased (const TypeErased &other) | |
Copy constructor. | |
TypeErased (const TypeErased &other, allocator_type alloc) | |
Copy constructor (allocator aware). | |
TypeErased & | operator= (const TypeErased &other) |
Copy assignment. | |
TypeErased (TypeErased &&other) noexcept | |
Move constructor. | |
TypeErased (TypeErased &&other, const allocator_type &alloc) noexcept | |
Move constructor (allocator aware). | |
TypeErased & | operator= (TypeErased &&other) noexcept |
Move assignment. | |
~TypeErased () | |
Destructor. | |
template<class T , class Alloc > | |
TypeErased (std::allocator_arg_t, const Alloc &alloc, T &&d) | |
Main constructor that type-erases the given argument. | |
template<class T , class Alloc , class... Args> | |
TypeErased (std::allocator_arg_t, const Alloc &alloc, te_in_place_t< T >, Args &&...args) | |
Main constructor that type-erases the object constructed from the given argument. | |
template<class T > requires no_child_of_ours<T> | |
TypeErased (T &&d) | |
Main constructor that type-erases the given argument. | |
template<class T , class... Args> | |
TypeErased (te_in_place_t< T >, Args &&...args) | |
Main constructor that type-erases the object constructed from the given argument. | |
operator bool () const noexcept | |
Check if this wrapper wraps an object. | |
allocator_type | get_allocator () const noexcept |
Get a copy of the allocator. | |
const std::type_info & | type () const noexcept |
Query the contained type. | |
template<class T > | |
T & | as () & |
Convert the type-erased object to the given type. | |
template<class T > | |
const T & | as () const & |
Convert the type-erased object to the given type. | |
template<class T > | |
const T && | as () && |
Convert the type-erased object to the given type. | |
Static Public Member Functions | |
template<class Ret , class T , class Alloc , class... Args> requires std::is_base_of_v<TypeErased, Ret> | |
static Ret | make (std::allocator_arg_t tag, const Alloc &alloc, Args &&...args) |
Construct a type-erased wrapper of type Ret for an object of type T, initialized in-place with the given arguments. | |
template<class Ret , class T , class... Args> requires no_leading_allocator<Args...> | |
static Ret | make (Args &&...args) |
Construct a type-erased wrapper of type Ret for an object of type T, initialized in-place with the given arguments. | |
Static Public Attributes | |
static constexpr size_t | small_buffer_size = SmallBufferSize |
Protected Member Functions | |
template<class T , class... Args> | |
void | construct_inplace (Args &&...args) |
Ensure storage and construct the type-erased object of type T in-place. | |
template<class Ret , class... FArgs, class... Args> | |
decltype(auto) | call (Ret(*f)(const void *, FArgs...), Args &&...args) const |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
template<class Ret , class... FArgs, class... Args> | |
decltype(auto) | call (Ret(*f)(void *, FArgs...), Args &&...args) |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
template<class Ret > | |
decltype(auto) | call (Ret(*f)(const void *)) const |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
template<class Ret > | |
decltype(auto) | call (Ret(*f)(void *)) |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
template<class Ret > | |
decltype(auto) | call (Ret(*f)(const void *, const VTable &)) const |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
template<class Ret > | |
decltype(auto) | call (Ret(*f)(void *, const VTable &)) |
Call the vtable function f with the given arguments args , implicitly passing the self pointer and vtable reference if necessary. | |
Protected Attributes | |
void * | self = nullptr |
Pointer to the stored object. | |
size_t | size = invalid_size |
Size required to store the object. | |
VTable | vtable |
Static Protected Attributes | |
static constexpr size_t | invalid_size |
Private Types | |
using | allocator_traits = std::allocator_traits< allocator_type > |
using | buffer_type = std::array< std::byte, small_buffer_size > |
Private Member Functions | |
Deallocator | allocate (size_t size) |
Ensure that storage is available, either by using the small buffer if it is large enough, or by calling the allocator. | |
void | deallocate () |
Deallocate the memory without invoking the destructor. | |
void | cleanup () |
Destroy the type-erased object (if not empty), and deallocate the memory if necessary. | |
template<bool CopyAllocator> | |
void | do_copy_assign (const TypeErased &other) |
Private Attributes | |
buffer_type | small_buffer |
allocator_type | allocator |
Static Private Attributes | |
template<class T > | |
static constexpr auto | no_child_of_ours |
True if T is not a child class of TypeErased. | |
using allocator_type = Allocator |
Definition at line 197 of file type-erasure.hpp.
|
private |
Definition at line 200 of file type-erasure.hpp.
|
private |
Definition at line 201 of file type-erasure.hpp.
|
defaultnoexcept |
Default constructor.
|
inline |
Default constructor (allocator aware).
Definition at line 225 of file type-erasure.hpp.
|
inline |
Copy constructor.
Definition at line 227 of file type-erasure.hpp.
|
inline |
Copy constructor (allocator aware).
Definition at line 233 of file type-erasure.hpp.
|
inlinenoexcept |
Move constructor.
Definition at line 249 of file type-erasure.hpp.
|
inlinenoexcept |
Move constructor (allocator aware).
Definition at line 267 of file type-erasure.hpp.
|
inline |
Destructor.
Definition at line 348 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the given argument.
Definition at line 352 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the object constructed from the given argument.
Definition at line 359 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the given argument.
Requirement prevents this constructor from taking precedence over the copy and move constructors.
Definition at line 369 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the object constructed from the given argument.
Definition at line 375 of file type-erasure.hpp.
|
inline |
Copy assignment.
Definition at line 238 of file type-erasure.hpp.
|
inlinenoexcept |
Move assignment.
Definition at line 300 of file type-erasure.hpp.
|
inlinestatic |
Construct a type-erased wrapper of type Ret for an object of type T, initialized in-place with the given arguments.
Definition at line 383 of file type-erasure.hpp.
|
inlinestatic |
Construct a type-erased wrapper of type Ret for an object of type T, initialized in-place with the given arguments.
Definition at line 393 of file type-erasure.hpp.
|
inlineexplicitnoexcept |
Check if this wrapper wraps an object.
False for default-constructed objects.
Definition at line 400 of file type-erasure.hpp.
|
inlinenoexcept |
Get a copy of the allocator.
Definition at line 403 of file type-erasure.hpp.
|
inlinenoexcept |
Query the contained type.
Definition at line 406 of file type-erasure.hpp.
|
inline |
Convert the type-erased object to the given type.
The type is checked in debug builds only, use with caution.
Definition at line 413 of file type-erasure.hpp.
|
inline |
Convert the type-erased object to the given type.
The type is checked in debug builds only, use with caution.
Definition at line 420 of file type-erasure.hpp.
|
inline |
Convert the type-erased object to the given type.
The type is checked in debug builds only, use with caution.
Definition at line 427 of file type-erasure.hpp.
|
inlineprivate |
Ensure that storage is available, either by using the small buffer if it is large enough, or by calling the allocator.
Returns a RAII wrapper that deallocates the storage unless released.
Definition at line 450 of file type-erasure.hpp.
|
inlineprivate |
Deallocate the memory without invoking the destructor.
Definition at line 460 of file type-erasure.hpp.
|
inlineprivate |
Destroy the type-erased object (if not empty), and deallocate the memory if necessary.
Definition at line 470 of file type-erasure.hpp.
|
inlineprivate |
|
inlineprotected |
Ensure storage and construct the type-erased object of type T in-place.
Definition at line 498 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 514 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 526 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 538 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 545 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 552 of file type-erasure.hpp.
|
inlineprotected |
Call the vtable function f
with the given arguments args
, implicitly passing the self pointer and vtable reference if necessary.
Definition at line 560 of file type-erasure.hpp.
|
staticconstexpr |
Definition at line 196 of file type-erasure.hpp.
|
private |
Definition at line 202 of file type-erasure.hpp.
|
private |
Definition at line 203 of file type-erasure.hpp.
|
staticconstexprprivate |
True if T
is not a child class of TypeErased.
Definition at line 208 of file type-erasure.hpp.
|
staticconstexprprotected |
Definition at line 212 of file type-erasure.hpp.
|
protected |
Pointer to the stored object.
Definition at line 215 of file type-erasure.hpp.
|
protected |
Size required to store the object.
Definition at line 217 of file type-erasure.hpp.
|
protected |
Definition at line 218 of file type-erasure.hpp.