diff --git a/source/core/StarLexicalCast.cpp b/source/core/StarLexicalCast.cpp index 1387b2e..e607ee5 100644 --- a/source/core/StarLexicalCast.cpp +++ b/source/core/StarLexicalCast.cpp @@ -10,4 +10,27 @@ void throwLexicalCastError(std::errc ec, const char* first, const char* last) { throw BadLexicalCast(strf("Lexical cast failed on '{}'", str)); } +template <> +bool tryLexicalCast(bool& result, const char* first, const char* last) { + size_t len = last - first; + if (strncmp(first, "true", len) == 0) + result = true; + else if (strncmp(first, "false", len) != 0) + return false; + + result = false; + return true; +} + +template <> +bool lexicalCast(const char* first, const char* last) { + size_t len = last - first; + if (strncmp(first, "true", len) == 0) + return true; + else if (strncmp(first, "false", len) != 0) + throwLexicalCastError(std::errc(), first, last); + + return false; +} + } \ No newline at end of file diff --git a/source/core/StarLexicalCast.hpp b/source/core/StarLexicalCast.hpp index 13c0521..15afe3f 100644 --- a/source/core/StarLexicalCast.hpp +++ b/source/core/StarLexicalCast.hpp @@ -19,6 +19,9 @@ bool tryLexicalCast(Type& result, const char* first, const char* last) { return res.ptr == last && (res.ec == std::errc() || res.ec == std::errc::result_out_of_range); } +template <> +bool tryLexicalCast(bool& result, const char* first, const char* last); + template bool tryLexicalCast(Type& result, String const& s) { return tryLexicalCast(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size()); @@ -43,7 +46,6 @@ Maybe maybeLexicalCast(StringView s) { return maybeLexicalCast(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size()); } - template Type lexicalCast(const char* first, const char* last) { Type result{}; @@ -54,6 +56,9 @@ Type lexicalCast(const char* first, const char* last) { return result; } +template <> +bool lexicalCast(const char* first, const char* last); + template Type lexicalCast(StringView s) { return lexicalCast(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size());