// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include #ifdef CRL_USE_WINAPI #include #include #include namespace crl::details { void async_plain(void (*callable)(void*), void *argument); } // namespace crl::details namespace crl { template < typename Callable, typename Return = decltype(std::declval()())> inline void async(Callable &&callable) { using Function = std::decay_t; if constexpr (details::is_plain_function_v) { using Plain = Return(*)(); const auto copy = static_cast(callable); details::async_plain([](void *passed) { const auto callable = reinterpret_cast(passed); (*callable)(); }, reinterpret_cast(copy)); } else { const auto copy = new Function(std::forward(callable)); details::async_plain([](void *passed) { const auto callable = static_cast(passed); const auto guard = details::finally([=] { delete callable; }); (*callable)(); }, static_cast(copy)); } } } // namespace crl #endif // CRL_USE_WINAPI