diff options
Diffstat (limited to '3rdparty/asio/include/asio/executor.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/executor.hpp | 110 |
1 files changed, 66 insertions, 44 deletions
diff --git a/3rdparty/asio/include/asio/executor.hpp b/3rdparty/asio/include/asio/executor.hpp index f22b99191f6..c056525460a 100644 --- a/3rdparty/asio/include/asio/executor.hpp +++ b/3rdparty/asio/include/asio/executor.hpp @@ -2,7 +2,7 @@ // executor.hpp // ~~~~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // 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) @@ -16,8 +16,13 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" + +#if !defined(ASIO_NO_TS_EXECUTORS) + +#include <new> #include <typeinfo> #include "asio/detail/cstddef.hpp" +#include "asio/detail/executor_function.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/execution_context.hpp" @@ -32,11 +37,11 @@ class bad_executor { public: /// Constructor. - ASIO_DECL bad_executor() ASIO_NOEXCEPT; + ASIO_DECL bad_executor() noexcept; /// Obtain message associated with exception. ASIO_DECL virtual const char* what() const - ASIO_NOEXCEPT_OR_NOTHROW; + noexcept; }; /// Polymorphic wrapper for executors. @@ -44,36 +49,53 @@ class executor { public: /// Default constructor. - executor() ASIO_NOEXCEPT + executor() noexcept : impl_(0) { } /// Construct from nullptr. - executor(nullptr_t) ASIO_NOEXCEPT + executor(nullptr_t) noexcept : impl_(0) { } /// Copy constructor. - executor(const executor& other) ASIO_NOEXCEPT + executor(const executor& other) noexcept : impl_(other.clone()) { } -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. - executor(executor&& other) ASIO_NOEXCEPT + executor(executor&& other) noexcept : impl_(other.impl_) { other.impl_ = 0; } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Construct a polymorphic wrapper for the specified executor. template <typename Executor> executor(Executor e); + /// Construct a polymorphic executor that points to the same target as + /// another polymorphic executor. + executor(std::nothrow_t, const executor& other) noexcept + : impl_(other.clone()) + { + } + + /// Construct a polymorphic executor that moves the target from another + /// polymorphic executor. + executor(std::nothrow_t, executor&& other) noexcept + : impl_(other.impl_) + { + other.impl_ = 0; + } + + /// Construct a polymorphic wrapper for the specified executor. + template <typename Executor> + executor(std::nothrow_t, Executor e) noexcept; + /// Allocator-aware constructor to create a polymorphic wrapper for the /// specified executor. template <typename Executor, typename Allocator> @@ -86,26 +108,24 @@ public: } /// Assignment operator. - executor& operator=(const executor& other) ASIO_NOEXCEPT + executor& operator=(const executor& other) noexcept { destroy(); impl_ = other.clone(); return *this; } -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) // Move assignment operator. - executor& operator=(executor&& other) ASIO_NOEXCEPT + executor& operator=(executor&& other) noexcept { destroy(); impl_ = other.impl_; other.impl_ = 0; return *this; } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Assignment operator for nullptr_t. - executor& operator=(nullptr_t) ASIO_NOEXCEPT + executor& operator=(nullptr_t) noexcept { destroy(); impl_ = 0; @@ -115,9 +135,9 @@ public: /// Assignment operator to create a polymorphic wrapper for the specified /// executor. template <typename Executor> - executor& operator=(ASIO_MOVE_ARG(Executor) e) ASIO_NOEXCEPT + executor& operator=(Executor&& e) noexcept { - executor tmp(ASIO_MOVE_CAST(Executor)(e)); + executor tmp(static_cast<Executor&&>(e)); destroy(); impl_ = tmp.impl_; tmp.impl_ = 0; @@ -125,19 +145,19 @@ public: } /// Obtain the underlying execution context. - execution_context& context() const ASIO_NOEXCEPT + execution_context& context() const noexcept { return get_impl()->context(); } /// Inform the executor that it has some outstanding work to do. - void on_work_started() const ASIO_NOEXCEPT + void on_work_started() const noexcept { get_impl()->on_work_started(); } /// Inform the executor that some work is no longer outstanding. - void on_work_finished() const ASIO_NOEXCEPT + void on_work_finished() const noexcept { get_impl()->on_work_finished(); } @@ -156,7 +176,7 @@ public: * internal storage needed for function invocation. */ template <typename Function, typename Allocator> - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; + void dispatch(Function&& f, const Allocator& a) const; /// Request the executor to invoke the given function object. /** @@ -172,7 +192,7 @@ public: * internal storage needed for function invocation. */ template <typename Function, typename Allocator> - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; + void post(Function&& f, const Allocator& a) const; /// Request the executor to invoke the given function object. /** @@ -188,14 +208,14 @@ public: * internal storage needed for function invocation. */ template <typename Function, typename Allocator> - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; + void defer(Function&& f, const Allocator& a) const; struct unspecified_bool_type_t {}; typedef void (*unspecified_bool_type)(unspecified_bool_type_t); static void unspecified_bool_true(unspecified_bool_type_t) {} /// Operator to test if the executor contains a valid target. - operator unspecified_bool_type() const ASIO_NOEXCEPT + operator unspecified_bool_type() const noexcept { return impl_ ? &executor::unspecified_bool_true : 0; } @@ -206,12 +226,12 @@ public: * otherwise, <tt>typeid(void)</tt>. */ #if !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) - const std::type_info& target_type() const ASIO_NOEXCEPT + const std::type_info& target_type() const noexcept { return impl_ ? impl_->target_type() : typeid(void); } #else // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) - const void* target_type() const ASIO_NOEXCEPT + const void* target_type() const noexcept { return impl_ ? impl_->target_type() : 0; } @@ -223,7 +243,7 @@ public: * executor target; otherwise, a null pointer. */ template <typename Executor> - Executor* target() ASIO_NOEXCEPT; + Executor* target() noexcept; /// Obtain a pointer to the target executor object. /** @@ -231,11 +251,11 @@ public: * executor target; otherwise, a null pointer. */ template <typename Executor> - const Executor* target() const ASIO_NOEXCEPT; + const Executor* target() const noexcept; /// Compare two executors for equality. friend bool operator==(const executor& a, - const executor& b) ASIO_NOEXCEPT + const executor& b) noexcept { if (a.impl_ == b.impl_) return true; @@ -246,14 +266,14 @@ public: /// Compare two executors for inequality. friend bool operator!=(const executor& a, - const executor& b) ASIO_NOEXCEPT + const executor& b) noexcept { return !(a == b); } private: #if !defined(GENERATING_DOCUMENTATION) - class function; + typedef detail::executor_function function; template <typename, typename> class impl; #if !defined(ASIO_NO_TYPEID) @@ -277,18 +297,18 @@ private: class impl_base { public: - virtual impl_base* clone() const ASIO_NOEXCEPT = 0; - virtual void destroy() ASIO_NOEXCEPT = 0; - virtual execution_context& context() ASIO_NOEXCEPT = 0; - virtual void on_work_started() ASIO_NOEXCEPT = 0; - virtual void on_work_finished() ASIO_NOEXCEPT = 0; - virtual void dispatch(ASIO_MOVE_ARG(function)) = 0; - virtual void post(ASIO_MOVE_ARG(function)) = 0; - virtual void defer(ASIO_MOVE_ARG(function)) = 0; - virtual type_id_result_type target_type() const ASIO_NOEXCEPT = 0; - virtual void* target() ASIO_NOEXCEPT = 0; - virtual const void* target() const ASIO_NOEXCEPT = 0; - virtual bool equals(const impl_base* e) const ASIO_NOEXCEPT = 0; + virtual impl_base* clone() const noexcept = 0; + virtual void destroy() noexcept = 0; + virtual execution_context& context() noexcept = 0; + virtual void on_work_started() noexcept = 0; + virtual void on_work_finished() noexcept = 0; + virtual void dispatch(function&&) = 0; + virtual void post(function&&) = 0; + virtual void defer(function&&) = 0; + virtual type_id_result_type target_type() const noexcept = 0; + virtual void* target() noexcept = 0; + virtual const void* target() const noexcept = 0; + virtual bool equals(const impl_base* e) const noexcept = 0; protected: impl_base(bool fast_dispatch) : fast_dispatch_(fast_dispatch) {} @@ -311,13 +331,13 @@ private: } // Helper function to clone another implementation. - impl_base* clone() const ASIO_NOEXCEPT + impl_base* clone() const noexcept { return impl_ ? impl_->clone() : 0; } // Helper function to destroy an implementation. - void destroy() ASIO_NOEXCEPT + void destroy() noexcept { if (impl_) impl_->destroy(); @@ -338,4 +358,6 @@ ASIO_USES_ALLOCATOR(asio::executor) # include "asio/impl/executor.ipp" #endif // defined(ASIO_HEADER_ONLY) +#endif // !defined(ASIO_NO_TS_EXECUTORS) + #endif // ASIO_EXECUTOR_HPP |