From 6fd7eda68fa4033e798ef28392507fce84942db8 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 2 Oct 2023 21:33:44 +1000 Subject: [PATCH] Misc: Fix build on Debian Bullseye --- src/common/heterogeneous_containers.h | 29 +++++++-- src/common/memory_settings_interface.h | 90 +++++++++++++------------- src/core/bus.cpp | 14 ++++ src/core/game_database.cpp | 2 +- src/core/game_list.cpp | 4 +- src/util/host.cpp | 4 +- 6 files changed, 89 insertions(+), 54 deletions(-) diff --git a/src/common/heterogeneous_containers.h b/src/common/heterogeneous_containers.h index b920d24dc..944907b4e 100644 --- a/src/common/heterogeneous_containers.h +++ b/src/common/heterogeneous_containers.h @@ -47,6 +47,14 @@ struct transparent_string_less }; } // namespace detail +template +using StringMap = std::map; +template +using StringMultiMap = std::multimap; +using StringSet = std::set; +using StringMultiSet = std::multiset; + +#if defined(__cpp_lib_generic_unordered_lookup) && __cpp_lib_generic_unordered_lookup >= 201811L template using UnorderedStringMap = std::unordered_map; @@ -59,8 +67,21 @@ using UnorderedStringMultiSet = std::unordered_multiset; template -using StringMap = std::map; +using PreferUnorderedStringMap = UnorderedStringMap; template -using StringMultiMap = std::multimap; -using StringSet = std::set; -using StringMultiSet = std::multiset; \ No newline at end of file +using PreferUnorderedStringMultimap = UnorderedStringMultimap; +using PreferUnorderedStringSet = UnorderedStringSet; +using PreferUnorderedStringMultiSet = UnorderedStringMultiSet; +#else + +#pragma message "__cpp_lib_generic_unordered_lookup is missing, performance will be slower." + +// GCC 10 doesn't support generic_unordered_lookup... +template +using PreferUnorderedStringMap = StringMap; +template +using PreferUnorderedStringMultimap = StringMultiMap; +using PreferUnorderedStringSet = StringSet; +using PreferUnorderedStringMultiSet = StringMultiSet; + +#endif diff --git a/src/common/memory_settings_interface.h b/src/common/memory_settings_interface.h index 55e238f84..84344dd2a 100644 --- a/src/common/memory_settings_interface.h +++ b/src/common/memory_settings_interface.h @@ -9,52 +9,52 @@ class MemorySettingsInterface final : public SettingsInterface { public: - MemorySettingsInterface(); - ~MemorySettingsInterface(); - - bool Save() override; - - void Clear() override; - - bool GetIntValue(const char* section, const char* key, s32* value) const override; - bool GetUIntValue(const char* section, const char* key, u32* value) const override; - bool GetFloatValue(const char* section, const char* key, float* value) const override; - bool GetDoubleValue(const char* section, const char* key, double* value) const override; - bool GetBoolValue(const char* section, const char* key, bool* value) const override; - bool GetStringValue(const char* section, const char* key, std::string* value) const override; - - void SetIntValue(const char* section, const char* key, s32 value) override; - void SetUIntValue(const char* section, const char* key, u32 value) override; - void SetFloatValue(const char* section, const char* key, float value) override; - void SetDoubleValue(const char* section, const char* key, double value) override; - void SetBoolValue(const char* section, const char* key, bool value) override; - void SetStringValue(const char* section, const char* key, const char* value) override; - - std::vector> GetKeyValueList(const char* section) const override; - void SetKeyValueList(const char* section, const std::vector>& items) override; - - bool ContainsValue(const char* section, const char* key) const override; - void DeleteValue(const char* section, const char* key) override; - void ClearSection(const char* section) override; - - std::vector GetStringList(const char* section, const char* key) const override; - void SetStringList(const char* section, const char* key, const std::vector& items) override; - bool RemoveFromStringList(const char* section, const char* key, const char* item) override; - bool AddToStringList(const char* section, const char* key, const char* item) override; - - // default parameter overloads - using SettingsInterface::GetBoolValue; - using SettingsInterface::GetDoubleValue; - using SettingsInterface::GetFloatValue; - using SettingsInterface::GetIntValue; - using SettingsInterface::GetStringValue; - using SettingsInterface::GetUIntValue; + MemorySettingsInterface(); + ~MemorySettingsInterface(); + + bool Save() override; + + void Clear() override; + + bool GetIntValue(const char* section, const char* key, s32* value) const override; + bool GetUIntValue(const char* section, const char* key, u32* value) const override; + bool GetFloatValue(const char* section, const char* key, float* value) const override; + bool GetDoubleValue(const char* section, const char* key, double* value) const override; + bool GetBoolValue(const char* section, const char* key, bool* value) const override; + bool GetStringValue(const char* section, const char* key, std::string* value) const override; + + void SetIntValue(const char* section, const char* key, s32 value) override; + void SetUIntValue(const char* section, const char* key, u32 value) override; + void SetFloatValue(const char* section, const char* key, float value) override; + void SetDoubleValue(const char* section, const char* key, double value) override; + void SetBoolValue(const char* section, const char* key, bool value) override; + void SetStringValue(const char* section, const char* key, const char* value) override; + + std::vector> GetKeyValueList(const char* section) const override; + void SetKeyValueList(const char* section, const std::vector>& items) override; + + bool ContainsValue(const char* section, const char* key) const override; + void DeleteValue(const char* section, const char* key) override; + void ClearSection(const char* section) override; + + std::vector GetStringList(const char* section, const char* key) const override; + void SetStringList(const char* section, const char* key, const std::vector& items) override; + bool RemoveFromStringList(const char* section, const char* key, const char* item) override; + bool AddToStringList(const char* section, const char* key, const char* item) override; + + // default parameter overloads + using SettingsInterface::GetBoolValue; + using SettingsInterface::GetDoubleValue; + using SettingsInterface::GetFloatValue; + using SettingsInterface::GetIntValue; + using SettingsInterface::GetStringValue; + using SettingsInterface::GetUIntValue; private: - using KeyMap = UnorderedStringMultimap; - using SectionMap = UnorderedStringMap; + using KeyMap = PreferUnorderedStringMultimap; + using SectionMap = PreferUnorderedStringMap; - void SetValue(const char* section, const char* key, std::string value); + void SetValue(const char* section, const char* key, std::string value); - SectionMap m_sections; -}; \ No newline at end of file + SectionMap m_sections; +}; diff --git a/src/core/bus.cpp b/src/core/bus.cpp index 86b38ee2e..18e0972ed 100644 --- a/src/core/bus.cpp +++ b/src/core/bus.cpp @@ -1558,6 +1558,8 @@ static constexpr std::array GetHardwareRegisterHandlerTable() ret[i] = UnmappedWriteHandler; } +#if 0 + // Verifies no region has >1 handler, but doesn't compile on older GCC. #define SET(raddr, rsize, read_handler, write_handler) \ static_assert(raddr >= 0x1F801000 && (raddr + rsize) <= 0x1F802000); \ for (u32 taddr = raddr; taddr < (raddr + rsize); taddr += 16) \ @@ -1568,6 +1570,18 @@ static constexpr std::array GetHardwareRegisterHandlerTable() else \ ret[i] = (ret[i] == UnmappedWriteHandler) ? write_handler : (abort(), write_handler); \ } +#else +#define SET(raddr, rsize, read_handler, write_handler) \ + static_assert(raddr >= 0x1F801000 && (raddr + rsize) <= 0x1F802000); \ + for (u32 taddr = raddr; taddr < (raddr + rsize); taddr += 16) \ + { \ + const u32 i = (taddr >> 4) & 0xFFu; \ + if constexpr (type == MemoryAccessType::Read) \ + ret[i] = read_handler; \ + else \ + ret[i] = write_handler; \ + } +#endif SET(MEMCTRL_BASE, MEMCTRL_SIZE, MemCtrlRead, MemCtrlWrite); SET(PAD_BASE, PAD_SIZE, PADRead, PADWrite); diff --git a/src/core/game_database.cpp b/src/core/game_database.cpp index 6ec4d6584..c82437b1a 100644 --- a/src/core/game_database.cpp +++ b/src/core/game_database.cpp @@ -75,7 +75,7 @@ static bool s_loaded = false; static bool s_track_hashes_loaded = false; static std::vector s_entries; -static UnorderedStringMap s_code_lookup; +static PreferUnorderedStringMap s_code_lookup; static TrackHashesMap s_track_hashes_map; } // namespace GameDatabase diff --git a/src/core/game_list.cpp b/src/core/game_list.cpp index 3c70e0267..25ab7f7eb 100644 --- a/src/core/game_list.cpp +++ b/src/core/game_list.cpp @@ -54,8 +54,8 @@ struct PlayedTimeEntry std::time_t total_played_time; }; -using CacheMap = UnorderedStringMap; -using PlayedTimeMap = UnorderedStringMap; +using CacheMap = PreferUnorderedStringMap; +using PlayedTimeMap = PreferUnorderedStringMap; static_assert(std::is_same_v); diff --git a/src/util/host.cpp b/src/util/host.cpp index 617723704..053a4d0f6 100644 --- a/src/util/host.cpp +++ b/src/util/host.cpp @@ -18,8 +18,8 @@ static std::pair LookupTranslationString(const std::string_vie const std::string_view& msg); static constexpr u32 TRANSLATION_STRING_CACHE_SIZE = 4 * 1024 * 1024; -using TranslationStringMap = UnorderedStringMap>; -using TranslationStringContextMap = UnorderedStringMap; +using TranslationStringMap = PreferUnorderedStringMap>; +using TranslationStringContextMap = PreferUnorderedStringMap; static std::shared_mutex s_translation_string_mutex; static TranslationStringContextMap s_translation_string_map; static std::vector s_translation_string_cache;