1#ifndef MSTL_CORE_FUNCTIONAL_FUNCTION_HPP__
2#define MSTL_CORE_FUNCTIONAL_FUNCTION_HPP__
28template <
typename Sign>
40enum class FUNCTION_OPERATE {
54class __undefined_util;
64 const void* const_object_;
65 void (* function_pointer_)();
66 void (__undefined_util::* member_pointer_)();
76 MSTL_NODISCARD
void* access() noexcept {
return &data_[0]; }
77 MSTL_NODISCARD
const void* access() const noexcept {
return &data_[0]; }
80 MSTL_NODISCARD T& access() noexcept {
return *
static_cast<T*
>(access()); }
83 MSTL_NODISCARD
const T& access() const noexcept {
return *
static_cast<const T*
>(access()); }
85 __nocopy_type unused_;
86 byte_t data_[
sizeof(__nocopy_type)];
95class __function_base {
97 static constexpr size_t max_size_ =
sizeof(__nocopy_type);
98 static constexpr size_t max_align_ =
alignof(__nocopy_type);
107 template <
typename F>
108 class __manager_base {
110 static constexpr bool stored_ = is_location_invariant_v<F> &&
sizeof(F) <= max_size_
111 &&
alignof(F) <= max_align_ && max_align_ %
alignof(F) == 0;
114 template <
typename U,
bool = stored_>
115 struct __get_pointer_impl;
117 template <
typename U>
118 struct __get_pointer_impl<U, true> {
119 static U*
get(
const storage_data& src)
noexcept {
120 const U& f = src.access<U>();
125 template <
typename U>
126 struct __get_pointer_impl<U, false> {
127 static U*
get(
const storage_data& src)
noexcept {
128 return src.access<U*>();
135 static F* get_pointer(
const storage_data& src)
noexcept {
136 return __get_pointer_impl<F>::get(src);
140 template <
typename Fn>
144 template <typename Fn>
150 data.access<F>().~F();
153 delete data.access<F*>();
157 static bool manage(storage_data& dest,
const storage_data& src,
const FUNCTION_OPERATE oper) {
159 case FUNCTION_OPERATE::GET_TYPE_INFO:
160 dest.access<
const std::type_info*>() = &
typeid(F);
162 case FUNCTION_OPERATE::GET_PTR:
163 dest.access<F*>() = __manager_base::get_pointer(src);
165 case FUNCTION_OPERATE::COPY_PTR:
166 __manager_base::init_func(dest, *
const_cast<const F*
>(__manager_base::get_pointer(src)));
168 case FUNCTION_OPERATE::DESTROY_PTR:
169 __manager_base::destroy(dest, storage_());
175 template <
typename Fn>
176 static void init_func(storage_data& func, Fn&& f)
177 noexcept(conjunction_v<storage_, is_nothrow_constructible<F, Fn>>) {
181 template <
typename Sign>
182 static bool not_empty_function(
const _MSTL function<Sign>& f)
noexcept {
183 return static_cast<bool>(f);
185 template <
typename T>
186 static bool not_empty_function(T* fptr)
noexcept {
187 return fptr !=
nullptr;
189 template <
typename Class,
typename T>
190 static bool not_empty_function(T Class::* mptr)
noexcept {
191 return mptr !=
nullptr;
193 template <
typename T>
194 static bool not_empty_function(
const T&)
noexcept {
199 using manage_type = bool (*)(storage_data&,
const storage_data&, FUNCTION_OPERATE);
201 storage_data func_{};
202 manage_type manager_ =
nullptr;
205 __function_base() =
default;
208 manager_(func_, func_, FUNCTION_OPERATE::DESTROY_PTR);
211 MSTL_NODISCARD
bool empty()
const {
return !manager_; }
222template <
typename Sign,
typename F>
223class __function_manage_handler;
225template <
typename Res,
typename F,
typename... Args>
226class __function_manage_handler<Res(Args...), F>
227 :
public __function_base::__manager_base<F> {
229 using base_type = __function_base::__manager_base<F>;
231 static bool manage(storage_data& dest,
const storage_data& src,
232 FUNCTION_OPERATE oper) {
234 case FUNCTION_OPERATE::GET_TYPE_INFO:
235 dest.access<
const std::type_info*>() = &
typeid(F);
237 case FUNCTION_OPERATE::GET_PTR:
238 dest.access<F*>() = base_type::get_pointer(src);
241 base_type::manage(dest, src, oper);
246 static Res
invoke(
const storage_data& f, Args&&... args) {
250 template <
typename Fn>
251 static constexpr bool nothrow_init() noexcept {
252 return conjunction_v<typename base_type::storage_, is_nothrow_constructible<F, Fn>>;
257class __function_manage_handler<void, void> {
259 static bool manage(storage_data&,
const storage_data&, FUNCTION_OPERATE) {
264template <
typename Sign,
typename F,
bool Val
id = is_
object_v<F>>
265struct __function_handler_dispatch : __function_manage_handler<Sign, remove_cv_t<F>> {};
267template <
typename Sign,
typename F>
268struct __function_handler_dispatch<Sign, F, false> : __function_manage_handler<void, void> {};
280template <
typename Res,
typename... Args>
283 using invoker_type = Res (*)(
const _INNER storage_data&, Args&&...);
286 invoker_type invoker_ =
nullptr;
289 template <
typename F,
bool IsSelf = is_same_v<remove_cvref_t<F>, function>>
292 template <
typename F,
typename =
void>
295 template <
typename F>
298 is_invocable_r_v<Res, decay_t<F>&, Args...>
301 template <
typename F>
302 using handler_t =
_INNER __function_manage_handler<Res(Args...),
decay_t<F>>;
304 template <
typename F, enable_if_t<is_
object_v<F>,
int> = 0>
305 MSTL_ALWAYS_INLINE
const F* __target_impl()
const noexcept {
306 if (manager_ == &
_INNER __function_handler_dispatch<Res(Args...), F>::manage
308 _INNER storage_data ptr{};
309 manager_(ptr, func_,
_INNER FUNCTION_OPERATE::GET_PTR);
310 return ptr.access<
const F*>();
315 template <
typename F, enable_if_t<!is_
object_v<F>,
int> = 0>
316 MSTL_ALWAYS_INLINE
const F* __target_impl()
const noexcept {
328 : __function_base() {}
335 if (
static_cast<bool>(x)) {
336 x.manager_(func_, x.func_,
_INNER FUNCTION_OPERATE::COPY_PTR);
337 invoker_ = x.invoker_;
338 manager_ = x.manager_;
347 : __function_base(), invoker_(x.invoker_) {
348 if (
static_cast<bool>(x)) {
350 manager_ = x.manager_;
351 x.manager_ =
nullptr;
352 x.invoker_ =
nullptr;
361 template <typename F, enable_if_t<callable_t<F>::value,
int> = 0>
362 function(F&& f)
noexcept(handler_t<F>::template nothrow_init<F>())
363 : __function_base() {
365 is_copy_constructible_v<decay_t<F>> &&
366 is_constructible_v<decay_t<F>, F>,
367 "target of function must be constructible");
369 using handler = handler_t<F>;
370 if (handler::not_empty_function(f)) {
372 invoker_ = &handler::invoke;
373 manager_ = &handler::manage;
404 manager_(func_, func_,
_INNER FUNCTION_OPERATE::DESTROY_PTR);
417 template <typename F, enable_if_t<callable_t<F>::value,
int> = 0>
418 function& operator =(F&& f)
noexcept(handler_t<F>::template nothrow_init<F>()) {
429 template <
typename F>
449 explicit operator bool() const noexcept {
return !
empty(); }
457 Res operator ()(Args&&... args)
const
469 MSTL_NODISCARD
const std::type_info&
target_type() const noexcept {
471 _INNER storage_data result{};
472 manager_(result, func_,
_INNER FUNCTION_OPERATE::GET_TYPE_INFO);
473 if (
const auto info = result.access<
const std::type_info*>()) {
485 template <
typename F>
487 return __target_impl<F>();
495 template <
typename F>
498 return *
const_cast<F**
>(&f);
502#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
507struct __function_guide_helper;
509template <
typename Result,
typename Class,
typename... Args>
510struct __function_guide_helper<Result (Class::*)(Args...)> {
511 using type = Result(Args...);
517template <
typename Res,
typename... Args>
518function(Res(*)(Args...)) -> function<Res(Args...)>;
520template <
typename Func,
typename Sign =
typename _INNER __function_guide_helper<
522function(Func) -> function<Sign>;
535template <
typename Res,
typename... Args>
537 return !
static_cast<bool>(f);
548template <
typename Res,
typename... Args>
550 return !
static_cast<bool>(f);
561template <
typename Res,
typename... Args>
563 return static_cast<bool>(f);
574template <
typename Res,
typename... Args>
576 return static_cast<bool>(f);
function(F &&f) noexcept(handler_t< F >::template nothrow_init< F >())
从任意可调用对象构造
void swap(function &x) noexcept
交换两个function对象
MSTL_NODISCARD const std::type_info & target_type() const noexcept
获取目标类型信息
function(const function &x)
复制构造函数
function(function &&x) noexcept
移动构造函数
const F * target() const noexcept
获取目标对象的常量指针
F * target() noexcept
获取目标对象的指针
function(nullptr_t null=nullptr) noexcept
默认构造函数
MSTL_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
MSTL_ALWAYS_INLINE enable_if_t< is_void_v< T >, future_result_t< T > > get(future< T > &f)
通用future结果获取函数
unsigned char byte_t
字节类型,定义为无符号字符
decltype(nullptr) nullptr_t
空指针类型
bool operator!=(const function< Res(Args...)> &f, nullptr_t null) noexcept
不等于空指针比较
bool operator==(const function< Res(Args...)> &f, nullptr_t null) noexcept
等于空指针比较
MSTL_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
MSTL_CONSTEXPR14 _INNER __invoke_result_aux< Callable, Args... >::type invoke(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
统一调用接口
MSTL_CONSTEXPR14 enable_if_t< is_invocable_r< Res, Callable, Args... >::value, Res > invoke_r(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
带返回类型检查的统一调用接口
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
typename remove_function_qualifiers< T >::type remove_function_qualifiers_t
remove_function_qualifiers的便捷别名
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
void swap()=delete
删除无参数的swap重载
typename decay< T >::type decay_t
decay的便捷别名
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
bool_constant< true > true_type
表示true的类型
bool_constant< false > false_type
表示false的类型
integral_constant< bool, Value > bool_constant
布尔常量包装器
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名