PorygonLang/src/UserData/UserDataTemplates.hpp

78 lines
3.5 KiB
C++
Raw Normal View History

#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