3#include <scl/feature/detail/executor_access.h>
4#include <scl/feature/type_traits/wrapper.h>
5#include <scl/utility/type_traits/forward_like.h>
10namespace scl::feature::detail
12 enum class wrapper_guard_case :
bool
18 template <
typename Refer, wrapper_guard_case Case>
21 template <
typename Refer>
22 class wrapper_guard<Refer, wrapper_guard_case::value>
24 static_assert(::std::is_reference_v<Refer>);
31 ~wrapper_guard() =
default;
34 : m_value{::std::forward<Refer>(v)}
37 constexpr decltype(
auto) value()
const noexcept { return ::std::forward<Refer>(m_value); }
43 template <
typename WrapperRefer>
44 class wrapper_guard<WrapperRefer, wrapper_guard_case::wrapper>
46 static_assert(::std::is_reference_v<WrapperRefer>);
49 using wrapper_type = ::std::remove_cvref_t<WrapperRefer>;
50 using executor_type =
typename wrapper_type::executor_type;
51 using executor_refer = scl::forward_like_t<WrapperRefer, executor_type>;
60 : m_executor{executor_access::get(::std::forward<WrapperRefer>(w))}
62 if constexpr (
requires { executor_type::template guard<executor_refer>(m_executor); })
63 executor_type::template guard<executor_refer>(m_executor);
66 constexpr ~wrapper_guard()
68 if constexpr (
requires { executor_type::template unguard<executor_refer>(m_executor); })
69 executor_type::template unguard<executor_refer>(m_executor);
72 constexpr decltype(
auto) value()
const noexcept
74 executor_type::template value<executor_refer>(::std::declval<executor_refer>());
77 return executor_type::template value<executor_refer>(::std::forward<executor_refer>(m_executor));
81 executor_refer m_executor;
constexpr bool is_wrapper_v
Checks whether Type is a wrapper specialization.
Definition wrapper.h:28
detail::wrapper_guard< Refer, ::scl::feature::is_wrapper_v<::std::remove_cvref_t< Refer > > ? detail::wrapper_guard_case::wrapper :detail::wrapper_guard_case::value > wrapper_guard
RAII guard providing access to the value held by a wrapper or a plain reference.
Definition wrapper_guard.h:29