11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
18PROMEKI_NAMESPACE_BEGIN
55template <
typename Sig>
class Function;
64template <
typename R,
typename... Args>
class Function<R(Args...)> {
67 using DataType = std::function<R(Args...)>;
76 Function(std::nullptr_t)
noexcept {}
90 typename = std::enable_if_t<!std::is_same_v<std::decay_t<F>, Function> &&
91 std::is_invocable_r_v<R, F &, Args...>>>
92 Function(F &&f) : d(std::forward<F>(f)) {}
98 Function(
const DataType &f) : d(f) {}
104 Function(DataType &&f) noexcept : d(std::move(f)) {}
107 Function(
const Function &other) =
default;
110 Function(Function &&other)
noexcept =
default;
113 ~Function() =
default;
116 Function &operator=(
const Function &other) =
default;
119 Function &operator=(Function &&other)
noexcept =
default;
122 Function &operator=(std::nullptr_t)
noexcept {
133 template <
typename F,
134 typename = std::enable_if_t<!std::is_same_v<std::decay_t<F>, Function> &&
135 std::is_invocable_r_v<R, F &, Args...>>>
136 Function &operator=(F &&f) {
137 d = std::forward<F>(f);
149 R operator()(Args... args)
const {
return d(std::forward<Args>(args)...); }
155 explicit operator bool() const noexcept {
return static_cast<bool>(d); }
158 bool isNull() const noexcept {
return !d; }
161 void clear() noexcept { d =
nullptr; }
164 void swap(Function &other)
noexcept { d.swap(other.d); }
167 const DataType &toStdFunction() const noexcept {
return d; }
170 DataType &toStdFunction() noexcept {
return d; }
173 friend bool operator==(
const Function &f, std::nullptr_t)
noexcept {
return !f.d; }
176 friend bool operator==(std::nullptr_t,
const Function &f)
noexcept {
return !f.d; }
179 friend bool operator!=(
const Function &f, std::nullptr_t)
noexcept {
return static_cast<bool>(f.d); }
182 friend bool operator!=(std::nullptr_t,
const Function &f)
noexcept {
return static_cast<bool>(f.d); }