43 template <
typename ReturnType,
typename... ArgTypes >
46 ReturnType ( *
invoke )(
void*, ArgTypes... );
50 template <
typename T,
typename ReturnType,
typename... ArgTypes >
53 [[no_unique_address]] T item_;
57 : item_( std::move( item ) )
69 return std::construct_at(
74 static ReturnType
invoke(
void*
const source, ArgTypes...
args )
77 return std::invoke( ptr->item_, std::forward< ArgTypes >(
args )... );
86 std::destroy_at( ptr );
93 return std::construct_at(
96 return std::construct_at(
108 template <
typename CallableType, std::
size_t Capacity, std::
size_t Align >
111 template <
typename ReturnType,
typename... ArgTypes, std::size_t Capacity, std::size_t Align >
137 *
this = std::move( other );
140 template <
typename Callable >
144 std::invocable< Callable, ArgTypes... >,
145 "Provided callable has to be invocable with arguments" );
148 convertible_to< std::invoke_result_t< Callable, ArgTypes... >, ReturnType >,
149 "Provided callable has to return the same type as static_function" );
150 *
this = std::move( c );
155 if (
this == &other )
161 obj_ = other.vtable_->handle(
163 vtable_ = other.vtable_;
171 if (
this == &other )
177 obj_ = other.vtable_->handle(
179 vtable_ = other.vtable_;
191 template <
typename Callable >
195 std::invocable< Callable, ArgTypes... >,
196 "Provided callable has to be invocable with arguments" );
203 static constexpr std::size_t requires_space =
204 required_space(
sizeof( storage ),
alignof( storage ) );
207 requires_space <= Capacity,
"Callable would not fit into the static_function" );
210 obj_ = storage::construct_at( &storage_, std::move( c ) );
211 vtable_ = &storage::vtable;
216 explicit( false )
operator bool()
const noexcept
218 return obj_ !=
nullptr;
223 return vtable_->invoke( obj_, std::forward< ArgTypes >(
args )... );
228 return vtable_->invoke( obj_, std::forward< ArgTypes >(
args )... );
237 static constexpr std::size_t required_space( std::size_t size, std::size_t
const align )
240 size +=
align - Align;
246 if ( obj_ !=
nullptr ) {
249 vtable
const* vtbl = vtable_;
256 vtable
const* vtable_ =
nullptr;
257 void* obj_ =
nullptr;
258 alignas( Align ) storage_type storage_;
261 template <
typename Signature, std::
size_t Capacity >
Definition: static_function.h:52
static void * construct_at(void *ptr, T item)
Definition: static_function.h:66
static_function_storage(T const &item)
Definition: static_function.h:61
static constexpr static_function_vtable< ReturnType, ArgTypes... > vtable
Definition: static_function.h:102
static void * handle(void *const source, void *target, static_function_operations const op)
Definition: static_function.h:81
static_function_storage(T &&item)
Definition: static_function.h:56
static ReturnType invoke(void *const source, ArgTypes... args)
Definition: static_function.h:74
static_function_base(std::nullptr_t const)
Definition: static_function.h:125
static_function_base & operator=(Callable c)
Definition: static_function.h:192
static_function_base(static_function_base &&other) noexcept
Definition: static_function.h:135
ReturnType operator()(ArgTypes... args) const
Definition: static_function.h:226
static_function_base & operator=(static_function_base const &other)
Definition: static_function.h:153
static_function_base(static_function_base const &other)
Definition: static_function.h:130
static_function_base()=default
ReturnType operator()(ArgTypes... args)
Definition: static_function.h:221
static_function_base & operator=(std::nullptr_t const)
Definition: static_function.h:185
std::byte[Capacity] storage_type
Definition: static_function.h:120
static_function_base & operator=(static_function_base &&other) noexcept
Definition: static_function.h:169
~static_function_base()
Definition: static_function.h:231
ReturnType result_type
Definition: static_function.h:121
static_function_operations
Definition: static_function.h:37
void * align(void *const ptr, std::size_t const alignment)
TODO: this needs tests.
Definition: util.h:41
MIT License.
Definition: impl.h:31
Args const & args
Definition: min_max.h:83
physical_quantity< 0, 0, 0, 0, 0, 0, 0, 0, 1 > byte
Definition: physical_quantity.h:118
Definition: static_function.h:109
Definition: static_function.h:45
ReturnType(* invoke)(void *, ArgTypes...)
Definition: static_function.h:46