360 lines
12 KiB
C++
360 lines
12 KiB
C++
//
|
|
// any_io_executor.hpp
|
|
// ~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2003-2023 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)
|
|
//
|
|
|
|
#ifndef ASIO_ANY_IO_EXECUTOR_HPP
|
|
#define ASIO_ANY_IO_EXECUTOR_HPP
|
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
# pragma once
|
|
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
|
|
#include "asio/detail/config.hpp"
|
|
#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
# include "asio/executor.hpp"
|
|
#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
# include "asio/execution.hpp"
|
|
# include "asio/execution_context.hpp"
|
|
#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
|
|
#include "asio/detail/push_options.hpp"
|
|
|
|
namespace asio {
|
|
|
|
#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
|
|
typedef executor any_io_executor;
|
|
|
|
#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
|
|
/// Polymorphic executor type for use with I/O objects.
|
|
/**
|
|
* The @c any_io_executor type is a polymorphic executor that supports the set
|
|
* of properties required by I/O objects. It is defined as the
|
|
* execution::any_executor class template parameterised as follows:
|
|
* @code execution::any_executor<
|
|
* execution::context_as_t<execution_context&>,
|
|
* execution::blocking_t::never_t,
|
|
* execution::prefer_only<execution::blocking_t::possibly_t>,
|
|
* execution::prefer_only<execution::outstanding_work_t::tracked_t>,
|
|
* execution::prefer_only<execution::outstanding_work_t::untracked_t>,
|
|
* execution::prefer_only<execution::relationship_t::fork_t>,
|
|
* execution::prefer_only<execution::relationship_t::continuation_t>
|
|
* > @endcode
|
|
*/
|
|
class any_io_executor :
|
|
#if defined(GENERATING_DOCUMENTATION)
|
|
public execution::any_executor<...>
|
|
#else // defined(GENERATING_DOCUMENTATION)
|
|
public execution::any_executor<
|
|
execution::context_as_t<execution_context&>,
|
|
execution::blocking_t::never_t,
|
|
execution::prefer_only<execution::blocking_t::possibly_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::tracked_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::untracked_t>,
|
|
execution::prefer_only<execution::relationship_t::fork_t>,
|
|
execution::prefer_only<execution::relationship_t::continuation_t>
|
|
>
|
|
#endif // defined(GENERATING_DOCUMENTATION)
|
|
{
|
|
public:
|
|
#if !defined(GENERATING_DOCUMENTATION)
|
|
typedef execution::any_executor<
|
|
execution::context_as_t<execution_context&>,
|
|
execution::blocking_t::never_t,
|
|
execution::prefer_only<execution::blocking_t::possibly_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::tracked_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::untracked_t>,
|
|
execution::prefer_only<execution::relationship_t::fork_t>,
|
|
execution::prefer_only<execution::relationship_t::continuation_t>
|
|
> base_type;
|
|
|
|
typedef void supportable_properties_type(
|
|
execution::context_as_t<execution_context&>,
|
|
execution::blocking_t::never_t,
|
|
execution::prefer_only<execution::blocking_t::possibly_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::tracked_t>,
|
|
execution::prefer_only<execution::outstanding_work_t::untracked_t>,
|
|
execution::prefer_only<execution::relationship_t::fork_t>,
|
|
execution::prefer_only<execution::relationship_t::continuation_t>
|
|
);
|
|
#endif // !defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Default constructor.
|
|
ASIO_DECL any_io_executor() ASIO_NOEXCEPT;
|
|
|
|
/// Construct in an empty state. Equivalent effects to default constructor.
|
|
ASIO_DECL any_io_executor(nullptr_t) ASIO_NOEXCEPT;
|
|
|
|
/// Copy constructor.
|
|
ASIO_DECL any_io_executor(const any_io_executor& e) ASIO_NOEXCEPT;
|
|
|
|
#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
/// Move constructor.
|
|
ASIO_DECL any_io_executor(any_io_executor&& e) ASIO_NOEXCEPT;
|
|
#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Construct to point to the same target as another any_executor.
|
|
#if defined(GENERATING_DOCUMENTATION)
|
|
template <class... OtherSupportableProperties>
|
|
any_io_executor(execution::any_executor<OtherSupportableProperties...> e);
|
|
#else // defined(GENERATING_DOCUMENTATION)
|
|
template <typename OtherAnyExecutor>
|
|
any_io_executor(OtherAnyExecutor e,
|
|
typename constraint<
|
|
conditional<
|
|
!is_same<OtherAnyExecutor, any_io_executor>::value
|
|
&& is_base_of<execution::detail::any_executor_base,
|
|
OtherAnyExecutor>::value,
|
|
typename execution::detail::supportable_properties<
|
|
0, supportable_properties_type>::template
|
|
is_valid_target<OtherAnyExecutor>,
|
|
false_type
|
|
>::type::value
|
|
>::type = 0)
|
|
: base_type(ASIO_MOVE_CAST(OtherAnyExecutor)(e))
|
|
{
|
|
}
|
|
#endif // defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Construct to point to the same target as another any_executor.
|
|
#if defined(GENERATING_DOCUMENTATION)
|
|
template <class... OtherSupportableProperties>
|
|
any_io_executor(std::nothrow_t,
|
|
execution::any_executor<OtherSupportableProperties...> e);
|
|
#else // defined(GENERATING_DOCUMENTATION)
|
|
template <typename OtherAnyExecutor>
|
|
any_io_executor(std::nothrow_t, OtherAnyExecutor e,
|
|
typename constraint<
|
|
conditional<
|
|
!is_same<OtherAnyExecutor, any_io_executor>::value
|
|
&& is_base_of<execution::detail::any_executor_base,
|
|
OtherAnyExecutor>::value,
|
|
typename execution::detail::supportable_properties<
|
|
0, supportable_properties_type>::template
|
|
is_valid_target<OtherAnyExecutor>,
|
|
false_type
|
|
>::type::value
|
|
>::type = 0) ASIO_NOEXCEPT
|
|
: base_type(std::nothrow, ASIO_MOVE_CAST(OtherAnyExecutor)(e))
|
|
{
|
|
}
|
|
#endif // defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Construct to point to the same target as another any_executor.
|
|
ASIO_DECL any_io_executor(std::nothrow_t,
|
|
const any_io_executor& e) ASIO_NOEXCEPT;
|
|
|
|
#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
/// Construct to point to the same target as another any_executor.
|
|
ASIO_DECL any_io_executor(std::nothrow_t,
|
|
any_io_executor&& e) ASIO_NOEXCEPT;
|
|
#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Construct a polymorphic wrapper for the specified executor.
|
|
#if defined(GENERATING_DOCUMENTATION)
|
|
template <ASIO_EXECUTION_EXECUTOR Executor>
|
|
any_io_executor(Executor e);
|
|
#else // defined(GENERATING_DOCUMENTATION)
|
|
template <ASIO_EXECUTION_EXECUTOR Executor>
|
|
any_io_executor(Executor e,
|
|
typename constraint<
|
|
conditional<
|
|
!is_same<Executor, any_io_executor>::value
|
|
&& !is_base_of<execution::detail::any_executor_base,
|
|
Executor>::value,
|
|
execution::detail::is_valid_target_executor<
|
|
Executor, supportable_properties_type>,
|
|
false_type
|
|
>::type::value
|
|
>::type = 0)
|
|
: base_type(ASIO_MOVE_CAST(Executor)(e))
|
|
{
|
|
}
|
|
#endif // defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Construct a polymorphic wrapper for the specified executor.
|
|
#if defined(GENERATING_DOCUMENTATION)
|
|
template <ASIO_EXECUTION_EXECUTOR Executor>
|
|
any_io_executor(std::nothrow_t, Executor e);
|
|
#else // defined(GENERATING_DOCUMENTATION)
|
|
template <ASIO_EXECUTION_EXECUTOR Executor>
|
|
any_io_executor(std::nothrow_t, Executor e,
|
|
typename constraint<
|
|
conditional<
|
|
!is_same<Executor, any_io_executor>::value
|
|
&& !is_base_of<execution::detail::any_executor_base,
|
|
Executor>::value,
|
|
execution::detail::is_valid_target_executor<
|
|
Executor, supportable_properties_type>,
|
|
false_type
|
|
>::type::value
|
|
>::type = 0) ASIO_NOEXCEPT
|
|
: base_type(std::nothrow, ASIO_MOVE_CAST(Executor)(e))
|
|
{
|
|
}
|
|
#endif // defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Assignment operator.
|
|
ASIO_DECL any_io_executor& operator=(
|
|
const any_io_executor& e) ASIO_NOEXCEPT;
|
|
|
|
#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
/// Move assignment operator.
|
|
ASIO_DECL any_io_executor& operator=(
|
|
any_io_executor&& e) ASIO_NOEXCEPT;
|
|
#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
|
|
|
|
/// Assignment operator that sets the polymorphic wrapper to the empty state.
|
|
ASIO_DECL any_io_executor& operator=(nullptr_t);
|
|
|
|
/// Destructor.
|
|
ASIO_DECL ~any_io_executor();
|
|
|
|
/// Swap targets with another polymorphic wrapper.
|
|
ASIO_DECL void swap(any_io_executor& other) ASIO_NOEXCEPT;
|
|
|
|
/// Obtain a polymorphic wrapper with the specified property.
|
|
/**
|
|
* Do not call this function directly. It is intended for use with the
|
|
* asio::require and asio::prefer customisation points.
|
|
*
|
|
* For example:
|
|
* @code any_io_executor ex = ...;
|
|
* auto ex2 = asio::require(ex, execution::blocking.possibly); @endcode
|
|
*/
|
|
template <typename Property>
|
|
any_io_executor require(const Property& p,
|
|
typename constraint<
|
|
traits::require_member<const base_type&, const Property&>::is_valid
|
|
>::type = 0) const
|
|
{
|
|
return static_cast<const base_type&>(*this).require(p);
|
|
}
|
|
|
|
/// Obtain a polymorphic wrapper with the specified property.
|
|
/**
|
|
* Do not call this function directly. It is intended for use with the
|
|
* asio::prefer customisation point.
|
|
*
|
|
* For example:
|
|
* @code any_io_executor ex = ...;
|
|
* auto ex2 = asio::prefer(ex, execution::blocking.possibly); @endcode
|
|
*/
|
|
template <typename Property>
|
|
any_io_executor prefer(const Property& p,
|
|
typename constraint<
|
|
traits::prefer_member<const base_type&, const Property&>::is_valid
|
|
>::type = 0) const
|
|
{
|
|
return static_cast<const base_type&>(*this).prefer(p);
|
|
}
|
|
};
|
|
|
|
#if !defined(GENERATING_DOCUMENTATION)
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::require(
|
|
const execution::blocking_t::never_t&, int) const;
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::prefer(
|
|
const execution::blocking_t::possibly_t&, int) const;
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::prefer(
|
|
const execution::outstanding_work_t::tracked_t&, int) const;
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::prefer(
|
|
const execution::outstanding_work_t::untracked_t&, int) const;
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::prefer(
|
|
const execution::relationship_t::fork_t&, int) const;
|
|
|
|
template <>
|
|
ASIO_DECL any_io_executor any_io_executor::prefer(
|
|
const execution::relationship_t::continuation_t&, int) const;
|
|
|
|
namespace traits {
|
|
|
|
#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
|
|
|
|
template <>
|
|
struct equality_comparable<any_io_executor>
|
|
{
|
|
static const bool is_valid = true;
|
|
static const bool is_noexcept = true;
|
|
};
|
|
|
|
#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
|
|
|
|
#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
|
|
|
|
template <typename F>
|
|
struct execute_member<any_io_executor, F>
|
|
{
|
|
static const bool is_valid = true;
|
|
static const bool is_noexcept = false;
|
|
typedef void result_type;
|
|
};
|
|
|
|
#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
|
|
|
|
#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
|
|
|
|
template <typename Prop>
|
|
struct query_member<any_io_executor, Prop> :
|
|
query_member<any_io_executor::base_type, Prop>
|
|
{
|
|
};
|
|
|
|
#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
|
|
|
|
#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
|
|
|
|
template <typename Prop>
|
|
struct require_member<any_io_executor, Prop> :
|
|
require_member<any_io_executor::base_type, Prop>
|
|
{
|
|
typedef any_io_executor result_type;
|
|
};
|
|
|
|
#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
|
|
|
|
#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
|
|
|
|
template <typename Prop>
|
|
struct prefer_member<any_io_executor, Prop> :
|
|
prefer_member<any_io_executor::base_type, Prop>
|
|
{
|
|
typedef any_io_executor result_type;
|
|
};
|
|
|
|
#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
|
|
|
|
} // namespace traits
|
|
|
|
#endif // !defined(GENERATING_DOCUMENTATION)
|
|
|
|
#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
|
|
} // namespace asio
|
|
|
|
#include "asio/detail/pop_options.hpp"
|
|
|
|
#if defined(ASIO_HEADER_ONLY) \
|
|
&& !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
# include "asio/impl/any_io_executor.ipp"
|
|
#endif // defined(ASIO_HEADER_ONLY)
|
|
// && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
|
|
|
|
#endif // ASIO_ANY_IO_EXECUTOR_HPP
|