Thread System 0.3.1
High-performance C++20 thread pool with work stealing and DAG scheduling
Loading...
Searching...
No Matches
kcenon::thread::detail::callable_eraser Class Reference

Type eraser for heterogeneous callable storage. More...

#include <pool_traits.h>

Collaboration diagram for kcenon::thread::detail::callable_eraser:
Collaboration graph

Classes

struct  vtable_t
 

Public Member Functions

template<typename F , typename = std::enable_if_t<Callable<F>>>
 callable_eraser (F &&f)
 
void operator() ()
 
 ~callable_eraser ()
 
 callable_eraser (const callable_eraser &)=delete
 
callable_eraseroperator= (const callable_eraser &)=delete
 
 callable_eraser (callable_eraser &&other) noexcept
 
callable_eraseroperator= (callable_eraser &&other) noexcept
 

Private Attributes

const vtable_tvtable_
 
char storage_ [64]
 

Static Private Attributes

template<typename F >
static constexpr vtable_t vtable_for
 

Detailed Description

Type eraser for heterogeneous callable storage.

Definition at line 117 of file pool_traits.h.

Constructor & Destructor Documentation

◆ callable_eraser() [1/3]

template<typename F , typename = std::enable_if_t<Callable<F>>>
kcenon::thread::detail::callable_eraser::callable_eraser ( F && f)
inline

Definition at line 124 of file pool_traits.h.

125 : vtable_(&vtable_for<std::decay_t<F>>)
126 {
127 static_assert(sizeof(std::decay_t<F>) <= sizeof(storage_),
128 "Callable is too large for inline storage");
129 new (&storage_) std::decay_t<F>(std::forward<F>(f));
130 }
static constexpr vtable_t vtable_for

References storage_.

◆ ~callable_eraser()

kcenon::thread::detail::callable_eraser::~callable_eraser ( )
inline

◆ callable_eraser() [2/3]

kcenon::thread::detail::callable_eraser::callable_eraser ( const callable_eraser & )
delete

◆ callable_eraser() [3/3]

kcenon::thread::detail::callable_eraser::callable_eraser ( callable_eraser && other)
inlinenoexcept

Definition at line 145 of file pool_traits.h.

146 : vtable_(other.vtable_)
147 {
148 std::copy_n(other.storage_, sizeof(storage_), storage_);
149 other.vtable_ = nullptr;
150 }

References storage_.

Member Function Documentation

◆ operator()()

void kcenon::thread::detail::callable_eraser::operator() ( )
inline

◆ operator=() [1/2]

callable_eraser & kcenon::thread::detail::callable_eraser::operator= ( callable_eraser && other)
inlinenoexcept

Definition at line 152 of file pool_traits.h.

152 {
153 if (this != &other) {
154 if (vtable_) {
156 }
157 vtable_ = other.vtable_;
158 std::copy_n(other.storage_, sizeof(storage_), storage_);
159 other.vtable_ = nullptr;
160 }
161 return *this;
162 }

References kcenon::thread::detail::callable_eraser::vtable_t::destroy, storage_, and vtable_.

◆ operator=() [2/2]

callable_eraser & kcenon::thread::detail::callable_eraser::operator= ( const callable_eraser & )
delete

Member Data Documentation

◆ storage_

char kcenon::thread::detail::callable_eraser::storage_[64]
private

◆ vtable_

const vtable_t* kcenon::thread::detail::callable_eraser::vtable_
private

Definition at line 176 of file pool_traits.h.

Referenced by operator()(), operator=(), and ~callable_eraser().

◆ vtable_for

template<typename F >
vtable_t kcenon::thread::detail::callable_eraser::vtable_for
staticconstexprprivate
Initial value:
= {
[](void* ptr) { (*static_cast<F*>(ptr))(); },
[](void* ptr) { static_cast<F*>(ptr)->~F(); }
}

Definition at line 171 of file pool_traits.h.

171 {
172 [](void* ptr) { (*static_cast<F*>(ptr))(); },
173 [](void* ptr) { static_cast<F*>(ptr)->~F(); }
174 };

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