40template <
typename Signature>
43namespace function::internal {
45template <
bool IsConst,
bool IsNoExcept,
typename R,
typename... Args>
49template <
bool IsConst,
typename R,
typename... Args>
53 using Invoker = R (*)(ObjPtr, Args...);
57 alignas(
void*)
char buffer[
sizeof(
void*)];
64 std::is_invocable_r_v<
66 std::conditional_t<IsConst,
67 const std::remove_reference_t<F>&,
68 std::remove_reference_t<F>&>,
72 : invoker_([](ObjPtr obj_ptr, Args... args) -> R {
73 Storage* s = static_cast<Storage*>(obj_ptr);
74 using FPtr = std::conditional_t<IsConst,
75 const std::remove_reference_t<F>*,
76 std::remove_reference_t<F>*>;
78 if constexpr (std::is_function_v<std::remove_reference_t<F>>) {
79 f_ptr = reinterpret_cast<FPtr>(s->ptr);
81 f_ptr = static_cast<FPtr>(s->ptr);
83 return (*f_ptr)(std::forward<Args>(args)...);
85 if constexpr (std::is_function_v<std::remove_reference_t<F>>) {
86 obj_.ptr =
reinterpret_cast<void*
>(&f);
88 obj_.ptr =
const_cast<void*
>(
static_cast<const void*
>(&f));
92 BasicFunctionRef(
const BasicFunctionRef&)
noexcept =
default;
93 BasicFunctionRef& operator=(
const BasicFunctionRef&)
noexcept =
default;
95 R operator()(Args... args)
const {
96 return invoker_(
const_cast<Storage*
>(&obj_), std::forward<Args>(args)...);
105template <
bool IsConst,
typename R,
typename... Args>
108 using ObjPtr =
void*;
109 using Invoker = R (*)(ObjPtr, Args...)
noexcept;
113 alignas(
void*)
char buffer[
sizeof(
void*)];
117 template <
typename F,
120 std::is_invocable_r_v<
122 std::conditional_t<IsConst,
123 const std::remove_reference_t<F>&,
124 std::remove_reference_t<F>&>,
126 std::is_nothrow_invocable_v<
127 std::conditional_t<IsConst,
128 const std::remove_reference_t<F>&,
129 std::remove_reference_t<F>&>,
133 : invoker_([](ObjPtr obj_ptr, Args... args) noexcept -> R {
134 Storage* s = static_cast<Storage*>(obj_ptr);
135 using FPtr = std::conditional_t<IsConst,
136 const std::remove_reference_t<F>*,
137 std::remove_reference_t<F>*>;
139 if constexpr (std::is_function_v<std::remove_reference_t<F>>) {
140 f_ptr = reinterpret_cast<FPtr>(s->ptr);
142 f_ptr = static_cast<FPtr>(s->ptr);
144 return (*f_ptr)(std::forward<Args>(args)...);
146 if constexpr (std::is_function_v<std::remove_reference_t<F>>) {
147 obj_.ptr =
reinterpret_cast<void*
>(&f);
149 obj_.ptr =
const_cast<void*
>(
static_cast<const void*
>(&f));
153 BasicFunctionRef(
const BasicFunctionRef&)
noexcept =
default;
154 BasicFunctionRef& operator=(
const BasicFunctionRef&)
noexcept =
default;
156 R operator()(Args... args)
const noexcept {
157 return invoker_(
const_cast<Storage*
>(&obj_), std::forward<Args>(args)...);
168template <
typename R,
typename... Args>
180template <
typename R,
typename... Args>
192template <
typename R,
typename... Args>
204template <
typename R,
typename... Args>
Definition: function_ref.h:41
Definition: function_ref.h:46
The Pigweed namespace.
Definition: alignment.h:27