summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats
diff options
context:
space:
mode:
author npwoods <npwoods@mess.org>2022-04-14 03:38:39 -0400
committer GitHub <noreply@github.com>2022-04-14 09:38:39 +0200
commit539c1350789f3462e917a691e316efba7600d0b2 (patch)
treeda88e7b796fe277d326046094642a6f08ccdafa7 /src/lib/formats
parente0e3cb74310372aa85386b1f481af1f850a5ba36 (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.cpp49
-rw-r--r--src/lib/formats/fsmeta.h1
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);