From f0ad20a2506c36493dee63d0e1b7f9539a315601 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 12 May 2021 18:41:54 +0300 Subject: [PATCH] Implement const_str_t<> helper --- rpcs3/util/logs.hpp | 8 ++--- rpcs3/util/types.hpp | 74 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/rpcs3/util/logs.hpp b/rpcs3/util/logs.hpp index e31a9d193e..345560ea5a 100644 --- a/rpcs3/util/logs.hpp +++ b/rpcs3/util/logs.hpp @@ -84,19 +84,19 @@ namespace logs #define GEN_LOG_METHOD(_sev)\ const message msg_##_sev{this, level::_sev};\ - template \ - void _sev(const CharT(&fmt)[N], const Args&... args)\ + template \ + void _sev(const const_str& fmt, const Args&... args)\ {\ if (level::_sev <= enabled.observe()) [[unlikely]]\ {\ if constexpr (sizeof...(Args) > 0)\ {\ static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...};\ - msg_##_sev.broadcast(reinterpret_cast(fmt), type_list, u64{fmt_unveil::get(args)}...);\ + msg_##_sev.broadcast(fmt, type_list, u64{fmt_unveil::get(args)}...);\ }\ else\ {\ - msg_##_sev.broadcast(reinterpret_cast(fmt), nullptr);\ + msg_##_sev.broadcast(fmt, nullptr);\ }\ }\ }\ diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index 959b1ad98d..fb21075d3c 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -670,6 +670,80 @@ constexpr unsigned __builtin_COLUMN() } #endif +template +struct const_str_t +{ + static constexpr usz size = Size; + + char8_t chars[Size + 1]{}; + + constexpr const_str_t(const char(&a)[Size + 1]) + { + for (usz i = 0; i <= Size; i++) + chars[i] = a[i]; + } + + constexpr const_str_t(const char8_t(&a)[Size + 1]) + { + for (usz i = 0; i <= Size; i++) + chars[i] = a[i]; + } + + operator const char*() const + { + return reinterpret_cast(chars); + } + + constexpr operator const char8_t*() const + { + return chars; + } +}; + +template <> +struct const_str_t +{ + const usz size; + + const union + { + const char8_t* chars; + const char* chars2; + }; + + template + constexpr const_str_t(const char8_t(&a)[N]) + : size(N - 1) + , chars(+a) + { + } + + template + constexpr const_str_t(const char(&a)[N]) + : size(N - 1) + , chars2(+a) + { + } + + operator const char*() const + { + return std::launder(chars2); + } + + constexpr operator const char8_t*() const + { + return chars; + } +}; + +template +const_str_t(const char(&a)[Size]) -> const_str_t; + +template +const_str_t(const char8_t(&a)[Size]) -> const_str_t; + +using const_str = const_str_t<>; + struct src_loc { u32 line;