From fb7772871c0d13b18f48cf0b72ea8412c3155769 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 5 Jul 2025 14:06:13 +1000 Subject: [PATCH] GameDatabase: Use string_view for disc sets Avoid the allocations, apparently forgot this one. --- src/core/cheats.cpp | 2 +- src/core/game_database.cpp | 4 ++-- src/core/game_database.h | 4 ++-- src/core/game_list.cpp | 10 +++++----- src/core/game_list.h | 4 ++-- src/core/system.cpp | 15 ++++++++++----- src/duckstation-qt/mainwindow.cpp | 2 +- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/core/cheats.cpp b/src/core/cheats.cpp index d64760d00..4fbc93aad 100644 --- a/src/core/cheats.cpp +++ b/src/core/cheats.cpp @@ -429,7 +429,7 @@ void Cheats::EnumerateChtFiles(const std::string_view serial, std::optionaldisc_set_serials.size() > 1) { - for (const std::string& set_serial : gentry->disc_set_serials) + for (const std::string_view& set_serial : gentry->disc_set_serials) { if (set_serial == serial) continue; diff --git a/src/core/game_database.cpp b/src/core/game_database.cpp index cc44b60f4..c29512e99 100644 --- a/src/core/game_database.cpp +++ b/src/core/game_database.cpp @@ -974,7 +974,7 @@ std::string GameDatabase::Entry::GenerateCompatibilityReport() const if (!disc_set_name.empty()) { ret.append_format("**{}:** {}\n", TRANSLATE_SV("GameDatabase", "Disc Set"), disc_set_name); - for (const std::string& ds_serial : disc_set_serials) + for (const std::string_view& ds_serial : disc_set_serials) ret.append_format(" - {}\n", ds_serial); } @@ -1172,7 +1172,7 @@ bool GameDatabase::SaveToCache() writer.WriteSizePrefixedString(entry.disc_set_name); writer.WriteU32(static_cast(entry.disc_set_serials.size())); - for (const std::string& serial : entry.disc_set_serials) + for (const std::string_view& serial : entry.disc_set_serials) writer.WriteSizePrefixedString(serial); } diff --git a/src/core/game_database.h b/src/core/game_database.h index 66cca7660..eb3873253 100644 --- a/src/core/game_database.h +++ b/src/core/game_database.h @@ -133,8 +133,8 @@ struct Entry std::optional gpu_pgxp_depth_threshold; std::optional gpu_pgxp_preserve_proj_fp; - std::string disc_set_name; - std::vector disc_set_serials; + std::string_view disc_set_name; + std::vector disc_set_serials; ALWAYS_INLINE bool HasTrait(Trait trait) const { return traits[static_cast(trait)]; } ALWAYS_INLINE bool HasLanguage(Language language) const { return languages.test(static_cast(language)); } diff --git a/src/core/game_list.cpp b/src/core/game_list.cpp index 5791f352f..60fdd6906 100644 --- a/src/core/game_list.cpp +++ b/src/core/game_list.cpp @@ -1129,7 +1129,7 @@ void GameList::CreateDiscSetEntries(const std::vector& excluded_pat // figure out play time for all discs, and sum it // we do this via lookups, rather than the other entries, because of duplicates - for (const std::string& set_serial : dbentry->disc_set_serials) + for (const std::string_view& set_serial : dbentry->disc_set_serials) { const auto it = played_time_map.find(set_serial); if (it == played_time_map.end()) @@ -1612,13 +1612,13 @@ TinyString GameList::FormatTimespan(std::time_t timespan, bool long_format) return ret; } -std::vector> -GameList::GetMatchingEntriesForSerial(const std::span serials) +std::vector> +GameList::GetMatchingEntriesForSerial(const std::span serials) { - std::vector> ret; + std::vector> ret; ret.reserve(serials.size()); - for (const std::string& serial : serials) + for (const std::string_view& serial : serials) { const Entry* matching_entry = nullptr; bool has_multiple_entries = false; diff --git a/src/core/game_list.h b/src/core/game_list.h index a2c87a555..c80d6a6d2 100644 --- a/src/core/game_list.h +++ b/src/core/game_list.h @@ -136,8 +136,8 @@ std::string GetNewCoverImagePathForEntry(const Entry* entry, const char* new_fil /// Returns a list of (title, entry) for entries matching serials. Titles will match the gamedb title, /// except when two files have the same serial, in which case the filename will be used instead. -std::vector> -GetMatchingEntriesForSerial(const std::span serials); +std::vector> +GetMatchingEntriesForSerial(const std::span serials); /// Downloads covers using the specified URL templates. By default, covers are saved by title, but this can be changed /// with the use_serial parameter. save_callback optionall takes the entry and the path the new cover is saved to. diff --git a/src/core/system.cpp b/src/core/system.cpp index 002a40ba1..aad8f03ea 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2037,7 +2037,7 @@ void System::ClearRunningGame() s_state.running_game_hash = 0; Host::OnSystemGameChanged(s_state.running_game_path, s_state.running_game_serial, s_state.running_game_title, - s_state.running_game_hash); + s_state.running_game_hash); UpdateRichPresence(true); } @@ -4225,7 +4225,7 @@ void System::UpdateRunningGame(const std::string& path, CDImage* image, bool boo s_state.running_game_hash); Host::OnSystemGameChanged(s_state.running_game_path, s_state.running_game_serial, s_state.running_game_title, - s_state.running_game_hash); + s_state.running_game_hash); } bool System::CheckForRequiredSubQ(Error* error) @@ -6164,20 +6164,25 @@ void System::UpdateRichPresence(bool update_session_time) rp.largeImageKey = "duckstation_logo"; rp.largeImageText = "DuckStation PS1/PSX Emulator"; rp.startTimestamp = s_state.discord_presence_time_epoch; - rp.details = "No Game Running"; + + TinyString game_details = "No Game Running"; if (IsValidOrInitializing()) { // Use disc set name if it's not a custom title. if (s_state.running_game_entry && !s_state.running_game_entry->disc_set_name.empty() && s_state.running_game_title == s_state.running_game_entry->title) { - rp.details = s_state.running_game_entry->disc_set_name.c_str(); + game_details = s_state.running_game_entry->disc_set_name; } else { - rp.details = s_state.running_game_title.empty() ? "Unknown Game" : s_state.running_game_title.c_str(); + if (s_state.running_game_title.empty()) + game_details = "Unknown Game"; + else + game_details = std::string_view(s_state.running_game_title); } } + rp.details = game_details.c_str(); const auto lock = Achievements::GetLock(); diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 0cc04011c..2d48b2296 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -1258,7 +1258,7 @@ void MainWindow::onChangeDiscMenuAboutToShow() auto lock = GameList::GetLock(); for (const auto& [title, glentry] : GameList::GetMatchingEntriesForSerial(entry->disc_set_serials)) { - QAction* action = m_ui.menuChangeDisc->addAction(QString::fromStdString(title)); + QAction* action = m_ui.menuChangeDisc->addAction(QtUtils::StringViewToQString(title)); QString path = QString::fromStdString(glentry->path); action->setCheckable(true); action->setChecked(path == s_current_game_path);