summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/threads/async.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ml/dlib/dlib/threads/async.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/ml/dlib/dlib/threads/async.h b/ml/dlib/dlib/threads/async.h
new file mode 100644
index 000000000..bc6fe5575
--- /dev/null
+++ b/ml/dlib/dlib/threads/async.h
@@ -0,0 +1,105 @@
+// 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 T> struct selector {};
+
+ template <typename T, typename U, typename V>
+ void call_prom_set_value(
+ T& prom,
+ U& fun,
+ selector<V>
+ )
+ {
+ prom.set_value(fun());
+ }
+
+ template <typename T, typename U>
+ void call_prom_set_value(
+ T& prom,
+ U& fun,
+ selector<void>
+ )
+ {
+ fun();
+ prom.set_value();
+ }
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ thread_pool& default_thread_pool();
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename Function,
+ typename ...Args
+ >
+ std::future<typename std::result_of<Function(Args...)>::type> async(
+ thread_pool& tp,
+ Function&& f,
+ Args&&... args
+ )
+ {
+ auto prom = std::make_shared<std::promise<typename std::result_of<Function(Args...)>::type>>();
+ std::future<typename std::result_of<Function(Args...)>::type> ret = prom->get_future();
+ using bind_t = decltype(std::bind(std::forward<Function>(f), std::forward<Args>(args)...));
+ auto fun = std::make_shared<bind_t>(std::bind(std::forward<Function>(f), std::forward<Args>(args)...));
+ tp.add_task_by_value([fun, prom]()
+ {
+ try
+ {
+ impl::call_prom_set_value(*prom, *fun, impl::selector<typename std::result_of<Function(Args...)>::type>());
+ }
+ catch(...)
+ {
+ prom->set_exception(std::current_exception());
+ }
+ });
+ return std::move(ret);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename Function,
+ typename ...Args
+ >
+ std::future<typename std::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_
+
+
+