32#ifndef FENNEC_LANG_FUNCTION_H
33#define FENNEC_LANG_FUNCTION_H
39#include <fennec/lang/detail/_function.h>
44template<
typename>
class function;
46template<
typename ReturnT,
typename...ArgsT>
47class function<ReturnT(ArgsT...)> {
49 constexpr function() noexcept = default;
50 constexpr ~function() = default;
52 constexpr function(const function&) noexcept = default;
53 constexpr function( function&&) noexcept = default;
55 constexpr function(ReturnT (*func)(ArgsT...))
59 constexpr function(nullptr_t) noexcept : function() {}
61 constexpr function& operator=(
const function&) =
default;
62 constexpr function& operator=(function&&) =
default;
64 constexpr function& operator=(nullptr_t) {
69 constexpr function& operator=(ReturnT (*func)(ArgsT...)) {
74 constexpr operator bool() const noexcept {
return call !=
nullptr; }
76 ReturnT operator()(ArgsT...args) const noexcept {
77 assertf(call !=
nullptr,
"Attempted to call a null function object!");
78 return call(fennec::forward<ArgsT>(args)...);
82 ReturnT (*call)(ArgsT&&...) {
nullptr };