From 492fa7c6320bff355a9e8b82e5578d94d4506a3a Mon Sep 17 00:00:00 2001 From: oltolm Date: Fri, 21 Nov 2025 00:00:03 +0100 Subject: [PATCH] use concepts instead of SFINAE --- src/xenia/base/chrono.h | 23 ++++++++++------------- src/xenia/kernel/util/shim_utils.h | 15 ++++++++------- src/xenia/kernel/xobject.h | 8 ++++---- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/xenia/base/chrono.h b/src/xenia/base/chrono.h index 1e9e0ea05..9812d1253 100644 --- a/src/xenia/base/chrono.h +++ b/src/xenia/base/chrono.h @@ -75,11 +75,10 @@ struct NtSystemClock { } // To convert XSystemClock to sys, do clock_cast(tp) first - // SFINAE hack https://stackoverflow.com/a/58813009 - template - static constexpr std::enable_if_t - to_sys(const time_point& tp) { + static constexpr std::chrono::system_clock::time_point to_sys( + const time_point& tp) + requires(domain_ == Domain::Host) + { using sys_duration = std::chrono::system_clock::duration; using sys_time = std::chrono::system_clock::time_point; @@ -91,17 +90,15 @@ struct NtSystemClock { // TODO(Gliniak): Disable until WINE will implement tzdb. /* - template - static constexpr std::enable_if_t< - domain_fresh_ == Domain::Host, - std::chrono::local_time> - to_local(const time_point& tp) { + static constexpr std::chrono::local_time + to_local(const time_point& tp) requires (domain_ == Domain::Host) { return std::chrono::current_zone()->to_local(to_sys(tp)); }*/ - template - static constexpr std::enable_if_t - from_sys(const std::chrono::system_clock::time_point& tp) { + static constexpr time_point from_sys( + const std::chrono::system_clock::time_point& tp) + requires(domain_ == Domain::Host) + { auto ctp = std::chrono::time_point_cast(tp); auto dp = time_point{ctp.time_since_epoch()}; dp -= unix_epoch_delta(); diff --git a/src/xenia/kernel/util/shim_utils.h b/src/xenia/kernel/util/shim_utils.h index 31aa85ec5..4af7166d4 100644 --- a/src/xenia/kernel/util/shim_utils.h +++ b/src/xenia/kernel/util/shim_utils.h @@ -500,15 +500,16 @@ enum class KernelModuleId { }; template -typename std::enable_if::type AppendKernelCallParams( - StringBuffer& string_buffer, xe::cpu::Export* export_entry, - const std::tuple&) {} + requires(I == sizeof...(Ps)) +void AppendKernelCallParams(StringBuffer& string_buffer, + xe::cpu::Export* export_entry, + const std::tuple&) {} template - typename std::enable_if < - I::type AppendKernelCallParams( - StringBuffer& string_buffer, xe::cpu::Export* export_entry, - const std::tuple& params) { + requires(I < sizeof...(Ps)) +void AppendKernelCallParams(StringBuffer& string_buffer, + xe::cpu::Export* export_entry, + const std::tuple& params) { if (I) { string_buffer.Append(", "); } diff --git a/src/xenia/kernel/xobject.h b/src/xenia/kernel/xobject.h index e3413622c..be6fe036d 100644 --- a/src/xenia/kernel/xobject.h +++ b/src/xenia/kernel/xobject.h @@ -286,8 +286,8 @@ class object_ref { reset(right.get()); if (value_) value_->Retain(); } - template ::value, void>::type> + template + requires std::is_convertible_v object_ref(const object_ref& right) noexcept { reset(right.get()); if (value_) value_->Retain(); @@ -379,8 +379,8 @@ bool operator!=(std::nullptr_t _Left, const object_ref<_Ty>& _Right) noexcept { } template -std::enable_if_t::value, object_ref> make_object( - Args&&... args) { + requires(!std::is_array_v) +object_ref make_object(Args&&... args) { return object_ref(new T(std::forward(args)...)); }