#include <alpaqa/include/alpaqa/util/type-erasure.hpp>
Class for polymorphism through type erasure.
Saves the entire vtable, and uses small buffer optimization.
Definition at line 197 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 200 of file type-erasure.hpp.
|
private |
Definition at line 203 of file type-erasure.hpp.
|
private |
Definition at line 204 of file type-erasure.hpp.
|
defaultnoexcept |
Default constructor.
|
inline |
Default constructor (allocator aware).
Definition at line 228 of file type-erasure.hpp.
|
inline |
Copy constructor.
Definition at line 230 of file type-erasure.hpp.
|
inline |
Copy constructor (allocator aware).
Definition at line 236 of file type-erasure.hpp.
|
inlinenoexcept |
Move constructor.
Definition at line 252 of file type-erasure.hpp.
|
inlinenoexcept |
Move constructor (allocator aware).
Definition at line 270 of file type-erasure.hpp.
|
inline |
Destructor.
Definition at line 351 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the given argument.
Definition at line 355 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the object constructed from the given argument.
Definition at line 362 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 372 of file type-erasure.hpp.
|
inlineexplicit |
Main constructor that type-erases the object constructed from the given argument.
Definition at line 378 of file type-erasure.hpp.
|
inline |
Copy assignment.
Definition at line 241 of file type-erasure.hpp.
|
inlinenoexcept |
Move assignment.
Definition at line 303 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 386 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 396 of file type-erasure.hpp.
|
inlineexplicitnoexcept |
Check if this wrapper wraps an object.
False for default-constructed objects.
Definition at line 403 of file type-erasure.hpp.
|
inlinenoexcept |
Get a copy of the allocator.
Definition at line 406 of file type-erasure.hpp.
|
inlinenoexcept |
Query the contained type.
Definition at line 409 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 416 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 423 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 430 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 453 of file type-erasure.hpp.
|
inlineprivate |
Deallocate the memory without invoking the destructor.
Definition at line 463 of file type-erasure.hpp.
|
inlineprivate |
Destroy the type-erased object (if not empty), and deallocate the memory if necessary.
Definition at line 473 of file type-erasure.hpp.
|
inlineprivate |
|
inlineprotected |
Ensure storage and construct the type-erased object of type T in-place.
Definition at line 501 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 517 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 529 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 541 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 548 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 555 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 563 of file type-erasure.hpp.
|
staticconstexpr |
Definition at line 199 of file type-erasure.hpp.
|
private |
Definition at line 205 of file type-erasure.hpp.
|
private |
Definition at line 206 of file type-erasure.hpp.
|
staticconstexprprivate |
True if T
is not a child class of TypeErased.
Definition at line 211 of file type-erasure.hpp.
|
staticconstexprprotected |
Definition at line 215 of file type-erasure.hpp.
|
protected |
Pointer to the stored object.
Definition at line 218 of file type-erasure.hpp.
|
protected |
Size required to store the object.
Definition at line 220 of file type-erasure.hpp.
|
protected |
Definition at line 221 of file type-erasure.hpp.