diff options
| author | lizzie <lizzie@eden-emu.dev> | 2026-02-21 18:38:32 +0100 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-02-21 18:38:32 +0100 |
| commit | bfc720152a389c8110c814f600125ccf480075ac (patch) | |
| tree | e94ace96c18ece6dfd4238c84bd9c16449e4a8ea /src/core/file_sys/registered_cache.h | |
| parent | b6238d6df76ecbef12f295ee0ef702e18542f109 (diff) | |
[vfs] remove usage of 'dynamic_cast', use ankerl::map for files (#3594)
Do I need to writeout everything wrong with `dynamic_cast`?
Also the usual std::map -> `ankerl::unordered_dense::map` conversion, seems to work just fine - but of course test that updates/DLCs/mods/cheats/etc are still being applied :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3594
Reviewed-by: DraVee <dravee@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/core/file_sys/registered_cache.h')
| -rw-r--r-- | src/core/file_sys/registered_cache.h | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index 04e231f453..2e39f74db8 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h @@ -11,19 +11,19 @@ #include <memory> #include <string> #include <vector> +#include <ankerl/unordered_dense.h> #include <boost/container/flat_map.hpp> #include "common/common_types.h" #include "core/crypto/key_manager.h" #include "core/file_sys/vfs/vfs.h" +#include "core/file_sys/nca_metadata.h" namespace FileSys { - class ExternalContentProvider; - class CNMT; +class ExternalContentProvider; +class CNMT; class NCA; class NSP; class XCI; - -enum class ContentRecordType : u8; enum class NCAContentType : u8; enum class TitleType : u8; @@ -56,7 +56,7 @@ struct ExternalUpdateEntry { u64 title_id; u32 version; std::string version_string; - std::map<ContentRecordType, VirtualFile> files; + std::array<VirtualFile, size_t(ContentRecordType::Count)> files; }; constexpr u64 GetUpdateTitleID(u64 base_title_id) { @@ -207,11 +207,11 @@ private: ContentProviderParsingFunction parser; // maps tid -> NcaID of meta - std::map<u64, NcaID> meta_id; + ankerl::unordered_dense::map<u64, NcaID> meta_id; // maps tid -> meta - std::map<u64, CNMT> meta; + ankerl::unordered_dense::map<u64, CNMT> meta; // maps tid -> meta for CNMT in yuzu_meta - std::map<u64, CNMT> yuzu_meta; + ankerl::unordered_dense::map<u64, CNMT> yuzu_meta; }; enum class ContentProviderUnionSlot { @@ -220,6 +220,7 @@ enum class ContentProviderUnionSlot { SDMC, ///< SD Card FrontendManual, ///< Frontend-defined game list or similar External, ///< External content from NSP/XCI files in configured directories + Count, }; // Combines multiple ContentProvider(s) (i.e. SysNAND, UserNAND, SDMC) into one interface. @@ -228,8 +229,6 @@ public: ~ContentProviderUnion() override; void SetSlot(ContentProviderUnionSlot slot, ContentProvider* provider); - void ClearSlot(ContentProviderUnionSlot slot); - void Refresh() override; bool HasEntry(u64 title_id, ContentRecordType type) const override; std::optional<u32> GetEntryVersion(u64 title_id) const override; @@ -241,18 +240,18 @@ public: std::optional<u64> title_id) const override; const ExternalContentProvider* GetExternalProvider() const; - const ContentProvider* GetSlotProvider(ContentProviderUnionSlot slot) const; + [[nodiscard]] inline const ContentProvider* GetSlotProvider(ContentProviderUnionSlot slot) const { + return providers[size_t(slot)]; + } std::vector<std::pair<ContentProviderUnionSlot, ContentProviderEntry>> ListEntriesFilterOrigin( std::optional<ContentProviderUnionSlot> origin = {}, std::optional<TitleType> title_type = {}, std::optional<ContentRecordType> record_type = {}, std::optional<u64> title_id = {}) const; - std::optional<ContentProviderUnionSlot> GetSlotForEntry(u64 title_id, - ContentRecordType type) const; - + std::optional<ContentProviderUnionSlot> GetSlotForEntry(u64 title_id, ContentRecordType type) const; private: - std::map<ContentProviderUnionSlot, ContentProvider*> providers; + std::array<ContentProvider*, size_t(ContentProviderUnionSlot::Count)> providers; }; class ManualContentProvider : public ContentProvider { @@ -312,8 +311,8 @@ private: void ProcessXCI(const VirtualFile& file); std::vector<VirtualDir> load_dirs; - std::map<std::tuple<u64, ContentRecordType, TitleType>, VirtualFile> entries; - std::map<u64, u32> versions; + ankerl::unordered_dense::map<std::tuple<u64, ContentRecordType, TitleType>, VirtualFile> entries; + ankerl::unordered_dense::map<u64, u32> versions; std::vector<ExternalUpdateEntry> multi_version_entries; }; |
