#ifndef PORYGONLANG_USERDATATEMPLATES_HPP #define PORYGONLANG_USERDATATEMPLATES_HPP #define PORYGON_USERDATA_START() \ static Porygon::UserData::UserData* __createUserData(){ \ return new Porygon::UserData::UserData({ \ #define PORYGON_USERDATA_END() });}; #define PORYGON_INTEGER_TYPE ((Porygon::ScriptType*)new Porygon::NumericScriptType(true, false)) #define PORYGON_FLOAT_TYPE ((Porygon::ScriptType*)new Porygon::NumericScriptType(true, true)) #define PORYGON_STRING_TYPE ((Porygon::ScriptType*)new Porygon::StringScriptType(false, 0)) #define PORYGON_FIELD(userDataTypeName, fieldName, fieldType, getterHelper, setterHelper) \ { \ Porygon::Utilities::HashedString::ConstHash(#fieldName), \ new Porygon::UserData::UserDataField(fieldType, \ [](void* obj) -> Porygon::Evaluation::EvalValue* { return new getterHelper;}, \ [](void* obj, Porygon::Evaluation::EvalValue* val) { ((userDataTypeName*)obj)->fieldName = setterHelper;} \ ) \ }, \ #define PORYGON_READONLY_FIELD(userDataTypeName, fieldName, fieldType, getterHelper) \ { \ Porygon::Utilities::HashedString::ConstHash(#fieldName), \ new Porygon::UserData::UserDataField(fieldType, \ [](void* obj) -> Porygon::Evaluation::EvalValue* { return new getterHelper;}, \ nullptr \ ) \ }, \ #define PORYGON_INTEGER_FIELD(userDataTypeName, fieldName) \ PORYGON_FIELD(userDataTypeName, fieldName, PORYGON_INTEGER_TYPE, \ Porygon::Evaluation::IntegerEvalValue(((userDataTypeName*)obj)->fieldName), val->EvaluateInteger()) #define PORYGON_READONLY_INTEGER_FIELD(userDataTypeName, fieldName) \ PORYGON_READONLY_FIELD(userDataTypeName, fieldName, PORYGON_INTEGER_TYPE, \ Porygon::Evaluation::IntegerEvalValue(((userDataTypeName*)obj)->fieldName)) #define PORYGON_FLOAT_FIELD(userDataTypeName, fieldName) \ PORYGON_FIELD(userDataTypeName, fieldName, PORYGON_FLOAT_TYPE, \ Porygon::EvaluationFloatEvalValue(((userDataTypeName*)obj)->fieldName), val->EvaluateFloat()) #define PORYGON_READONLY_FLOAT_FIELD(userDataTypeName, fieldName) \ PORYGON_READONLY_FIELD(userDataTypeName, fieldName, PORYGON_FLOAT_TYPE, \ Porygon::EvaluationFloatEvalValue(((userDataTypeName*)obj)->fieldName)) #define PORYGON_FUNCTION(userDataTypeName, fieldName, returnType, ...) \ { \ Porygon::Utilities::HashedString::ConstHash(#fieldName), \ new Porygon::UserData::UserDataField(Porygon::UserData::UserDataFunctionType::FromRawPointers(returnType, {__VA_ARGS__} ), \ \ \ [](void* obj) -> Porygon::Evaluation::EvalValue* { \ return new Porygon::UserData::UserDataFunction( \ [](void* obj, Porygon::Evaluation::EvalValue* parameters[], int parameterCount) \ -> Porygon::Evaluation::EvalValue*{return ((userDataTypeName*)obj)->invoke__##fieldName(obj, parameters, parameterCount);}, \ obj);}, \ nullptr) \ }, #define PORYGON_INTEGER_FUNCTION(userDataTypeName, fieldName, ...) \ PORYGON_FUNCTION(userDataTypeName, fieldName, new Porygon::NumericScriptType(true, false), __VA_ARGS__ ) #define PORYGON_PREPARE_FUNCTION(userDataTypeName, fieldName, returnType, ...) \ static Porygon::Evaluation::EvalValue* invoke__##fieldName(void* obj, Porygon::Evaluation::EvalValue* parameters[], int parameterCount){ \ return new returnType(((userDataTypeName*)obj)->fieldName( \ __VA_ARGS__ \ ));} #endif //PORYGONLANG_USERDATATEMPLATES_HPP