diff options
author | David Marcec <[email protected]> | 2020-08-03 20:39:19 +1000 |
---|---|---|
committer | David Marcec <[email protected]> | 2020-08-03 21:31:27 +1000 |
commit | 6cfff2c3f6487a45561ee49617141159745cd6eb (patch) | |
tree | bd8b164e222c909c2dc8b6942629d4d7015721fa /src/core/loader/loader.cpp | |
parent | 9b75481755c8d566bc666465d659115bba2b2578 (diff) | |
download | yuzu-android-6cfff2c3f6487a45561ee49617141159745cd6eb.tar.gz yuzu-android-6cfff2c3f6487a45561ee49617141159745cd6eb.zip |
loader: Make IdentifyFile typesafe
Relies on #4465 for concept.h Common::IsBaseOf
Diffstat (limited to 'src/core/loader/loader.cpp')
-rw-r--r-- | src/core/loader/loader.cpp | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index 59ca7091a..c4905550a 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -3,8 +3,10 @@ // Refer to the license.txt file included. #include <memory> +#include <optional> #include <ostream> #include <string> +#include "common/concepts.h" #include "common/file_util.h" #include "common/logging/log.h" #include "common/string_util.h" @@ -21,27 +23,37 @@ namespace Loader { -FileType IdentifyFile(FileSys::VirtualFile file) { - FileType type; - -#define CHECK_TYPE(loader) \ - type = AppLoader_##loader::IdentifyType(file); \ - if (FileType::Error != type) \ - return type; - - CHECK_TYPE(DeconstructedRomDirectory) - CHECK_TYPE(ELF) - CHECK_TYPE(NSO) - CHECK_TYPE(NRO) - CHECK_TYPE(NCA) - CHECK_TYPE(XCI) - CHECK_TYPE(NAX) - CHECK_TYPE(NSP) - CHECK_TYPE(KIP) - -#undef CHECK_TYPE +template <Common::IsBaseOf<AppLoader> T> +std::optional<FileType> IdentifyFileLoader(FileSys::VirtualFile file) { + const auto file_type = T::IdentifyType(file); + if (file_type != FileType::Error) { + return file_type; + } + return std::nullopt; +} - return FileType::Unknown; +FileType IdentifyFile(FileSys::VirtualFile file) { + if (const auto romdir_type = IdentifyFileLoader<AppLoader_DeconstructedRomDirectory>(file)) { + return *romdir_type; + } else if (const auto elf_type = IdentifyFileLoader<AppLoader_ELF>(file)) { + return *elf_type; + } else if (const auto nso_type = IdentifyFileLoader<AppLoader_NSO>(file)) { + return *nso_type; + } else if (const auto nro_type = IdentifyFileLoader<AppLoader_NRO>(file)) { + return *nro_type; + } else if (const auto nca_type = IdentifyFileLoader<AppLoader_NCA>(file)) { + return *nca_type; + } else if (const auto xci_type = IdentifyFileLoader<AppLoader_XCI>(file)) { + return *xci_type; + } else if (const auto nax_type = IdentifyFileLoader<AppLoader_NAX>(file)) { + return *nax_type; + } else if (const auto nsp_type = IdentifyFileLoader<AppLoader_NSP>(file)) { + return *nsp_type; + } else if (const auto kip_type = IdentifyFileLoader<AppLoader_KIP>(file)) { + return *kip_type; + } else { + return FileType::Unknown; + } } FileType GuessFromFilename(const std::string& name) { |