Polyphase Game Engine
Loading...
Searching...
No Matches
LuaTypeCheck.h
Go to the documentation of this file.
1#pragma once
2
3#include "EngineTypes.h"
4#include "AssetManager.h"
5
7
8class Node;
9
10#if LUA_ENABLED
11
12template<typename T>
13T* CheckLuaType(lua_State* L, int arg, const char* typeName, bool throwError = true)
14{
15 return throwError ?
16 (T*)luaL_checkudata(L, arg, typeName) :
17 (T*)luaL_testudata(L, arg, typeName);
18}
19
20template<typename T>
21T* CheckHierarchyLuaType(lua_State* L, int arg, const char* typeName, const char* classFlag, bool throwError = true)
22{
23 luaL_checktype(L, arg, LUA_TUSERDATA);
24 T* ret = (T*)lua_touserdata(L, arg);
25
26 if (ret != nullptr)
27 {
28 // Check that the userdata class inherits from the type T
29 bool hasClassFlag = (lua_getfield(L, arg, classFlag) != LUA_TNIL);
30 lua_pop(L, 1);
31
32 if (!hasClassFlag)
33 {
34 ret = nullptr;
35
36 if (throwError)
37 {
38 luaL_error(L, "Error: Arg #%d: Expected %s", arg, typeName);
39 }
40 }
41 }
42
43 return ret;
44}
45
46template<typename T>
47T* CheckAssetLuaType(lua_State* L, int arg, const char* className, const char* classFlag, bool throwError = true)
48{
49 T* ret = nullptr;
50 if (lua_isstring(L, arg))
51 {
52 const char* name = lua_tostring(L, arg);
53 ret = LoadAsset<T>(name);
54 }
55 else
56 {
57 Asset_Lua* assetLua = CheckHierarchyLuaType<Asset_Lua>(L, arg, className, classFlag, throwError);
58 ret = static_cast<T*>(assetLua ? assetLua->mAsset.Get() : nullptr);
59 }
60
61 return ret;
62}
63
64POLYPHASE_API NodePtr& CheckNodeWrapperPtr(lua_State* L, int arg);
65POLYPHASE_API Node* CheckNodeWrapper(lua_State* L, int arg);
66POLYPHASE_API Node* CheckNodeLuaType(lua_State* L, int arg, const char* className, const char* classFlag);
67POLYPHASE_API Object* CheckObjectLuaType(lua_State* L, int arg);
68
69POLYPHASE_API Asset* CheckAssetOrNilLuaType(lua_State* L, int arg, const char* className, const char* classFlag);
70POLYPHASE_API Node* CheckNodeOrNilLuaType(lua_State* L, int arg, const char* className, const char* classFlag);
71POLYPHASE_API Object* CheckObjectOrNilLuaType(lua_State* L, int arg);
72
73
74const char* CheckTableName(lua_State* L, int arg);
75
76#define CHECK_STRING(L, Arg) lua_tostring(L, Arg); luaL_checktype(L, Arg, LUA_TSTRING);
77#define CHECK_NUMBER(L, Arg) lua_tonumber(L, Arg); luaL_checktype(L, Arg, LUA_TNUMBER);
78#define CHECK_INTEGER(L, Arg) lua_tointeger(L, Arg); luaL_checktype(L, Arg, LUA_TNUMBER);
79#define CHECK_BOOLEAN(L, Arg) lua_toboolean(L, Arg); luaL_checktype(L, Arg, LUA_TBOOLEAN);
80#define CHECK_TABLE(L, Arg) luaL_checktype(L, Arg, LUA_TTABLE);
81#define CHECK_FUNCTION(L, Arg) luaL_checktype(L, Arg, LUA_TFUNCTION);
82#define CHECK_USERDATA(L, Arg) luaL_checktype(L, Arg, LUA_TUSERDATA);
83#define CHECK_NIL(L, Arg) luaL_checktype(L, Arg, LUA_TNIL);
84
85#define CHECK_INDEX(L, Arg) (lua_tointeger(L, Arg) - 1); luaL_checktype(L, Arg, LUA_TNUMBER);
86
87bool CheckClassFlag(lua_State* L, int arg, const char* flag);
88
89#endif
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
Definition Asset.h:113
Definition Node.h:67
Definition Object.h:13