diff --git a/src/Evaluator/EvalValues/EvalValueHelper.hpp b/src/Evaluator/EvalValues/EvalValueHelper.hpp new file mode 100644 index 0000000..5e3bca7 --- /dev/null +++ b/src/Evaluator/EvalValues/EvalValueHelper.hpp @@ -0,0 +1,60 @@ +#include + +#ifndef PORYGONLANG_EVALVALUEHELPER_HPP +#define PORYGONLANG_EVALVALUEHELPER_HPP + +#include "EvalValue.hpp" +#include "NumericEvalValue.hpp" +#include "StringEvalValue.hpp" + +namespace Porygon::Evaluation{ + class EvalValueHelper{ + public: + static EvalValue* Create(unsigned char i){ + return new IntegerEvalValue((long)i); + } + static EvalValue* Create(signed char i){ + return new IntegerEvalValue((long)i); + } + static EvalValue* Create(short int i){ + return new IntegerEvalValue(i); + } + static EvalValue* Create(unsigned short int i){ + return new IntegerEvalValue(i); + } + static EvalValue* Create(signed int i){ + return new IntegerEvalValue(i); + } + static EvalValue* Create(unsigned int i){ + return new IntegerEvalValue(i); + } + static EvalValue* Create(signed long l){ + return new IntegerEvalValue(l); + } + static EvalValue* Create(unsigned long l){ + return new IntegerEvalValue(l); + } + + static EvalValue* Create(float f){ + return new FloatEvalValue(f); + } + static EvalValue* Create(double f){ + return new FloatEvalValue(f); + } + static EvalValue* Create(long double f){ + return new FloatEvalValue(f); + } + + static EvalValue* Create(bool b){ + return new BooleanEvalValue(b); + } + static EvalValue* Create(const string& s){ + return new StringEvalValue(Utilities::StringUtils::StringToU16String(s)); + } + static EvalValue* Create(u16string s){ + return new StringEvalValue(std::move(s)); + } + }; +} + +#endif //PORYGONLANG_EVALVALUEHELPER_HPP diff --git a/src/UserData/UserDataTemplates.hpp b/src/UserData/UserDataTemplates.hpp index 16cfa71..83ad0a1 100644 --- a/src/UserData/UserDataTemplates.hpp +++ b/src/UserData/UserDataTemplates.hpp @@ -92,7 +92,7 @@ */ #define PORYGON_PREPARE_FUNCTION(userDataTypeName, fieldName, returnType, ...) \ static Porygon::Evaluation::EvalValue* invoke__##fieldName(void* obj, Porygon::Evaluation::EvalValue* par[], int parameterCount){ \ - return new returnType(((userDataTypeName*)obj)->fieldName( \ + return Porygon::Evaluation::EvalValueHelper::Create(((userDataTypeName*)obj)->fieldName( \ __VA_ARGS__ \ ));} diff --git a/src/Utilities/StringUtils.hpp b/src/Utilities/StringUtils.hpp index 91cfe67..6fcfce3 100644 --- a/src/Utilities/StringUtils.hpp +++ b/src/Utilities/StringUtils.hpp @@ -15,6 +15,10 @@ namespace Porygon::Utilities{ static std::u16string IntToString(long const &i) { return conv.from_bytes(std::to_string(i)); } + static std::u16string StringToU16String(const std::string& s) { + return conv.from_bytes(s); + } + }; } diff --git a/tests/integration/UserDataTests.cpp b/tests/integration/UserDataTests.cpp index 8a98a66..5830bbb 100644 --- a/tests/integration/UserDataTests.cpp +++ b/tests/integration/UserDataTests.cpp @@ -8,6 +8,7 @@ #include "../../src/UserData/UserDataFunction.hpp" #include "../../src/UserData/UserDataFunctionType.hpp" #include "../../src/UserData/UserDataTemplates.hpp" +#include "../../src/Evaluator/EvalValues/EvalValueHelper.hpp" using namespace Porygon; using namespace Porygon::UserData;