From 2e256752967a271a860956875020b7d492d7923d Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sun, 2 May 2021 21:24:35 +0200 Subject: [PATCH] MacOS < 10.13 has an issue with std::get, use std::get_if instead --- src/lib/formats/fs_oric_jasmin.cpp | 8 ++++---- src/lib/formats/fs_prodos.cpp | 8 ++++---- src/lib/formats/fsmgr.cpp | 8 ++++---- src/lib/formats/fsmgr.h | 19 ++++++++++++++++++- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/lib/formats/fs_oric_jasmin.cpp b/src/lib/formats/fs_oric_jasmin.cpp index 8cb6444aa9c..3f4e0b04e14 100644 --- a/src/lib/formats/fs_oric_jasmin.cpp +++ b/src/lib/formats/fs_oric_jasmin.cpp @@ -70,7 +70,7 @@ bool fs_oric_jasmin::can_write() const std::vector fs_oric_jasmin::volume_meta_description() const { std::vector res; - res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "UNTITLED", false, [](const fs_meta &m) { std::string n = std::get(m); return n.size() <= 8; }, "Volume name, up to 8 characters")); + res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "UNTITLED", false, [](const fs_meta &m) { return m.as_string().size() <= 8; }, "Volume name, up to 8 characters")); return res; } @@ -99,8 +99,8 @@ bool fs_oric_jasmin::validate_filename(std::string name) std::vector fs_oric_jasmin::file_meta_description() const { std::vector res; - res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "", false, [](const fs_meta &m) { std::string n = std::get(m); return validate_filename(n); }, "File name, 8.3")); - res.emplace_back(fs_meta_description(fs_meta_name::loading_address, fs_meta_type::number, 0x501, false, [](const fs_meta &m) { uint64_t n = std::get(m); return n < 0x10000; }, "Loading address of the file")); + res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "", false, [](const fs_meta &m) { return validate_filename(m.as_string()); }, "File name, 8.3")); + res.emplace_back(fs_meta_description(fs_meta_name::loading_address, fs_meta_type::number, 0x501, false, [](const fs_meta &m) { return m.as_number() < 0x10000; }, "Loading address of the file")); res.emplace_back(fs_meta_description(fs_meta_name::length, fs_meta_type::number, 0, true, nullptr, "Size of the file in bytes")); res.emplace_back(fs_meta_description(fs_meta_name::size_in_blocks, fs_meta_type::number, 0, true, nullptr, "Number of blocks used by the file")); res.emplace_back(fs_meta_description(fs_meta_name::locked, fs_meta_type::flag, false, false, nullptr, "File locked")); @@ -111,7 +111,7 @@ std::vector fs_oric_jasmin::file_meta_description() const void fs_oric_jasmin::impl::format(const fs_meta_data &meta) { - std::string volume_name = std::get(meta.find(fs_meta_name::name)->second); + std::string volume_name = meta.find(fs_meta_name::name)->second.as_string(); u32 blocks = m_blockdev.block_count(); m_blockdev.fill(0x6c); diff --git a/src/lib/formats/fs_prodos.cpp b/src/lib/formats/fs_prodos.cpp index 7089a1a6d3c..f6923e587c8 100644 --- a/src/lib/formats/fs_prodos.cpp +++ b/src/lib/formats/fs_prodos.cpp @@ -78,9 +78,9 @@ char fs_prodos::directory_separator() const std::vector fs_prodos::volume_meta_description() const { std::vector res; - res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "UNTITLED", false, [](const fs_meta &m) { std::string n = std::get(m); return n.size() <= 15; }, "Volume name, up to 15 characters")); - res.emplace_back(fs_meta_description(fs_meta_name::os_version, fs_meta_type::number, 5, false, [](const fs_meta &m) { return std::get(m) <= 255; }, "Creator OS version")); - res.emplace_back(fs_meta_description(fs_meta_name::os_minimum_version, fs_meta_type::number, 5, false, [](const fs_meta &m) { return std::get(m) <= 255; }, "Minimum OS version")); + res.emplace_back(fs_meta_description(fs_meta_name::name, fs_meta_type::string, "UNTITLED", false, [](const fs_meta &m) { return m.as_string().size() <= 15; }, "Volume name, up to 15 characters")); + res.emplace_back(fs_meta_description(fs_meta_name::os_version, fs_meta_type::number, 5, false, [](const fs_meta &m) { return m.as_number() <= 255; }, "Creator OS version")); + res.emplace_back(fs_meta_description(fs_meta_name::os_minimum_version, fs_meta_type::number, 5, false, [](const fs_meta &m) { return m.as_number() <= 255; }, "Minimum OS version")); auto now = util::arbitrary_datetime::now(); res.emplace_back(fs_meta_description(fs_meta_name::creation_date, fs_meta_type::date, now, false, nullptr, "Creation time")); @@ -102,7 +102,7 @@ std::vector fs_prodos::directory_meta_description() const void fs_prodos::impl::format(const fs_meta_data &meta) { - std::string volume_name = std::get(meta.find(fs_meta_name::name)->second); + std::string volume_name = meta.find(fs_meta_name::name)->second.as_string(); u32 blocks = m_blockdev.block_count(); // Maximum usable partition size = 32M - 512 bytes (65535 blocks) diff --git a/src/lib/formats/fsmgr.cpp b/src/lib/formats/fsmgr.cpp index 2bad6c00636..2f49c3cbed9 100644 --- a/src/lib/formats/fsmgr.cpp +++ b/src/lib/formats/fsmgr.cpp @@ -279,11 +279,11 @@ const char *fs_meta_get_name(fs_meta_name name) std::string fs_meta_to_string(fs_meta_type type, const fs_meta &m) { switch(type) { - case fs_meta_type::string: return std::get(m); - case fs_meta_type::number: return util::string_format("0x%x", std::get(m)); - case fs_meta_type::flag: return std::get(m) ? "t" : "f"; + case fs_meta_type::string: return m.as_string(); + case fs_meta_type::number: return util::string_format("0x%x", m.as_number()); + case fs_meta_type::flag: return m.as_flag() ? "t" : "f"; case fs_meta_type::date: { - auto dt = std::get(m); + auto dt = m.as_date(); return util::string_format("%04d-%02d-%02d %02d:%02d:%02d", dt.year, dt.month, dt.day_of_month, dt.hour, dt.minute, dt.second); diff --git a/src/lib/formats/fsmgr.h b/src/lib/formats/fsmgr.h index 5dc328eb817..f0c4ba13539 100644 --- a/src/lib/formats/fsmgr.h +++ b/src/lib/formats/fsmgr.h @@ -40,7 +40,24 @@ enum class fs_dir_entry_type { system_file, }; -using fs_meta = std::variant; +class fs_meta { +public: + fs_meta() { value = false; } + fs_meta(std::string str) { value = str; } + fs_meta(bool b) { value = b; } + fs_meta(uint64_t num) { value = num; } + fs_meta(int64_t num) { value = uint64_t(num); } + fs_meta(util::arbitrary_datetime dt) { value = dt; } + + util::arbitrary_datetime as_date() const { return *std::get_if(&value); } + bool as_flag() const { return *std::get_if(&value); } + uint64_t as_number() const { return *std::get_if(&value); } + std::string as_string() const { return *std::get_if(&value); } + +private: + std::variant value; +}; + using fs_meta_data = std::unordered_map; const char *fs_meta_get_name(fs_meta_name name);