diff options
Diffstat (limited to 'boost/thread/executors/executor_adaptor.hpp')
-rw-r--r-- | boost/thread/executors/executor_adaptor.hpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/boost/thread/executors/executor_adaptor.hpp b/boost/thread/executors/executor_adaptor.hpp new file mode 100644 index 0000000000..ebe4e3476c --- /dev/null +++ b/boost/thread/executors/executor_adaptor.hpp @@ -0,0 +1,137 @@ +// Copyright (C) 2013,2014 Vicente J. Botet Escriba +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// 2013/09 Vicente J. Botet Escriba +// Adapt to boost from CCIA C++11 implementation + +#ifndef BOOST_THREAD_EXECUTORS_EXECUTOR_ADAPTOR_HPP +#define BOOST_THREAD_EXECUTORS_EXECUTOR_ADAPTOR_HPP + +#include <boost/thread/detail/config.hpp> + +#include <boost/thread/executors/executor.hpp> + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +namespace executors +{ + /** + * Polymorphic adaptor of a model of Executor to an executor. + */ + template <typename Executor> + class executor_adaptor : public executor + { + Executor ex; + public: + /// type-erasure to store the works to do + typedef executor::work work; + + /// executor is not copyable. + BOOST_THREAD_NO_COPYABLE(executor_adaptor) + + /** + * executor_adaptor constructor + */ +#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + template <typename ...Args> + executor_adaptor(BOOST_THREAD_RV_REF(Args) ... args) : ex(boost::forward<Args>(args)...) {} +#else + /** + * executor_adaptor constructor + */ + executor_adaptor() : ex() {} + + template <typename A1> + executor_adaptor( + BOOST_THREAD_FWD_REF(A1) a1 + ) : + ex( + boost::forward<A1>(a1) + ) {} + template <typename A1, typename A2> + executor_adaptor( + BOOST_THREAD_FWD_REF(A1) a1, + BOOST_THREAD_FWD_REF(A2) a2 + ) : + ex( + boost::forward<A1>(a1), + boost::forward<A2>(a2) + ) {} + template <typename A1, typename A2, typename A3> + executor_adaptor( + BOOST_THREAD_FWD_REF(A1) a1, + BOOST_THREAD_FWD_REF(A2) a2, + BOOST_THREAD_FWD_REF(A3) a3 + ) : + ex( + boost::forward<A1>(a1), + boost::forward<A2>(a2), + boost::forward<A3>(a3) + ) {} +#endif + Executor& underlying_executor() { return ex; } + + /** + * \b Effects: close the \c executor for submissions. + * The worker threads will work until there is no more closures to run. + */ + void close() { ex.close(); } + + /** + * \b Returns: whether the pool is closed for submissions. + */ + bool closed() { return ex.closed(); } + + /** + * \b Effects: The specified closure will be scheduled for execution at some point in the future. + * If invoked closure throws an exception the executor will call std::terminate, as is the case with threads. + * + * \b Synchronization: completion of closure on a particular thread happens before destruction of thread's thread local variables. + * + * \b Throws: \c sync_queue_is_closed if the thread pool is closed. + * Whatever exception that can be throw while storing the closure. + */ + void submit(BOOST_THREAD_RV_REF(work) closure) { + return ex.submit(boost::move(closure)); + } +// void submit(work & closure) { +// return ex.submit(closure); +// } + +#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) + template <typename Closure> + void submit(Closure & closure) + { + submit(work(closure)); + } +#endif + void submit(void (*closure)()) + { + submit(work(closure)); + } + + template <typename Closure> + void submit(BOOST_THREAD_RV_REF(Closure) closure) + { + submit(work(boost::forward<Closure>(closure))); + } + + /** + * Effects: try to execute one task. + * Returns: whether a task has been executed. + * Throws: whatever the current task constructor throws or the task() throws. + */ + bool try_executing_one() { return ex.try_executing_one(); } + + }; +} +using executors::executor_adaptor; +} + +#include <boost/config/abi_suffix.hpp> + +#endif |