#ifndef BOOST_ASIO_DISPOSITION_HPP
#define BOOST_ASIO_DISPOSITION_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
#include <boost/asio/detail/config.hpp>
#include <boost/asio/detail/throw_exception.hpp>
#include <boost/asio/detail/type_traits.hpp>
#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
#include <exception>
#include <boost/asio/detail/push_options.hpp>
namespace boost {
namespace asio {
#if defined(GENERATING_DOCUMENTATION)
template <typename T>
struct disposition_traits
{
static bool not_an_error(const T& d) noexcept;
static void throw_exception(T d);
static std::exception_ptr to_exception_ptr(T d) noexcept;
};
#else
template <typename T>
struct disposition_traits;
#endif
namespace detail {
template <typename T, typename = void, typename = void,
typename = void, typename = void, typename = void, typename = void>
struct is_disposition_impl : false_type
{
};
template <typename T>
struct is_disposition_impl<T,
enable_if_t<
is_nothrow_default_constructible<T>::value
>,
enable_if_t<
is_nothrow_move_constructible<T>::value
>,
enable_if_t<
is_nothrow_move_assignable<T>::value
>,
enable_if_t<
is_same<
decltype(disposition_traits<T>::not_an_error(declval<const T&>())),
bool
>::value
>,
void_t<
decltype(disposition_traits<T>::throw_exception(declval<T>()))
>,
enable_if_t<
is_same<
decltype(disposition_traits<T>::to_exception_ptr(declval<T>())),
std::exception_ptr
>::value
>> : true_type
{
};
}
template <typename T>
struct is_disposition :
#if defined(GENERATING_DOCUMENTATION)
integral_constant<bool, automatically_determined>
#else
detail::is_disposition_impl<T>
#endif {
};
#if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
template <typename T>
constexpr const bool is_disposition_v = is_disposition<T>::value;
#endif
#if defined(BOOST_ASIO_HAS_CONCEPTS)
template <typename T>
BOOST_ASIO_CONCEPT disposition = is_disposition<T>::value;
#define BOOST_ASIO_DISPOSITION ::boost::asio::disposition
#else
#define BOOST_ASIO_DISPOSITION typename
#endif
template <>
struct disposition_traits<boost::system::error_code>
{
static bool not_an_error(const boost::system::error_code& ec) noexcept
{
return !ec;
}
static void throw_exception(const boost::system::error_code& ec)
{
detail::throw_exception(boost::system::system_error(ec));
}
static std::exception_ptr to_exception_ptr(
const boost::system::error_code& ec) noexcept
{
return ec
? std::make_exception_ptr(boost::system::system_error(ec))
: nullptr;
}
};
template <>
struct disposition_traits<std::exception_ptr>
{
static bool not_an_error(const std::exception_ptr& e) noexcept
{
return !e;
}
static void throw_exception(std::exception_ptr e)
{
std::rethrow_exception(static_cast<std::exception_ptr&&>(e));
}
static std::exception_ptr to_exception_ptr(std::exception_ptr e) noexcept
{
return e;
}
};
struct no_error_t
{
constexpr no_error_t()
{
}
friend constexpr bool operator==(
const no_error_t&, const no_error_t&) noexcept
{
return true;
}
friend constexpr bool operator!=(
const no_error_t&, const no_error_t&) noexcept
{
return false;
}
template <BOOST_ASIO_DISPOSITION Disposition>
friend constexpr constraint_t<is_disposition<Disposition>::value, bool>
operator==(const no_error_t&, const Disposition& d) noexcept
{
return disposition_traits<Disposition>::not_an_error(d);
}
template <BOOST_ASIO_DISPOSITION Disposition>
friend constexpr constraint_t<is_disposition<Disposition>::value, bool>
operator==(const Disposition& d, const no_error_t&) noexcept
{
return disposition_traits<Disposition>::not_an_error(d);
}
template <BOOST_ASIO_DISPOSITION Disposition>
friend constexpr constraint_t<is_disposition<Disposition>::value, bool>
operator!=(const no_error_t&, const Disposition& d) noexcept
{
return !disposition_traits<Disposition>::not_an_error(d);
}
template <BOOST_ASIO_DISPOSITION Disposition>
friend constexpr constraint_t<is_disposition<Disposition>::value, bool>
operator!=(const Disposition& d, const no_error_t&) noexcept
{
return !disposition_traits<Disposition>::not_an_error(d);
}
};
BOOST_ASIO_INLINE_VARIABLE constexpr no_error_t no_error;
template <>
struct disposition_traits<no_error_t>
{
static bool not_an_error(no_error_t) noexcept
{
return true;
}
static void throw_exception(no_error_t)
{
}
static std::exception_ptr to_exception_ptr(no_error_t) noexcept
{
return std::exception_ptr();
}
};
template <typename Disposition>
inline void throw_exception(Disposition&& d,
constraint_t<is_disposition<decay_t<Disposition>>::value> = 0)
{
disposition_traits<decay_t<Disposition>>::throw_exception(
static_cast<Disposition&&>(d));
}
template <typename Disposition>
inline std::exception_ptr to_exception_ptr(Disposition&& d,
constraint_t<is_disposition<decay_t<Disposition>>::value> = 0) noexcept
{
return disposition_traits<decay_t<Disposition>>::to_exception_ptr(
static_cast<Disposition&&>(d));
}
} }
#include <boost/asio/detail/pop_options.hpp>
#endif