From 3429622d754a87ecca98b3fbde994f24e40d34b4 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 20 Apr 2020 20:10:25 +0300 Subject: Rewrite configuration tests in catch2 - Drop s_conf check in operator<< as s_conf cannot be nullptr there - Add arithmetic type cast to string values --- lib/configuration/configuration.h | 54 ++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 18 deletions(-) (limited to 'lib/configuration/configuration.h') diff --git a/lib/configuration/configuration.h b/lib/configuration/configuration.h index 3d0a49d..9816ab7 100644 --- a/lib/configuration/configuration.h +++ b/lib/configuration/configuration.h @@ -17,7 +17,6 @@ #include #include #include -#include #if defined(__clang__) #define consumable(X) [[clang::consumable(X)]] @@ -41,9 +40,14 @@ class consumable(unconsumed) Configuration : private std::unordered_map> l) noexcept; - return_typestate(unconsumed) explicit Configuration(Configuration && other param_typestate(unconsumed)) = default; + return_typestate(unconsumed) Configuration(); + return_typestate(unconsumed) Configuration(std::initializer_list> l) noexcept; + + return_typestate(unconsumed) Configuration(const Configuration &other param_typestate(unconsumed)) = default; + Configuration &operator=(const Configuration &) = delete; + + return_typestate(unconsumed) Configuration(Configuration && other param_typestate(unconsumed)) = default; + Configuration &operator=(Configuration &&) = delete; ~Configuration() = default; @@ -53,11 +57,13 @@ public: template callable_when(unconsumed) [[nodiscard]] std::optional value(const char *path) const { - if(use_global) + if(use_global) { return instance()->value(path); + } - if(count(path) == 0) + if(count(path) == 0) { return std::nullopt; + } return std::get(at(path)); } @@ -65,8 +71,9 @@ public: template callable_when(unconsumed) [[nodiscard]] std::optional value(const char *path) const { - if(use_global) + if(use_global) { return instance()->value(path); + } if(this->count(path) == 0) { return std::nullopt; @@ -76,35 +83,46 @@ public: const auto value = at(path); if(std::holds_alternative(value)) { - if constexpr(std::is_arithmetic::value) + if constexpr(std::is_arithmetic::value) { return static_cast(std::get(value)); - else if constexpr(std::is_constructible::value) + } else if constexpr(std::is_constructible::value) { return T{ std::to_string(std::get(value)) }; + } } else if(std::holds_alternative(value)) { - if constexpr(std::is_constructible::value) + if constexpr(std::is_constructible::value) { return std::get(value); - else if constexpr(std::is_constructible::value) { - if(std::get(value)) - return T{ "true" }; - else - return T{ "false" }; + } else if constexpr(std::is_constructible::value) { + return std::get(value) ? T{ "true" } : T{ "false" }; } } else if(std::holds_alternative(value)) { auto str = std::get(value); - if(str.front() == '~') + + try { + if constexpr(std::is_floating_point::value) { + return static_cast(std::stod(str)); + } else if constexpr(std::is_arithmetic::value) { + return static_cast(std::stol(str)); + } + } catch(std::invalid_argument &) { + return std::nullopt; + } + + if(str.front() == '~') { str.replace(0, 1, m_homePath); + } - if constexpr(std::is_constructible::value) + if constexpr(std::is_constructible::value) { return T{ str }; + } } return std::nullopt; } template - callable_when(unconsumed) T &shortcut(T &, const char *) const + callable_when(unconsumed) T &shortcut(T & /* unused */, const char * /* unused */) const { return T{}; } -- cgit v1.2.1