"ScL Feature"/
ScL Feature 0.0.1
C++20 composable proxy wrapper with pluggable executor strategy
Loading...
Searching...
No Matches
wrapper_cast.h
1#pragma once
2
3#ifndef DOXYGEN
4
5#include <scl/feature/concepts/wrapper.h>
6#include <scl/feature/detail/wrapper_cast.h>
7
8#include <utility>
9
10namespace scl
11{
12 template <typename Refer>
13 using wrapper_caster = ::scl::feature::detail::wrapper_caster<Refer>;
14
15 template <typename Type>
16 [[nodiscard]]
17 constexpr decltype(auto) wrapper_cast(Type && w) noexcept
18 {
19 return ::scl::wrapper_caster<Type &&>{::std::forward<Type>(w)};
20 }
21
22} // namespace scl
23
24#else // DOXYGEN
25
26namespace scl
27{
31
58 template <typename Refer>
59 class [[nodiscard]] wrapper_caster
60 {
61 public:
62 wrapper_caster(wrapper_caster &&) = delete;
63 wrapper_caster(wrapper_caster const &) = delete;
64 wrapper_caster & operator=(wrapper_caster &&) = delete;
65 wrapper_caster & operator=(wrapper_caster const &) = delete;
66
73 explicit wrapper_caster(Refer ref);
74
83
96 [[nodiscard]]
97 operator Refer() &&;
98
109 template <typename T>
110 [[nodiscard]]
111 T to() &&
112 requires ::scl::feature::concepts::convertible_from<T, Refer>;
113 };
114
127 template <typename Wrapper>
128 [[nodiscard]]
129 constexpr decltype(auto) wrapper_cast(Wrapper && w);
130
141 template <typename Value>
142 [[nodiscard]]
143 constexpr decltype(auto) wrapper_cast(Value && v) noexcept;
144 // end of group scl_feature_wrapper_cast
146} // namespace scl
147
148#endif // DOXYGEN
Lazy-locking cast proxy for a wrapper or plain value reference.
Definition wrapper_cast.h:60
~wrapper_caster()
Releases all guards acquired during conversion.
T to() &&
Acquires the guards needed to reach T and returns the value.
wrapper_caster(Refer ref)
Constructs the proxy, capturing references to every executor in the wrapper chain via an internal val...
constexpr decltype(auto) wrapper_cast(Wrapper &&w)
Returns a lazy-locking cast proxy for a wrapper reference.
Root namespace of the ScL project.