#ifndef NONUT_CORE_UTILS_H #define NONUT_CORE_UTILS_H #include "Instance.h" #include "CommonHeader.h" namespace nonut { struct CustomType { virtual void convert(HSQOBJECT object) = 0; }; template void sqGetValue(SQVM* vm, SQInteger idx, T outPtr) { static_assert( std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v, "Not supported return type"); if constexpr (std::is_same_v) sq_getbool(vm, idx, outPtr); if constexpr (std::is_same_v) sq_getinteger(vm, idx, outPtr); if constexpr (std::is_same_v) sq_getfloat(vm, idx, outPtr); if constexpr (std::is_same_v) sq_getstring(vm, idx, outPtr); if constexpr (std::is_same_v) { sq_getstackobj(vm, idx, outPtr); sq_addref(vm, outPtr); } if constexpr (std::is_same_v) { sq_getuserpointer(vm, idx, outPtr); } } template void sqPushValue(SQVM* vm, T value) { static_assert( std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::derived_from, "Not supported return type"); if constexpr (std::is_same_v) sq_pushbool(vm, value); if constexpr (std::is_same_v) sq_pushbool(vm, value); if constexpr (std::is_same_v) sq_pushinteger(vm, value); if constexpr (std::is_same_v) sq_pushfloat(vm, value); if constexpr (std::is_same_v) sq_pushstring(vm, value, -1); if constexpr (std::is_same_v) sq_pushobject(vm, value); if constexpr (std::is_same_v || std::is_same_v) sq_pushstring(vm, value.c_str(), value.length()); if constexpr (std::is_same_v) sq_pushuserpointer(vm, value); if constexpr (std::derived_from) sq_pushobject(vm, value.getInstance()); } template T returnVar() { HSQUIRRELVM vm = Sqrat::DefaultVM::Get(); static_assert( std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v, "Not supported return type"); T result{}; sqGetValue(vm, -1, &result); sq_pop(vm, 1); // pops result return result; } template <> inline String returnVar() { const SQChar* result = ""; sq_getstring(Sqrat::DefaultVM::Get(), -1, &result); sq_pop(Sqrat::DefaultVM::Get(), 1); // pops result return result; } } #endif // NONUT_CORE_UTILS_H