summaryrefslogtreecommitdiff
path: root/src/helpers/math/Expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/math/Expression.cpp')
-rw-r--r--src/helpers/math/Expression.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/helpers/math/Expression.cpp b/src/helpers/math/Expression.cpp
index 3c0bee91..2289b85e 100644
--- a/src/helpers/math/Expression.cpp
+++ b/src/helpers/math/Expression.cpp
@@ -2,8 +2,50 @@
#include "muParser.h"
#include "../../debug/log/Logger.hpp"
+#include <cctype>
+#include <format>
+
using namespace Math;
+static std::string_view trimExprView(std::string_view s) {
+ while (!s.empty() && std::isspace(static_cast<unsigned char>(s.front())))
+ s.remove_prefix(1);
+
+ while (!s.empty() && std::isspace(static_cast<unsigned char>(s.back())))
+ s.remove_suffix(1);
+
+ return s;
+}
+
+bool SExpressionVec2::empty() const {
+ return x.empty() || y.empty();
+}
+
+std::string SExpressionVec2::toString() const {
+ if (empty())
+ return "";
+
+ return std::format("{} {}", x, y);
+}
+
+std::expected<SExpressionVec2, std::string> Math::parseExpressionVec2(std::string_view raw) {
+ raw = trimExprView(raw);
+ if (raw.empty())
+ return SExpressionVec2{};
+
+ const auto spacePos = raw.find_first_of(" \t\n\r\f\v");
+ if (spacePos == std::string_view::npos)
+ return std::unexpected("expression vec2 requires two expressions separated by whitespace");
+
+ auto lhs = trimExprView(raw.substr(0, spacePos));
+ auto rhs = trimExprView(raw.substr(spacePos + 1));
+
+ if (lhs.empty() || rhs.empty())
+ return std::unexpected("expression vec2 requires two non-empty expressions");
+
+ return SExpressionVec2{std::string{lhs}, std::string{rhs}};
+}
+
CExpression::CExpression() : m_parser(makeUnique<mu::Parser>()) {
;
}