Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/core/StarLexicalCast.cpp23
-rw-r--r--source/core/StarLexicalCast.hpp7
2 files changed, 29 insertions, 1 deletions
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 <typename Type>
bool tryLexicalCast(Type& result, String const& s) {
return tryLexicalCast<Type>(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size());
@@ -43,7 +46,6 @@ Maybe<Type> maybeLexicalCast(StringView s) {
return maybeLexicalCast<Type>(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size());
}
-
template <typename Type>
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 <typename Type>
Type lexicalCast(StringView s) {
return lexicalCast<Type>(s.utf8Ptr(), s.utf8Ptr() + s.utf8Size());