Loading src/sled/task_queue/pending_task_safety_flag.h +24 −4 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #define SLED_TASK_QUEUE_PENDING_TASK_SAFETY_FLAG_H #pragma once #include "sled/meta/type_traits.h" #include "sled/ref_counted_base.h" #include "sled/scoped_refptr.h" #include "sled/synchronization/sequence_checker.h" Loading Loading @@ -53,11 +54,30 @@ private: scoped_refptr<PendingTaskSafetyFlag> flag_; }; inline std::function<void()> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, std::function<void()> task) // inline std::function<void()> // SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, std::function<void()> task) // { // return [flag, task]() mutable { // if (flag->alive()) { std::move(task)(); } // }; // } template<typename F, typename... Args, typename = EnableIfT<!std::is_void<InvokeResultT<F, Args...>>::value>> std::function<InvokeResultT<F, Args...>(Args &&...)> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, F &&f) { return [flag, f](Args &&...args) mutable -> InvokeResultT<F, Args...> { if (flag->alive()) { return f(std::forward<Args>(args)...); } return {}; }; } template<typename F, typename... Args, typename = EnableIfT<std::is_void<InvokeResultT<F, Args...>>::value>> std::function<void(Args &&...)> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, F &&f) { return [flag, task]() mutable { if (flag->alive()) { std::move(task)(); } return [flag, f](Args &&...args) mutable -> void { if (flag->alive()) { f(std::forward<Args>(args)...); } }; } Loading Loading
src/sled/task_queue/pending_task_safety_flag.h +24 −4 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #define SLED_TASK_QUEUE_PENDING_TASK_SAFETY_FLAG_H #pragma once #include "sled/meta/type_traits.h" #include "sled/ref_counted_base.h" #include "sled/scoped_refptr.h" #include "sled/synchronization/sequence_checker.h" Loading Loading @@ -53,11 +54,30 @@ private: scoped_refptr<PendingTaskSafetyFlag> flag_; }; inline std::function<void()> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, std::function<void()> task) // inline std::function<void()> // SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, std::function<void()> task) // { // return [flag, task]() mutable { // if (flag->alive()) { std::move(task)(); } // }; // } template<typename F, typename... Args, typename = EnableIfT<!std::is_void<InvokeResultT<F, Args...>>::value>> std::function<InvokeResultT<F, Args...>(Args &&...)> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, F &&f) { return [flag, f](Args &&...args) mutable -> InvokeResultT<F, Args...> { if (flag->alive()) { return f(std::forward<Args>(args)...); } return {}; }; } template<typename F, typename... Args, typename = EnableIfT<std::is_void<InvokeResultT<F, Args...>>::value>> std::function<void(Args &&...)> SafeTask(scoped_refptr<PendingTaskSafetyFlag> flag, F &&f) { return [flag, task]() mutable { if (flag->alive()) { std::move(task)(); } return [flag, f](Args &&...args) mutable -> void { if (flag->alive()) { f(std::forward<Args>(args)...); } }; } Loading