From ba9a9199d01b0fdd4bf9a54914f8058bf71f30c5 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Thu, 17 Apr 2025 16:03:01 +0000
Subject: [PATCH] unary and binary operations

---
 src/Symbols/Value.hpp |  105 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 98 insertions(+), 7 deletions(-)

diff --git a/src/Symbols/Value.hpp b/src/Symbols/Value.hpp
index 4c52b04..a0ff38b 100644
--- a/src/Symbols/Value.hpp
+++ b/src/Symbols/Value.hpp
@@ -1,10 +1,13 @@
 #ifndef SYMBOL_VALUE_HPP
 #define SYMBOL_VALUE_HPP
 
+#include <algorithm>
 #include <iostream>
 #include <stdexcept>
 #include <string>
 #include <variant>
+
+#include "Symbols/VariableTypes.hpp"
 
 namespace Symbols {
 
@@ -14,23 +17,32 @@
 
     Value() = default;
 
-    Value(int v) : value_(v) {}
+    Value(int v) : value_(v) { type_ = Symbols::Variables::Type::INTEGER; }
 
-    Value(double v) : value_(v) {}
+    Value(double v) : value_(v) { type_ = Symbols::Variables::Type::DOUBLE; }
 
-    Value(float v) : value_(v) {}
+    Value(float v) : value_(v) { type_ = Symbols::Variables::Type::FLOAT; }
 
-    Value(const std::string & v) : value_(v) {}
+    Value(const std::string & v) : value_(v) { type_ = Symbols::Variables::Type::STRING; }
 
-    Value(const char * v) : value_(std::string(v)) {}
+    Value(const char * v) : value_(std::string(v)) { type_ = Symbols::Variables::Type::STRING; }
 
-    Value(bool v) : value_(v) {}
+    Value(bool v) : value_(v) { type_ = Symbols::Variables::Type::BOOLEAN; }
+
+    Value(const std::string & str, bool autoDetectType) { *this = fromString(str, autoDetectType); }
 
     const Variant & get() const { return value_; }
+
+    Symbols::Variables::Type getType() const { return type_; }
 
     Variant & get() { return value_; }
 
     template <typename T> T get() const { return std::get<T>(value_); }
+
+    static Symbols::Value makeNull() {
+        auto v = Value("null");
+        return v;
+    }
 
     // operator+
     friend Value operator+(const Value & lhs, const Value & rhs) {
@@ -68,8 +80,87 @@
 
     static std::string to_string(const Value & val) { return to_string(val.value_); }
 
+    static Value fromString(const std::string & str, bool autoDetectType) {
+        if (!autoDetectType) {
+            return fromStringToString(str);
+        }
+
+        std::string trimmed = str;
+        trimmed.erase(0, trimmed.find_first_not_of(" \t\n\r"));
+        trimmed.erase(trimmed.find_last_not_of(" \t\n\r") + 1);
+
+        // Check bool
+        std::string lower = trimmed;
+        std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
+        if (lower == "true" || lower == "false" || lower == "1" || lower == "0") {
+            try {
+                return fromStringToBool(trimmed);
+            } catch (...) {
+            }
+        }
+
+        // Check int
+        try {
+            size_t idx;
+            int    i = std::stoi(trimmed, &idx);
+            if (idx == trimmed.size()) {
+                return fromStringToInt(trimmed);
+            }
+        } catch (...) {
+        }
+
+        // Check double
+        try {
+            size_t idx;
+            double d = std::stod(trimmed, &idx);
+            if (idx == trimmed.size()) {
+                return fromStringToDouble(trimmed);
+            }
+        } catch (...) {
+        }
+
+        // Fallback
+        return fromStringToString(str);
+    }
+
+    static Value fromString(const std::string & str, Symbols::Variables::Type type) {
+        switch (type) {
+            case Symbols::Variables::Type::INTEGER:
+                return fromStringToInt(str);
+            case Symbols::Variables::Type::DOUBLE:
+                return fromStringToDouble(str);
+            case Symbols::Variables::Type::FLOAT:
+                return fromStringToFloat(str);
+            case Symbols::Variables::Type::BOOLEAN:
+                return fromStringToBool(str);
+            case Symbols::Variables::Type::STRING:
+            default:
+                return fromStringToString(str);
+        }
+    }
   private:
-    Variant value_;
+    Variant                  value_;
+    Symbols::Variables::Type type_;
+
+    static Value fromStringToInt(const std::string & str) { return Value(std::stoi(str)); }
+
+    static Value fromStringToDouble(const std::string & str) { return Value(std::stod(str)); }
+
+    static Value fromStringToFloat(const std::string & str) { return Value(std::stof(str)); }
+
+    static Value fromStringToBool(const std::string & str) {
+        std::string s = str;
+        std::transform(s.begin(), s.end(), s.begin(), ::tolower);
+        if (s == "true" || s == "1") {
+            return Value(true);
+        }
+        if (s == "false" || s == "0") {
+            return Value(false);
+        }
+        throw std::invalid_argument("Invalid bool string: " + str);
+    }
+
+    static Value fromStringToString(const std::string & str) { return Value(str); }
 };
 
 }  // namespace Symbols

--
Gitblit v1.9.3