3#include <scl/feature/concepts/wrapper.h>
4#include <scl/feature/detail/value_lock.h>
5#include <scl/feature/type_traits/wrapper.h>
6#include <scl/utility/concepts/reference.h>
7#include <scl/utility/type_traits/forward_like.h>
12namespace scl::feature::detail
14 enum class wrapper_cast_case :
bool
28 template <
typename Caster,
29 ::scl::concepts::reference Refer,
34 template <
typename Caster, ::scl::concepts::reference Refer>
35 class cast_mixin<Caster, Refer, wrapper_cast_case::value>
40 operator Refer() &&
noexcept(
noexcept(::std::declval<Caster &&>().template to<Refer>()))
42 return static_cast<Caster &&
>(*this).template to<Refer>();
48 template <
typename Caster, concepts::wrapper_reference WrapperRefer>
49 class cast_mixin<Caster, WrapperRefer, wrapper_cast_case::wrapper>
50 :
public cast_mixin<Caster, ::scl::forward_like_t<WrapperRefer, typename ::std::remove_cvref_t<WrapperRefer>::value_type>>
54 operator WrapperRefer() &&
noexcept(
noexcept(::std::declval<Caster &&>().template to<WrapperRefer>()))
56 return static_cast<Caster &&
>(*this).template to<WrapperRefer>();
71 template <::scl::concepts::reference Refer>
73 wrapper_caster :
public cast_mixin<wrapper_caster<Refer>, Refer>
75 using lock_type = ::scl::feature::detail::value_lock<Refer,
79 wrapper_caster(wrapper_caster &&) =
delete;
80 wrapper_caster(wrapper_caster
const &) =
delete;
81 wrapper_caster & operator=(wrapper_caster &&) =
delete;
82 wrapper_caster & operator=(wrapper_caster
const &) =
delete;
83 ~wrapper_caster() =
default;
85 constexpr explicit wrapper_caster(Refer ref) noexcept
86 : m_lock{::std::forward<Refer>(ref)}
91 template <concepts::convertible_from<Refer> Type>
93 constexpr Type to() &&
94 noexcept(
noexcept(::std::declval<lock_type &>().template lock_for<Type>()) &&
95 noexcept(::std::declval<lock_type &>().template value_as<Type>()))
97 m_lock.template lock_for<Type>();
98 return m_lock.template value_as<Type>();
constexpr bool is_wrapper_v
Checks whether Type is a wrapper specialization.
Definition wrapper.h:32