18#ifdef MAYAFLUX_PLATFORM_MACOS
29template <
typename Func,
typename... Args>
32 dispatch_async(dispatch_get_main_queue(), ^{
33 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
48template <
typename Func,
typename... Args>
51 using ResultType = std::invoke_result_t<Func, Args...>;
53 if constexpr (std::is_void_v<ResultType>) {
54 dispatch_sync(dispatch_get_main_queue(), ^{
55 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
58 __block ResultType result;
59 dispatch_sync(dispatch_get_main_queue(), ^{
60 result = std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
78template <
typename Func,
typename... Args>
81 auto completed = std::make_shared<std::atomic<bool>>(
false);
83 dispatch_async(dispatch_get_main_queue(), ^{
84 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
85 completed->store(
true, std::memory_order_release);
88 auto start = std::chrono::steady_clock::now();
89 while (!completed->load(std::memory_order_acquire)) {
90 if (std::chrono::steady_clock::now() - start > timeout_ms) {
93 std::this_thread::sleep_for(std::chrono::milliseconds(1));
99#elif defined(MAYAFLUX_PLATFORM_WINDOWS)
101inline DWORD g_MainThreadId = 0;
113template <
typename Func,
typename... Args>
116 auto task = [f = std::forward<Func>(func), ... args = std::forward<Args>(args)]()
mutable {
117 std::invoke(std::move(f), std::move(args)...);
120 auto* task_ptr =
new std::function<void()>(std::move(task));
122 PostThreadMessage(g_MainThreadId, MAYAFLUX_WM_DISPATCH, 0, (LPARAM)task_ptr);
125template <
typename Func,
typename... Args>
128 return std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
133template <
typename Func,
typename... Args>
136 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
139template <
typename Func,
typename... Args>
142 return std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
145template <
typename Func,
typename... Args>
148 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);