// Copyright (C) 2016 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_AsYNC_Hh_
#define DLIB_AsYNC_Hh_
// C++11 things don't work in old versions of visual studio
#if !defined( _MSC_VER) || _MSC_VER >= 1900
#include "async_abstract.h"
#include "thread_pool_extension.h"
#include <future>
#include <functional>
namespace dlib
{
// ----------------------------------------------------------------------------------------
namespace impl
{
template <typename> struct result_of;
#if (__cplusplus >= 201703L || \
(defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)) && \
__cpp_lib_is_invocable >= 201703L
template <typename F, typename... Args>
struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
#else
template <typename F, typename... Args>
struct result_of<F(Args...)>
: std::result_of<F&&(Args&&...)> {};
#endif
}
// ----------------------------------------------------------------------------------------
thread_pool& default_thread_pool();
// ----------------------------------------------------------------------------------------
template <
typename Function,
typename ...Args
>
std::future<typename impl::result_of<Function(Args...)>::type> async(
thread_pool& tp,
Function&& f,
Args&&... args
)
{
using return_type = typename impl::result_of<Function(Args...)>::type;
using task_type = std::packaged_task<return_type()>;
auto task = std::make_shared<task_type>(std::bind(std::forward<Function>(f), std::forward<Args>(args)...));
auto ret = task->get_future();
tp.add_task_by_value([task]() {(*task)();});
return ret;
}
// ----------------------------------------------------------------------------------------
template <
typename Function,
typename ...Args
>
std::future<typename impl::result_of<Function(Args...)>::type> async(
Function&& f,
Args&&... args
)
{
return async(default_thread_pool(), std::forward<Function>(f), std::forward<Args>(args)...);
}
}
// ----------------------------------------------------------------------------------------
#ifdef NO_MAKEFILE
#include "async.cpp"
#endif
#endif
#endif // DLIB_AsYNC_Hh_