diff options
author | npwoods <npwoods@mess.org> | 2022-04-14 03:38:39 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-14 09:38:39 +0200 |
commit | 539c1350789f3462e917a691e316efba7600d0b2 (patch) | |
tree | da88e7b796fe277d326046094642a6f08ccdafa7 /src/lib/formats | |
parent | e0e3cb74310372aa85386b1f481af1f850a5ba36 (diff) |
Added a 'type()' accessor to fs::meta_value (#9553)
* Added a 'type()' accessor to fs::meta_value
Let's try to hide the nastiness of std::visit() as much as humanly possible
* Changing visitor approach for std::visit() call in fs::meta_value::type()
Diffstat (limited to 'src/lib/formats')
-rw-r--r-- | src/lib/formats/fsmeta.cpp | 49 | ||||
-rw-r--r-- | src/lib/formats/fsmeta.h | 1 |
2 files changed, 34 insertions, 16 deletions
diff --git a/src/lib/formats/fsmeta.cpp b/src/lib/formats/fsmeta.cpp index 9c7143301ce..681d644f18e 100644 --- a/src/lib/formats/fsmeta.cpp +++ b/src/lib/formats/fsmeta.cpp @@ -7,6 +7,8 @@ #include "strformat.h" +#include <optional> + namespace fs { const char *meta_data::entry_name(meta_name name) @@ -32,33 +34,48 @@ const char *meta_data::entry_name(meta_name name) return ""; } +template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; +template<class... Ts> overloaded(Ts...)->overloaded<Ts...>; + +meta_type meta_value::type() const +{ + std::optional<meta_type> result; + std::visit(overloaded + { + [&result](const std::string &) { result = meta_type::string; }, + [&result](std::uint64_t) { result = meta_type::number; }, + [&result](bool) { result = meta_type::flag; }, + [&result](const util::arbitrary_datetime &) { result = meta_type::date; } + }, value); + return *result; +} + std::string meta_value::to_string() const { std::string result; - std::visit([this, &result](auto &&arg) + switch (type()) { - using T = std::decay_t<decltype(arg)>; - if constexpr (std::is_same_v<T, std::string>) - { - result = as_string(); - } - else if constexpr (std::is_same_v<T, uint64_t>) - { - result = util::string_format("0x%x", as_number()); - } - else if constexpr (std::is_same_v<T, bool>) - { - result = as_flag() ? "t" : "f"; - } - else if constexpr (std::is_same_v<T, util::arbitrary_datetime>) + case meta_type::string: + result = as_string(); + break; + case meta_type::number: + result = util::string_format("0x%x", as_number()); + break; + case meta_type::flag: + result = as_flag() ? "t" : "f"; + break; + case meta_type::date: { auto dt = as_date(); result = util::string_format("%04d-%02d-%02d %02d:%02d:%02d", dt.year, dt.month, dt.day_of_month, dt.hour, dt.minute, dt.second); } - }, value); + break; + default: + throw false; + } return result; } diff --git a/src/lib/formats/fsmeta.h b/src/lib/formats/fsmeta.h index 01cc30eb7d7..84498ea8e1e 100644 --- a/src/lib/formats/fsmeta.h +++ b/src/lib/formats/fsmeta.h @@ -47,6 +47,7 @@ enum class meta_type { class meta_value { public: + meta_type type() const; std::string to_string() const; static meta_value from_string(meta_type type, std::string value); |