diff options
author | Olivier Galibert <galibert@pobox.com> | 2021-05-02 21:24:35 +0200 |
---|---|---|
committer | Olivier Galibert <galibert@pobox.com> | 2021-05-02 21:24:45 +0200 |
commit | 2e256752967a271a860956875020b7d492d7923d (patch) | |
tree | cd0d7cd9a6f95c35f1331ea52bb14463a7a00830 | |
parent | ba6e0b72a7908309ce8c428ddbe59bf1f5f1ac52 (diff) |
MacOS < 10.13 has an issue with std::get, use std::get_if instead
-rw-r--r-- | src/lib/formats/fs_oric_jasmin.cpp | 8 | ||||
-rw-r--r-- | src/lib/formats/fs_prodos.cpp | 8 | ||||
-rw-r--r-- | src/lib/formats/fsmgr.cpp | 8 | ||||
-rw-r--r-- | 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_meta_description> fs_oric_jasmin::volume_meta_description() const { std::vector<fs_meta_description> 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<std::string>(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_meta_description> fs_oric_jasmin::file_meta_description() const { std::vector<fs_meta_description> 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<std::string>(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<uint64_t>(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_meta_description> fs_oric_jasmin::file_meta_description() const void fs_oric_jasmin::impl::format(const fs_meta_data &meta) { - std::string volume_name = std::get<std::string>(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_meta_description> fs_prodos::volume_meta_description() const { std::vector<fs_meta_description> 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<std::string>(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<uint64_t>(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<uint64_t>(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_meta_description> fs_prodos::directory_meta_description() const void fs_prodos::impl::format(const fs_meta_data &meta) { - std::string volume_name = std::get<std::string>(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<std::string>(m); - case fs_meta_type::number: return util::string_format("0x%x", std::get<uint64_t>(m)); - case fs_meta_type::flag: return std::get<bool>(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<util::arbitrary_datetime>(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<std::string, uint64_t, bool, util::arbitrary_datetime>; +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<util::arbitrary_datetime>(&value); } + bool as_flag() const { return *std::get_if<bool>(&value); } + uint64_t as_number() const { return *std::get_if<uint64_t>(&value); } + std::string as_string() const { return *std::get_if<std::string>(&value); } + +private: + std::variant<std::string, uint64_t, bool, util::arbitrary_datetime> value; +}; + using fs_meta_data = std::unordered_map<fs_meta_name, fs_meta>; const char *fs_meta_get_name(fs_meta_name name); |