aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-10 16:14:34 +0200
committerOvahlord <dreadkiller@gmx.de>2025-04-12 14:03:08 +0200
commit086bc47b48bbc9ffaf11b873ac8672819da592d9 (patch)
tree34268ab2a1b1f4e85d65d2542eaf838ea84d6eaa /src
parent489394964bf43d3d77a10d9b2733d7f11380030f (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.h20
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