diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-04-10 16:14:34 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-04-12 14:03:08 +0200 |
commit | 086bc47b48bbc9ffaf11b873ac8672819da592d9 (patch) | |
tree | 34268ab2a1b1f4e85d65d2542eaf838ea84d6eaa /src | |
parent | 489394964bf43d3d77a10d9b2733d7f11380030f (diff) |
Core/Misc: Port C++23 std::forward_like
(cherry picked from commit 70a5bb451c46329355fa5fdeb28c6e565d4242c8)
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Utilities/advstd.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/common/Utilities/advstd.h b/src/common/Utilities/advstd.h index c09c47ddd4b..810346ddeef 100644 --- a/src/common/Utilities/advstd.h +++ b/src/common/Utilities/advstd.h @@ -52,6 +52,26 @@ template <typename To, typename From, #endif } +// std::forward_like +#ifdef __cpp_lib_forward_like +#include <utility> +namespace advstd +{ +using std::forward_like; +} +#else +namespace advstd +{ +template <class T, class U> +[[nodiscard]] constexpr decltype(auto) forward_like(U&& value) noexcept +{ + using ValueU = std::remove_reference_t<U>; + using ValueConstU = std::conditional_t<std::is_const_v<std::remove_reference_t<T>>, ValueU const, ValueU>; + return static_cast<std::conditional_t<std::is_rvalue_reference_v<T&&>, ValueConstU&&, ValueConstU&>>(value); +} +} +#endif + // std::ranges::contains #include <algorithm> #ifndef __cpp_lib_ranges_contains |