From 7dcad74d144879f4cce790067de1c164df9bd697 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 29 Jul 2023 20:21:00 +0100 Subject: Simplified convert interface Removes need to scope temps, boost lexical_cast catch/throw, two functions --- icespider/core/util.h | 70 +++++++++++++---------------------- icespider/core/xwwwFormUrlEncoded.cpp | 2 +- 2 files changed, 27 insertions(+), 45 deletions(-) diff --git a/icespider/core/util.h b/icespider/core/util.h index d31c7da..f4868c3 100644 --- a/icespider/core/util.h +++ b/icespider/core/util.h @@ -121,61 +121,43 @@ private: namespace IceSpider { [[noreturn]] DLL_PUBLIC void conversion_failure(); - static_assert(std::is_constructible_v); - static_assert(std::is_convertible_v); - - template - inline T - from_chars(const std::string_view v, T && out) - { - if (std::from_chars(v.begin(), v.end(), out).ec != std::errc {}) { - conversion_failure(); - } - return out; - } - - template - inline T - lexical_cast(const std::string_view v) - { - try { - return boost::lexical_cast(v); - } - catch (const boost::bad_lexical_cast & e) { - conversion_failure(); + static_assert(std::is_assignable_v); + static_assert(std::is_assignable_v); + + namespace { + template + inline T + from_chars(const std::string_view v, T && out) + { + if (std::from_chars(v.begin(), v.end(), out).ec != std::errc {}) { + conversion_failure(); + } + return out; } - } - template - inline void - convert(const std::string_view v, T & out) - { - if constexpr (std::is_assignable_v) { - out = v; - } - if constexpr (requires { std::from_chars(v.begin(), v.end(), out); }) { - from_chars(v, out); - } - else { - out = lexical_cast(v); + template + inline T + lexical_cast(const std::string_view v, T && out) + { + if (!boost::conversion::try_lexical_convert(v, out)) { + conversion_failure(); + } + return out; } } template inline T - convert(const std::string_view v) + convert(const std::string_view v, T && out = {}) { - if constexpr (std::is_convertible_v) { - return v; - } - else if constexpr (std::is_constructible_v) { - return T {v}; + if constexpr (std::is_assignable_v) { + return (out = v); } - else if constexpr (requires(T out) { std::from_chars(v.begin(), v.end(), out); }) { - return from_chars(v, {}); + else if constexpr (requires { std::from_chars(v.begin(), v.end(), out); }) { + return from_chars(v, out); } else { - return lexical_cast(v); + return lexical_cast(v, out); } } diff --git a/icespider/core/xwwwFormUrlEncoded.cpp b/icespider/core/xwwwFormUrlEncoded.cpp index 639b07a..d5b8388 100644 --- a/icespider/core/xwwwFormUrlEncoded.cpp +++ b/icespider/core/xwwwFormUrlEncoded.cpp @@ -181,7 +181,7 @@ namespace IceSpider { /* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \ void set(T & t) const override \ { \ - convert(s, t); \ + convert(s, t); \ } SET(Ice::Byte); -- cgit v1.2.3