mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
* Merged Source Code from Development Trunk: Revision 4063 * ************************************************************ - Source Code is merged from: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP - This will be the Source for the Beta 2011 Test git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4064 3b4a5df2-a311-0410-b5c6-a8a6f20db521
123 lines
3.4 KiB
C++
123 lines
3.4 KiB
C++
#ifndef _LUA_CLASS_INTERFACE_H_
|
|
#define _LUA_CLASS_INTERFACE_H_
|
|
|
|
//#include "Lua Interpreter.h"
|
|
#include "lua_state.h"
|
|
|
|
#include <string>
|
|
#include <list>
|
|
|
|
#define DECLARE_LUA_CFUNCTION(name) static int name(lua_State* L)
|
|
#define DEFINE_LUA_CFUNCTION(class_name,name) int class_name::name(lua_State* L)
|
|
|
|
class LuaInterface
|
|
{
|
|
public:
|
|
struct SInterfaceData
|
|
{
|
|
typedef std::list<LuaAttrib*> tAttribs;
|
|
typedef std::list<std::string> tClassInterface;
|
|
tAttribs Attribs;
|
|
tClassInterface ClassHierarchy;
|
|
};
|
|
|
|
static const char* luaClassName;
|
|
public:
|
|
LuaInterface();
|
|
virtual ~LuaInterface();
|
|
|
|
virtual void luaPushObject( LuaState L, const char* luaName = NULL );
|
|
|
|
protected:
|
|
static void luaExportInterface(LuaState L, LuaInterface::SInterfaceData& iface);
|
|
static SInterfaceData* luaGetExportedInterface( SInterfaceData* iface=NULL);
|
|
|
|
virtual SInterfaceData* luaGetInterface();
|
|
|
|
void luaPushObject( LuaState L, const char* sClassName, void *Ptr );
|
|
private:
|
|
void luaCreateObject( LuaState L, void *Ptr );
|
|
void* luaObject;
|
|
|
|
static LuaAttrib* luaCommonGetSet( LuaState L );
|
|
static void* luaIsOfType(LuaState L, int index, const char* sClassName);
|
|
|
|
// "meta"-interface
|
|
//static int luaGetObject( lua_State *L);
|
|
//static int luaSetObject( lua_State *L);
|
|
DECLARE_LUA_CFUNCTION( luaGetObject );
|
|
DECLARE_LUA_CFUNCTION( luaSetObject );
|
|
|
|
static luaL_Reg s_ClassList[];
|
|
public:
|
|
/////////////////////////////////////////////////////////////////////////
|
|
template<typename T>
|
|
static void luaExportClass( LuaState L )
|
|
{
|
|
LuaInterface::SInterfaceData* iface = T::luaGetExportedInterface();
|
|
LuaInterface::luaExportInterface(L, *iface);
|
|
}
|
|
|
|
template<typename T>
|
|
static T* luaGetTypedUserData(LuaState L, int index)
|
|
{
|
|
void *ptr = LuaInterface::luaIsOfType(L, index, T::luaClassName);
|
|
if( !ptr )
|
|
{
|
|
luaL_typerror(L(), index, T::luaClassName);
|
|
}
|
|
|
|
T** ppNode = (T**)(ptr);
|
|
if(ppNode)
|
|
{
|
|
return *ppNode;
|
|
}
|
|
return NULL;
|
|
}
|
|
};
|
|
|
|
class LuaUserObject
|
|
{
|
|
public:
|
|
LuaUserObject(LuaInterface* luaObject=NULL) : _luaObject(luaObject) {};
|
|
void PushObject(LuaState state, const char* luaName = NULL)
|
|
{
|
|
if(_luaObject) _luaObject->luaPushObject(state, luaName);
|
|
}
|
|
private:
|
|
LuaInterface* _luaObject;
|
|
};
|
|
|
|
#ifndef DECLARE_LUA_INTERFACE
|
|
#define DECLARE_LUA_INTERFACE(BaseClass) \
|
|
private: \
|
|
typedef BaseClass tSuperClass; \
|
|
public: \
|
|
static const char* luaClassName; \
|
|
static SInterfaceData* luaGetExportedInterface(SInterfaceData* iface=NULL); \
|
|
protected: \
|
|
virtual SInterfaceData* luaGetInterface(); \
|
|
private: \
|
|
static SInterfaceData luaInterface;
|
|
#endif // DECLARE_LUA_INTERFACE
|
|
|
|
#ifndef IMPLEMENT_LUA_INTERFACE
|
|
#define IMPLEMENT_LUA_INTERFACE(className, classLuaName, AttribArray) \
|
|
const char* className::luaClassName = classLuaName; \
|
|
LuaInterface::SInterfaceData className::luaInterface; \
|
|
LuaInterface::SInterfaceData* className::luaGetInterface() \
|
|
{ \
|
|
return &(className::luaInterface); \
|
|
} \
|
|
LuaInterface::SInterfaceData* className::luaGetExportedInterface(LuaInterface::SInterfaceData* iface) \
|
|
{ \
|
|
if(!iface) iface = &(className::luaInterface); \
|
|
iface->ClassHierarchy.push_back(className::luaClassName); \
|
|
iface->Attribs.push_back(AttribArray); \
|
|
return tSuperClass::luaGetExportedInterface( iface ); \
|
|
}
|
|
#endif // IMPLEMENT_LUA_INTERFACE
|
|
|
|
#endif // _LUA_CLASS_INTERFACE_H_
|
|
|