From 601f9ba16436565c1892bdc0f429332499f9f30e Mon Sep 17 00:00:00 2001
From: Vasilii Rogin <vasya@rogin.ru>
Date: Thu, 20 Apr 2023 13:12:11 +0300
Subject: [PATCH] SFallScriptValue updates

---
 src/sfall_script_value.cc | 31 ++++++++++++++++++++++++++-----
 src/sfall_script_value.h  |  3 +++
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/sfall_script_value.cc b/src/sfall_script_value.cc
index a17c0ef..845837f 100644
--- a/src/sfall_script_value.cc
+++ b/src/sfall_script_value.cc
@@ -1,5 +1,6 @@
 
 #include "sfall_script_value.h"
+#include <utility>
 
 namespace fallout {
 SFallScriptValue::SFallScriptValue()
@@ -19,12 +20,32 @@ SFallScriptValue::SFallScriptValue(Object* value)
 };
 SFallScriptValue::SFallScriptValue(ProgramValue& value)
 {
-    // Assuming that pointer is the biggest in size
-    static_assert(sizeof(decltype(value.floatValue)) <= sizeof(decltype(value.pointerValue)));
-    static_assert(sizeof(decltype(value.integerValue)) <= sizeof(decltype(value.pointerValue)));
     opcode = value.opcode;
-    pointerValue = value.pointerValue;
-    // TODO: If type is string then copy string
+
+    switch (opcode) {
+    case VALUE_TYPE_DYNAMIC_STRING:
+    case VALUE_TYPE_STRING:
+        // TODO: Copy string
+        pointerValue = value.pointerValue;
+        break;
+    case VALUE_TYPE_PTR:
+        pointerValue = value.pointerValue;
+        break;
+    case VALUE_TYPE_INT:
+        integerValue = value.integerValue;
+        break;
+    case VALUE_TYPE_FLOAT:
+        floatValue = value.floatValue;
+        break;
+    default:
+        throw(std::exception());
+    }
+}
+
+SFallScriptValue::SFallScriptValue(SFallScriptValue&& other) noexcept
+{
+    opcode = other.opcode;
+    std::exchange(other.pointerValue, nullptr);
 }
 
 SFallScriptValue::~SFallScriptValue()
diff --git a/src/sfall_script_value.h b/src/sfall_script_value.h
index 6b0b3af..f679d02 100644
--- a/src/sfall_script_value.h
+++ b/src/sfall_script_value.h
@@ -12,6 +12,9 @@ public:
     SFallScriptValue(int value);
     SFallScriptValue(Object* value);
     SFallScriptValue(ProgramValue& value);
+
+    SFallScriptValue(SFallScriptValue&& other) noexcept; // move constructor    
+ 
     bool isInt() const;
     bool isFloat() const;
     bool isPointer() const;