diff --git a/premake5.lua b/premake5.lua index bf143ba6d..c3b79a592 100644 --- a/premake5.lua +++ b/premake5.lua @@ -26,7 +26,7 @@ defines({ "UNICODE", }) -cppdialect("C++17") +cppdialect("C++20") exceptionhandling("On") rtti("On") symbols("On") diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 05e43a81b..9b0789978 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -1462,17 +1462,17 @@ void EmulatorWindow::UpdateTitle() { // Title information, if available if (emulator()->is_title_open()) { - sb.AppendFormat(u8" | [{:08X}", emulator()->title_id()); + sb.AppendFormat(" | [{:08X}", emulator()->title_id()); auto title_version = emulator()->title_version(); if (!title_version.empty()) { - sb.Append(u8" v"); + sb.Append(" v"); sb.Append(title_version); } - sb.Append(u8"]"); + sb.Append("]"); auto title_name = emulator()->title_name(); if (!title_name.empty()) { - sb.Append(u8" "); + sb.Append(" "); sb.Append(title_name); } } @@ -1482,28 +1482,28 @@ void EmulatorWindow::UpdateTitle() { if (graphics_system) { auto graphics_name = graphics_system->name(); if (!graphics_name.empty()) { - sb.Append(u8" <"); + sb.Append(" <"); sb.Append(graphics_name); - sb.Append(u8">"); + sb.Append(">"); } } if (Clock::guest_time_scalar() != 1.0) { - sb.AppendFormat(u8" (@{:.2f}x)", Clock::guest_time_scalar()); + sb.AppendFormat(" (@{:.2f}x)", Clock::guest_time_scalar()); } if (initializing_shader_storage_) { - sb.Append(u8" (Preloading shaders\u2026)"); + sb.Append(" (Preloading shaders\u2026)"); } patcher::Patcher* patcher = emulator()->patcher(); if (patcher && patcher->IsAnyPatchApplied()) { - sb.Append(u8" [Patches Applied]"); + sb.Append(" [Patches Applied]"); } patcher::PluginLoader* pluginloader = emulator()->plugin_loader(); if (pluginloader && pluginloader->IsAnyPluginLoaded()) { - sb.Append(u8" [Plugins Loaded]"); + sb.Append(" [Plugins Loaded]"); } window_->SetTitle(sb.to_string_view()); @@ -1873,8 +1873,8 @@ void EmulatorWindow::ToggleGPUSetting(gpu_cvar value) { // Determine if the Xbox Gamebar is enabled via the Windows registry bool EmulatorWindow::IsUseNexusForGameBarEnabled() { #ifdef _WIN32 - const LPWSTR reg_path = L"SOFTWARE\\Microsoft\\GameBar"; - const LPWSTR key = L"UseNexusForGameBarEnabled"; + const LPCWSTR reg_path = L"SOFTWARE\\Microsoft\\GameBar"; + const LPCWSTR key = L"UseNexusForGameBarEnabled"; DWORD value = 0; DWORD dataSize = sizeof(value); diff --git a/src/xenia/base/cvar.cc b/src/xenia/base/cvar.cc index bc96fd74d..273c077bc 100644 --- a/src/xenia/base/cvar.cc +++ b/src/xenia/base/cvar.cc @@ -110,24 +110,24 @@ std::string EscapeBasicString(const std::string_view view) { for (auto it = begin; it != end; ++it) { auto c = *it; if (c == '\b') { - result += u8"\\b"; + result += "\\b"; } else if (c == '\t') { - result += u8"\\t"; + result += "\\t"; } else if (c == '\n') { - result += u8"\\n"; + result += "\\n"; } else if (c == '\f') { - result += u8"\\f"; + result += "\\f"; } else if (c == '\r') { - result += u8"\\r"; + result += "\\r"; } else if (c == '"') { - result += u8"\\\""; + result += "\\\""; } else if (c == '\\') { - result += u8"\\\\"; + result += "\\\\"; } else if (c < 0x20 || c == 0x7F) { if (c <= 0xFFFF) { - result += fmt::format(u8"\\u{:04X}", c); + result += fmt::format("\\u{:04X}", c); } else { - result += fmt::format(u8"\\u{:08X}", c); + result += fmt::format("\\u{:08X}", c); } } else { utfcpp::append(static_cast(c), result); @@ -150,30 +150,30 @@ std::string EscapeMultilineBasicString(const std::string_view view) { } for (int i = 0; i < quote_run; ++i) { if ((i % 3) == 2) { - result += u8"\\"; + result += "\\"; } - result += u8"\""; + result += "\""; } quote_run = 0; } if (c == '\b') { - result += u8"\\b"; + result += "\\b"; } else if (c == '\t' || c == '\n') { result += c; } else if (c == '\f') { - result += u8"\\f"; + result += "\\f"; } else if (c == '\r') { // Silently drop \r. // result += c; } else if (c == '"') { quote_run = 1; } else if (c == '\\') { - result += u8"\\\\"; + result += "\\\\"; } else if (c < 0x20 || c == 0x7F) { if (c <= 0xFFFF) { - result += fmt::format(u8"\\u{:04X}", c); + result += fmt::format("\\u{:04X}", c); } else { - result += fmt::format(u8"\\u{:08X}", c); + result += fmt::format("\\u{:08X}", c); } } else { utfcpp::append(static_cast(c), result); @@ -181,9 +181,9 @@ std::string EscapeMultilineBasicString(const std::string_view view) { } for (int i = 0; i < quote_run; ++i) { if ((i % 3) == 2) { - result += u8"\\"; + result += "\\"; } - result += u8"\""; + result += "\""; } return result; } @@ -207,11 +207,11 @@ std::string EscapeString(const std::string_view view) { } else { // multi line if (xe::utf8::find_any_of(view, escape_chars) == std::string_view::npos && - xe::utf8::find_first_of(view, u8"'''") == std::string_view::npos) { + xe::utf8::find_first_of(view, "'''") == std::string_view::npos) { return "'''\n" + std::string(view) + "'''"; } else { - return u8"\"\"\"\n" + toml_internal::EscapeMultilineBasicString(view) + - u8"\"\"\""; + return "\"\"\"\n" + toml_internal::EscapeMultilineBasicString(view) + + "\"\"\""; } } } diff --git a/src/xenia/base/logging.h b/src/xenia/base/logging.h index f029b0641..19d5c3c1a 100644 --- a/src/xenia/base/logging.h +++ b/src/xenia/base/logging.h @@ -99,10 +99,11 @@ void AppendLogLine(LogLevel log_level, const char prefix_char, size_t written); // might as well be noalias template XE_NOALIAS XE_NOINLINE XE_COLD static void AppendLogLineFormat_Impl( - LogLevel log_level, const char prefix_char, const char* format, - const Args&... args) { + LogLevel log_level, const char prefix_char, std::string_view format, + const Args&... args) noexcept { auto target = internal::GetThreadBuffer(); - auto result = fmt::format_to_n(target.first, target.second, format, args...); + auto result = fmt::format_to_n(target.first, target.second, + fmt::runtime(format), args...); internal::AppendLogLine(log_level, prefix_char, result.size); } @@ -113,8 +114,8 @@ template XE_FORCEINLINE static void AppendLogLineFormat(uint32_t log_src_mask, LogLevel log_level, const char prefix_char, - const char* format, - const Args&... args) { + std::string_view format, + const Args&... args) noexcept { if (!internal::ShouldLog(log_level, log_src_mask)) { return; } @@ -143,7 +144,8 @@ struct LoggerBatch { LoggerBatch() { reset(); } template void operator()(const char (&fmt)[fmtlen], Ts&&... args) { - auto tmpres = fmt::format_to_n(thrd_buf, thrd_buf_rem, fmt, args...); + auto tmpres = + fmt::format_to_n(thrd_buf, thrd_buf_rem, fmt::runtime(fmt), args...); thrd_buf_rem -= tmpres.size; thrd_buf = tmpres.out; total_size += tmpres.size; @@ -164,55 +166,55 @@ struct LoggerBatch { #if XE_OPTION_ENABLE_LOGGING template -XE_COLD void XELOGE(const char* format, const Args&... args) { +XE_COLD void XELOGE(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Error, '!', format, args...); } template -XE_COLD void XELOGW(const char* format, const Args&... args) { +XE_COLD void XELOGW(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Warning, 'w', format, args...); } template -void XELOGI(const char* format, const Args&... args) { +void XELOGI(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Info, 'i', format, args...); } template -void XELOGD(const char* format, const Args&... args) { +void XELOGD(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Debug, 'd', format, args...); } template -void XELOGCPU(const char* format, const Args&... args) { +void XELOGCPU(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Cpu, xe::LogLevel::Info, 'C', format, args...); } template -void XELOGAPU(const char* format, const Args&... args) { +void XELOGAPU(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Apu, xe::LogLevel::Debug, 'A', format, args...); } template -void XELOGGPU(const char* format, const Args&... args) { +void XELOGGPU(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Debug, 'G', format, args...); } template -void XELOGKERNEL(const char* format, const Args&... args) { +void XELOGKERNEL(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Kernel, xe::LogLevel::Info, 'K', format, args...); } template -void XELOGFS(const char* format, const Args&... args) { +void XELOGFS(std::string_view format, const Args&... args) { xe::logging::AppendLogLineFormat(xe::LogSrc::Uncategorized, xe::LogLevel::Info, 'F', format, args...); } diff --git a/src/xenia/base/socket_win.cc b/src/xenia/base/socket_win.cc index 730b2b8ab..e9d343c5b 100644 --- a/src/xenia/base/socket_win.cc +++ b/src/xenia/base/socket_win.cc @@ -193,7 +193,7 @@ std::unique_ptr Socket::Connect(std::string hostname, uint16_t port) { InitializeWinsock(); auto socket = std::make_unique(); - if (!socket->Connect(std::move(hostname), port)) { + if (!socket->Connect(hostname, port)) { return nullptr; } return std::unique_ptr(socket.release()); diff --git a/src/xenia/base/string_buffer.h b/src/xenia/base/string_buffer.h index 16900824a..9a4743deb 100644 --- a/src/xenia/base/string_buffer.h +++ b/src/xenia/base/string_buffer.h @@ -35,7 +35,7 @@ class StringBuffer { template void AppendFormat(const char* format, const Args&... args) { - auto s = fmt::format(format, args...); + auto s = fmt::format(fmt::runtime(format), args...); Append(s.c_str()); } diff --git a/src/xenia/base/testing/utf8_test.cc b/src/xenia/base/testing/utf8_test.cc index 356f8ad0f..77e04dd37 100644 --- a/src/xenia/base/testing/utf8_test.cc +++ b/src/xenia/base/testing/utf8_test.cc @@ -37,121 +37,121 @@ namespace examples { const size_t kDanishCount = 1; const char* kDanishValues[kDanishCount] = { - u8"Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Wolther " - u8"spillede på xylofon.", + "Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Wolther " + "spillede på xylofon.", }; #define TEST_LANGUAGE_EXAMPLES_Danish(func, results) \ TEST_EXAMPLES_1(func, Danish, results) const size_t kGermanCount = 3; const char* kGermanValues[kGermanCount] = { - u8"Falsches Üben von Xylophonmusik quält jeden größeren Zwerg", - u8"Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich", - u8"Heizölrückstoßabdämpfung", + "Falsches Üben von Xylophonmusik quält jeden größeren Zwerg", + "Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich", + "Heizölrückstoßabdämpfung", }; #define TEST_LANGUAGE_EXAMPLES_German(func, results) \ TEST_EXAMPLES_2(func, German, results) const size_t kGreekCount = 2; const char* kGreekValues[kGreekCount] = { - u8"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο", - u8"Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", + "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο", + "Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", }; #define TEST_LANGUAGE_EXAMPLES_Greek(func, results) \ TEST_EXAMPLES_2(func, Greek, results) const size_t kEnglishCount = 1; const char* kEnglishValues[kEnglishCount] = { - u8"The quick brown fox jumps over the lazy dog", + "The quick brown fox jumps over the lazy dog", }; #define TEST_LANGUAGE_EXAMPLES_English(func, results) \ TEST_EXAMPLES_1(func, English, results) const size_t kSpanishCount = 1; const char* kSpanishValues[kSpanishCount] = { - u8"El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y frío, " - u8"añoraba a su querido cachorro.", + "El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y frío, " + "añoraba a su querido cachorro.", }; #define TEST_LANGUAGE_EXAMPLES_Spanish(func, results) \ TEST_EXAMPLES_1(func, Spanish, results) const size_t kFrenchCount = 3; const char* kFrenchValues[kFrenchCount] = { - u8"Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à " - u8"côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui " - u8"lui permet de penser à la cænogenèse de l'être dont il est question " - u8"dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, " - u8"pense-t-il, diminue çà et là la qualité de son œuvre.", - u8"l'île exiguë\n" - u8"Où l'obèse jury mûr\n" - u8"Fête l'haï volapük,\n" - u8"Âne ex aéquo au whist,\n" - u8"Ôtez ce vœu déçu.", - u8"Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en canoë " - u8"au delà des îles, près du mälström où brûlent les novæ.", + "Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à " + "côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui " + "lui permet de penser à la cænogenèse de l'être dont il est question " + "dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, " + "pense-t-il, diminue çà et là la qualité de son œuvre.", + "l'île exiguë\n" + "Où l'obèse jury mûr\n" + "Fête l'haï volapük,\n" + "Âne ex aéquo au whist,\n" + "Ôtez ce vœu déçu.", + "Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en canoë " + "au delà des îles, près du mälström où brûlent les novæ.", }; #define TEST_LANGUAGE_EXAMPLES_French(func, results) \ TEST_EXAMPLES_3(func, French, results) const size_t kIrishGaelicCount = 1; const char* kIrishGaelicValues[kIrishGaelicCount] = { - u8"D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh", + "D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh", }; #define TEST_LANGUAGE_EXAMPLES_IrishGaelic(func, results) \ TEST_EXAMPLES_1(func, IrishGaelic, results) const size_t kHungarianCount = 1; const char* kHungarianValues[kHungarianCount] = { - u8"Árvíztűrő tükörfúrógép", + "Árvíztűrő tükörfúrógép", }; #define TEST_LANGUAGE_EXAMPLES_Hungarian(func, results) \ TEST_EXAMPLES_1(func, Hungarian, results) const size_t kIcelandicCount = 2; const char* kIcelandicValues[kIcelandicCount] = { - u8"Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa", - u8"Sævör grét áðan því úlpan var ónýt", + "Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa", + "Sævör grét áðan því úlpan var ónýt", }; #define TEST_LANGUAGE_EXAMPLES_Icelandic(func, results) \ TEST_EXAMPLES_2(func, Icelandic, results) const size_t kJapaneseCount = 2; const char* kJapaneseValues[kJapaneseCount] = { - u8"いろはにほへとちりぬるを\n" - u8"わかよたれそつねならむ\n" - u8"うゐのおくやまけふこえて\n" - u8"あさきゆめみしゑひもせす\n", - u8"イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム\n" - u8"ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン", + "いろはにほへとちりぬるを\n" + "わかよたれそつねならむ\n" + "うゐのおくやまけふこえて\n" + "あさきゆめみしゑひもせす\n", + "イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム\n" + "ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン", }; #define TEST_LANGUAGE_EXAMPLES_Japanese(func, results) \ TEST_EXAMPLES_2(func, Japanese, results) const size_t kHebrewCount = 1; const char* kHebrewValues[kHebrewCount] = { - u8"? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה", + "? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה", }; #define TEST_LANGUAGE_EXAMPLES_Hebrew(func, results) \ TEST_EXAMPLES_1(func, Hebrew, results) const size_t kPolishCount = 1; const char* kPolishValues[kPolishCount] = { - u8"Pchnąć w tę łódź jeża lub ośm skrzyń fig", + "Pchnąć w tę łódź jeża lub ośm skrzyń fig", }; #define TEST_LANGUAGE_EXAMPLES_Polish(func, results) \ TEST_EXAMPLES_1(func, Polish, results) const size_t kRussianCount = 2; const char* kRussianValues[kRussianCount] = { - u8"В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!", - u8"Съешь же ещё этих мягких французских булок да выпей чаю", + "В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!", + "Съешь же ещё этих мягких французских булок да выпей чаю", }; #define TEST_LANGUAGE_EXAMPLES_Russian(func, results) \ TEST_EXAMPLES_2(func, Russian, results) const size_t kTurkishCount = 1; const char* kTurkishValues[kTurkishCount] = { - u8"Pijamalı hasta, yağız şoföre çabucak güvendi.", + "Pijamalı hasta, yağız şoföre çabucak güvendi.", }; #define TEST_LANGUAGE_EXAMPLES_Turkish(func, results) \ TEST_EXAMPLES_1(func, Turkish, results) @@ -229,54 +229,54 @@ TEST_CASE("UTF-8 Split", "[utf8]") { std::vector parts; // Danish - parts = utf8::split(examples::kDanishValues[0], u8"æcå"); + parts = utf8::split(examples::kDanishValues[0], "æcå"); REQUIRE(parts.size() == 4); - REQUIRE(parts[0] == u8"Quizdeltagerne spiste jordb"); - REQUIRE(parts[1] == u8"r med fløde, mens "); - REQUIRE(parts[2] == u8"irkusklovnen Wolther spillede p"); - REQUIRE(parts[3] == u8" xylofon."); + REQUIRE(parts[0] == "Quizdeltagerne spiste jordb"); + REQUIRE(parts[1] == "r med fløde, mens "); + REQUIRE(parts[2] == "irkusklovnen Wolther spillede p"); + REQUIRE(parts[3] == " xylofon."); // German - parts = utf8::split(examples::kGermanValues[0], u8"ßS"); + parts = utf8::split(examples::kGermanValues[0], "ßS"); REQUIRE(parts.size() == 2); - REQUIRE(parts[0] == u8"Falsches Üben von Xylophonmusik quält jeden grö"); - REQUIRE(parts[1] == u8"eren Zwerg"); - parts = utf8::split(examples::kGermanValues[1], u8"ßS"); + REQUIRE(parts[0] == "Falsches Üben von Xylophonmusik quält jeden grö"); + REQUIRE(parts[1] == "eren Zwerg"); + parts = utf8::split(examples::kGermanValues[1], "ßS"); REQUIRE(parts.size() == 2); - REQUIRE(parts[0] == u8"Zwölf Boxkämpfer jagten Eva quer über den "); - REQUIRE(parts[1] == u8"ylter Deich"); - parts = utf8::split(examples::kGermanValues[2], u8"ßS"); + REQUIRE(parts[0] == "Zwölf Boxkämpfer jagten Eva quer über den "); + REQUIRE(parts[1] == "ylter Deich"); + parts = utf8::split(examples::kGermanValues[2], "ßS"); REQUIRE(parts.size() == 2); - REQUIRE(parts[0] == u8"Heizölrücksto"); - REQUIRE(parts[1] == u8"abdämpfung"); + REQUIRE(parts[0] == "Heizölrücksto"); + REQUIRE(parts[1] == "abdämpfung"); // Greek - parts = utf8::split(examples::kGreekValues[0], u8"πφ"); + parts = utf8::split(examples::kGreekValues[0], "πφ"); REQUIRE(parts.size() == 4); - REQUIRE(parts[0] == u8"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ "); - REQUIRE(parts[1] == u8"ιὰ στὸ χρυσα"); - REQUIRE(parts[2] == u8"ὶ ξέ"); - REQUIRE(parts[3] == u8"ωτο"); - parts = utf8::split(examples::kGreekValues[1], u8"πφ"); + REQUIRE(parts[0] == "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ "); + REQUIRE(parts[1] == "ιὰ στὸ χρυσα"); + REQUIRE(parts[2] == "ὶ ξέ"); + REQUIRE(parts[3] == "ωτο"); + parts = utf8::split(examples::kGreekValues[1], "πφ"); REQUIRE(parts.size() == 3); - REQUIRE(parts[0] == u8"Ξεσκε"); - REQUIRE(parts[1] == u8"άζω τὴν ψυχο"); - REQUIRE(parts[2] == u8"θόρα βδελυγμία"); + REQUIRE(parts[0] == "Ξεσκε"); + REQUIRE(parts[1] == "άζω τὴν ψυχο"); + REQUIRE(parts[2] == "θόρα βδελυγμία"); // English parts = utf8::split(examples::kEnglishValues[0], "xy"); REQUIRE(parts.size() == 3); - REQUIRE(parts[0] == u8"The quick brown fo"); - REQUIRE(parts[1] == u8" jumps over the laz"); - REQUIRE(parts[2] == u8" dog"); + REQUIRE(parts[0] == "The quick brown fo"); + REQUIRE(parts[1] == " jumps over the laz"); + REQUIRE(parts[2] == " dog"); // Spanish - parts = utf8::split(examples::kSpanishValues[0], u8"ójd"); + parts = utf8::split(examples::kSpanishValues[0], "ójd"); REQUIRE(parts.size() == 4); - REQUIRE(parts[0] == u8"El pingüino Wenceslao hizo kil"); - REQUIRE(parts[1] == u8"metros ba"); - REQUIRE(parts[2] == u8"o exhaustiva lluvia y frío, añoraba a su queri"); - REQUIRE(parts[3] == u8"o cachorro."); + REQUIRE(parts[0] == "El pingüino Wenceslao hizo kil"); + REQUIRE(parts[1] == "metros ba"); + REQUIRE(parts[2] == "o exhaustiva lluvia y frío, añoraba a su queri"); + REQUIRE(parts[3] == "o cachorro."); // TODO(gibbed): French // TODO(gibbed): Irish Gaelic @@ -291,18 +291,18 @@ TEST_CASE("UTF-8 Split", "[utf8]") { } TEST_CASE("UTF-8 Equal Z", "[utf8]") { - REQUIRE(utf8::equal_z(u8"foo", u8"foo\0")); - REQUIRE_FALSE(utf8::equal_z(u8"bar", u8"baz\0")); + REQUIRE(utf8::equal_z("foo", "foo\0")); + REQUIRE_FALSE(utf8::equal_z("bar", "baz\0")); } TEST_CASE("UTF-8 Equal Case", "[utf8]") { - REQUIRE(utf8::equal_case(u8"foo", u8"foo\0")); - REQUIRE_FALSE(utf8::equal_case(u8"bar", u8"baz\0")); + REQUIRE(utf8::equal_case("foo", "foo\0")); + REQUIRE_FALSE(utf8::equal_case("bar", "baz\0")); } TEST_CASE("UTF-8 Equal Case Z", "[utf8]") { - REQUIRE(utf8::equal_case_z(u8"foo", u8"foo\0")); - REQUIRE_FALSE(utf8::equal_case_z(u8"bar", u8"baz\0")); + REQUIRE(utf8::equal_case_z("foo", "foo\0")); + REQUIRE_FALSE(utf8::equal_case_z("bar", "baz\0")); } // TODO(gibbed): find_any_of @@ -346,11 +346,11 @@ TEST_CASE("UTF-8 Equal Case Z", "[utf8]") { } while (0) TEST_CASE("UTF-8 Join Paths", "[utf8]") { - TEST_PATHS(utf8::join_paths, u8""); - TEST_PATHS(utf8::join_paths, u8"foo", u8"foo"); - TEST_PATHS(utf8::join_paths, u8"foo/bar", u8"foo", u8"bar"); - TEST_PATHS(utf8::join_paths, "X:/foo/bar/baz/qux", u8"X:", u8"foo", u8"bar", - u8"baz", u8"qux"); + TEST_PATHS(utf8::join_paths, ""); + TEST_PATHS(utf8::join_paths, "foo", "foo"); + TEST_PATHS(utf8::join_paths, "foo/bar", "foo", "bar"); + TEST_PATHS(utf8::join_paths, "X:/foo/bar/baz/qux", "X:", "foo", "bar", "baz", + "qux"); } // TODO(gibbed): join_guest_paths diff --git a/src/xenia/base/utf8.cc b/src/xenia/base/utf8.cc index a96d6b194..103712d53 100644 --- a/src/xenia/base/utf8.cc +++ b/src/xenia/base/utf8.cc @@ -469,7 +469,7 @@ bool ends_with_case(const std::string_view haystack, } std::vector split_path(const std::string_view path) { - return split(path, u8"\\/", true); + return split(path, "\\/", true); } std::string join_paths(const std::string_view left_path, diff --git a/src/xenia/cpu/hir/hir_builder.h b/src/xenia/cpu/hir/hir_builder.h index b33f18aaf..91c6ad4c0 100644 --- a/src/xenia/cpu/hir/hir_builder.h +++ b/src/xenia/cpu/hir/hir_builder.h @@ -99,7 +99,8 @@ class HIRBuilder { void CommentFormat(const std::string_view format, const Args&... args) { static const uint32_t kMaxCommentSize = 1024; char* p = reinterpret_cast(arena_->Alloc(kMaxCommentSize, 1)); - auto result = fmt::format_to_n(p, kMaxCommentSize - 1, format, args...); + auto result = + fmt::format_to_n(p, kMaxCommentSize - 1, fmt::runtime(format), args...); p[result.size] = '\0'; size_t rewind = kMaxCommentSize - 1 - result.size; arena_->Rewind(rewind); diff --git a/src/xenia/cpu/ppc/ppc_translator.cc b/src/xenia/cpu/ppc/ppc_translator.cc index c559abe89..1acbe0b89 100644 --- a/src/xenia/cpu/ppc/ppc_translator.cc +++ b/src/xenia/cpu/ppc/ppc_translator.cc @@ -155,7 +155,7 @@ void PPCTranslator::DumpHIR(GuestFunction* function, PPCHIRBuilder* builder) { folder_path.append(&tmpbuf[0]); } - FILE* f = fopen(folder_path.generic_u8string().c_str(), "w"); + FILE* f = fopen(folder_path.string().c_str(), "w"); if (f) { fputs(buffer.buffer(), f); fclose(f); diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 2dad04bd9..0ac14d537 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -718,7 +718,7 @@ X_STATUS Emulator::DataMigration(const uint64_t xuid) { const auto old_profile_data = xe::filesystem::ListDirectories(title.path / title.name / "profile"); - xe::filesystem::FileInfo& entry_to_copy = xe::filesystem::FileInfo(); + xe::filesystem::FileInfo entry_to_copy = xe::filesystem::FileInfo(); if (old_profile_data.size() != 1) { for (const auto& entry : old_profile_data) { if (entry.name == "User") { diff --git a/src/xenia/emulator.h b/src/xenia/emulator.h index 6bc037759..7616bea32 100644 --- a/src/xenia/emulator.h +++ b/src/xenia/emulator.h @@ -245,9 +245,8 @@ class Emulator { ContentInstallationInfo& installation_info); // Extract content of zar package to desired directory. - X_STATUS Emulator::ExtractZarchivePackage( - const std::filesystem::path& path, - const std::filesystem::path& extract_dir); + X_STATUS ExtractZarchivePackage(const std::filesystem::path& path, + const std::filesystem::path& extract_dir); // Pack contents of a folder into a zar package. X_STATUS CreateZarchivePackage(const std::filesystem::path& inputDirectory, diff --git a/src/xenia/gpu/draw_util.h b/src/xenia/gpu/draw_util.h index 131d174e8..4885db33b 100644 --- a/src/xenia/gpu/draw_util.h +++ b/src/xenia/gpu/draw_util.h @@ -383,7 +383,7 @@ struct GetViewportInfoArgs { depth_format = regs.Get().depth_format; } XE_FORCEINLINE - bool operator==(const GetViewportInfoArgs& prev) { + bool operator==(const GetViewportInfoArgs& prev) const { #if XE_ARCH_AMD64 == 0 bool result = true; diff --git a/src/xenia/gpu/texture_dump.cc b/src/xenia/gpu/texture_dump.cc index 53ecb58a6..c97052876 100644 --- a/src/xenia/gpu/texture_dump.cc +++ b/src/xenia/gpu/texture_dump.cc @@ -94,9 +94,9 @@ void TextureDump(const TextureInfo& src, void* buffer, size_t length) { static int dump_counter = 0; std::filesystem::path path = "texture_dumps"; - path /= fmt::format("{:05d}_{:08X}_{:08X}_{:08X}.dds", dump_counter++, - src.memory.base_address, src.memory.mip_address, - src.format_name()); + path /= fmt::format(fmt::runtime("{:05d}_{:08X}_{:08X}_{:08X}.dds"), + dump_counter++, src.memory.base_address, + src.memory.mip_address, src.format_name()); FILE* handle = filesystem::OpenFile(path, "wb"); if (handle) { diff --git a/src/xenia/gpu/trace_viewer.cc b/src/xenia/gpu/trace_viewer.cc index 752d4ebf9..fb139f3c7 100644 --- a/src/xenia/gpu/trace_viewer.cc +++ b/src/xenia/gpu/trace_viewer.cc @@ -64,7 +64,7 @@ TraceViewer::TraceViewer(xe::ui::WindowedAppContext& app_context, TraceViewer::~TraceViewer() = default; bool TraceViewer::OnInitialize() { - std::string path = cvars::target_trace_file.u8string(); + std::string path = cvars::target_trace_file.string(); // If no path passed, ask the user. // On Android, however, there's no synchronous file picker, and the trace file diff --git a/src/xenia/hid/sdl/sdl_input_driver.cc b/src/xenia/hid/sdl/sdl_input_driver.cc index e622f31ac..8aadf4b38 100644 --- a/src/xenia/hid/sdl/sdl_input_driver.cc +++ b/src/xenia/hid/sdl/sdl_input_driver.cc @@ -155,7 +155,7 @@ void SDLInputDriver::LoadGameControllerDB() { std::string guid = row[0]; std::string controller_name = row[1]; - auto format = [](std::string& ss, std::string& s) { + auto format = [](std::string ss, const std::string& s) { return ss.empty() ? s : ss + "," + s; }; diff --git a/src/xenia/kernel/xam/content_manager.cc b/src/xenia/kernel/xam/content_manager.cc index 5f0cc0035..31a990da5 100644 --- a/src/xenia/kernel/xam/content_manager.cc +++ b/src/xenia/kernel/xam/content_manager.cc @@ -103,7 +103,8 @@ std::filesystem::path ContentManager::ResolvePackagePath( // Content path: // content_root/title_id/content_type/data_file_name/ auto get_package_path = [&, data, disc_number](const uint32_t title_id) { - uint64_t used_xuid = (data.xuid != -1 && data.xuid != 0) ? data.xuid : xuid; + uint64_t used_xuid = + (data.xuid != -1 && data.xuid != 0) ? data.xuid.get() : xuid; auto package_root = ResolvePackageRoot(used_xuid, title_id, data.content_type); @@ -263,7 +264,8 @@ X_RESULT ContentManager::WriteContentHeaderFile(const uint64_t xuid, if (data.xuid == -1) { data.xuid = xuid; } - uint64_t used_xuid = (data.xuid != -1 && data.xuid != 0) ? data.xuid : xuid; + uint64_t used_xuid = + (data.xuid != -1 && data.xuid != 0) ? data.xuid.get() : xuid; auto header_path = ResolvePackageHeaderPath(data.file_name(), used_xuid, data.title_id, data.content_type); diff --git a/src/xenia/kernel/xam/xam_content.cc b/src/xenia/kernel/xam/xam_content.cc index 9444483c1..57894e072 100644 --- a/src/xenia/kernel/xam/xam_content.cc +++ b/src/xenia/kernel/xam/xam_content.cc @@ -621,8 +621,8 @@ DECLARE_XAM_EXPORT1(XamLoaderGetMediaInfoEx, kContent, kStub); dword_result_t XamContentLaunchImageFromFileInternal_entry( lpstring_t image_location, lpstring_t xex_name, dword_t unk) { - const std::string image_path = image_location; - const std::string xex_name_ = xex_name; + const std::string image_path = static_cast(image_location); + const std::string xex_name_ = static_cast(xex_name); vfs::Entry* entry = kernel_state()->file_system()->ResolvePath(image_path); diff --git a/src/xenia/kernel/xam/xam_content_aggregate.cc b/src/xenia/kernel/xam/xam_content_aggregate.cc index c8dce92f0..7c81ba97d 100644 --- a/src/xenia/kernel/xam/xam_content_aggregate.cc +++ b/src/xenia/kernel/xam/xam_content_aggregate.cc @@ -115,8 +115,9 @@ dword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid, for (auto& title_id : title_ids) { // Get all content data. auto content_datas = kernel_state()->content_manager()->ListContent( - static_cast(DummyDeviceId::HDD), xuid == -1 ? 0 : xuid, - title_id, content_type_enum); + static_cast(DummyDeviceId::HDD), + xuid == -1 ? 0 : static_cast(xuid), title_id, + content_type_enum); for (const auto& content_data : content_datas) { auto item = e->AppendItem(); assert_not_null(item); diff --git a/src/xenia/kernel/xam/xam_module.cc b/src/xenia/kernel/xam/xam_module.cc index 888237360..085e9d142 100644 --- a/src/xenia/kernel/xam/xam_module.cc +++ b/src/xenia/kernel/xam/xam_module.cc @@ -111,14 +111,14 @@ void XamModule::SaveLoaderData() { std::filesystem::path host_path = loader_data_.host_path; std::string launch_path = loader_data_.launch_path; - auto remove_prefix = [&launch_path](std::string& prefix) { + auto remove_prefix = [&launch_path](std::string_view prefix) { if (launch_path.compare(0, prefix.length(), prefix) == 0) { launch_path = launch_path.substr(prefix.length()); } }; - remove_prefix(std::string("game:\\")); - remove_prefix(std::string("d:\\")); + remove_prefix("game:\\"); + remove_prefix("d:\\"); if (host_path.extension() == ".xex") { host_path.remove_filename(); diff --git a/src/xenia/kernel/xam/xam_ui.cc b/src/xenia/kernel/xam/xam_ui.cc index b1d766999..6b38b5039 100644 --- a/src/xenia/kernel/xam/xam_ui.cc +++ b/src/xenia/kernel/xam/xam_ui.cc @@ -829,9 +829,11 @@ static dword_result_t XamShowMessageBoxUi( }; const Emulator* emulator = kernel_state()->emulator(); ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer(); + + auto text = xe::to_utf8(text_ptr.value()); result = xeXamDispatchDialog( - new MessageBoxDialog(imgui_drawer, title, xe::to_utf8(text_ptr.value()), - buttons, active_button), + new MessageBoxDialog(imgui_drawer, title, text, buttons, + static_cast(active_button)), close, overlapped); } return result; @@ -1012,12 +1014,15 @@ dword_result_t XamShowKeyboardUI_entry( }; const Emulator* emulator = kernel_state()->emulator(); ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer(); + + std::string title_str = title ? xe::to_utf8(title.value()) : ""; + std::string desc_str = description ? xe::to_utf8(description.value()) : ""; + std::string def_text_str = + default_text ? xe::to_utf8(default_text.value()) : ""; + result = xeXamDispatchDialogEx( - new KeyboardInputDialog( - imgui_drawer, title ? xe::to_utf8(title.value()) : "", - description ? xe::to_utf8(description.value()) : "", - default_text ? xe::to_utf8(default_text.value()) : "", - buffer_length), + new KeyboardInputDialog(imgui_drawer, title_str, desc_str, def_text_str, + buffer_length), close, overlapped); } return result; diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index 224d35a9c..47db365a6 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -620,7 +620,8 @@ dword_result_t XamUserCreateAchievementEnumerator_entry( } const util::XdbfGameData db = kernel_state()->title_xdbf(); - uint32_t title_id_ = title_id ? title_id : kernel_state()->title_id(); + uint32_t title_id_ = + title_id ? static_cast(title_id) : kernel_state()->title_id(); const auto user_title_achievements = kernel_state()->achievement_manager()->GetTitleAchievements( diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc index bdc2bbd72..5677bad56 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc @@ -354,7 +354,7 @@ dword_result_t ObCreateSymbolicLink_entry(pointer_t path_ptr, auto target = xe::utf8::canonicalize_guest_path( util::TranslateAnsiString(kernel_memory(), target_ptr)); - if (xe::utf8::starts_with(path, u8"\\??\\")) { + if (xe::utf8::starts_with(path, "\\??\\")) { path = path.substr(4); // Strip the full qualifier } diff --git a/src/xenia/kernel/xobject.h b/src/xenia/kernel/xobject.h index 1d19e8bec..293182a96 100644 --- a/src/xenia/kernel/xobject.h +++ b/src/xenia/kernel/xobject.h @@ -349,7 +349,9 @@ class object_ref { void reset(T* value) noexcept { object_ref(value).swap(*this); } - inline bool operator==(const T* right) noexcept { return value_ == right; } + inline bool operator==(const T* right) const noexcept { + return value_ == right; + } private: T* value_ = nullptr;