From 49791c4fd0f56f85eefb44fbed876901045db428 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Wed, 4 Dec 2024 01:08:53 +0100 Subject: [PATCH] Added toNumber() variants for floating-point types. --- source/mijin/util/string.hpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/source/mijin/util/string.hpp b/source/mijin/util/string.hpp index 76a3a60..d830af5 100644 --- a/source/mijin/util/string.hpp +++ b/source/mijin/util/string.hpp @@ -329,7 +329,7 @@ constexpr auto toUpper(TArgs&&... args) } -template +template [[nodiscard]] constexpr bool toNumber(std::string_view stringView, TNumber& outNumber, int base = 10) MIJIN_NOEXCEPT { @@ -339,7 +339,7 @@ constexpr bool toNumber(std::string_view stringView, TNumber& outNumber, int bas return res.ec == std::errc{} && res.ptr == end; } -template +template [[nodiscard]] constexpr bool toNumber(std::basic_string_view stringView, TNumber& outNumber, int base = 10) MIJIN_NOEXCEPT requires (!std::is_same_v) { @@ -350,6 +350,27 @@ constexpr bool toNumber(std::basic_string_view stringView, TNumb return toNumber(asString, outNumber, base); } +template +[[nodiscard]] +constexpr bool toNumber(std::string_view stringView, TNumber& outNumber, std::chars_format fmt = std::chars_format::general) MIJIN_NOEXCEPT +{ + const char* start = &*stringView.begin(); + const char* end = start + stringView.size(); + const std::from_chars_result res = std::from_chars(start, end, outNumber, fmt); + return res.ec == std::errc{} && res.ptr == end; +} + +template +[[nodiscard]] +constexpr bool toNumber(std::basic_string_view stringView, TNumber& outNumber, std::chars_format fmt = std::chars_format::general) MIJIN_NOEXCEPT requires (!std::is_same_v) +{ + std::string asString; + asString.resize(stringView.size()); + // should only contain number symbols, so just cast down to char + std::transform(stringView.begin(), stringView.end(), asString.begin(), [](TChar chr) { return static_cast(chr); }); + return toNumber(asString, outNumber, fmt); +} + template [[nodiscard]] constexpr bool isDecimalChar(TChar chr) noexcept