Files
mir_server/Gateway/srvlib/include/luabase/base_clv_class.h

809 lines
16 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _BASE_CLV_CLASS_H_
#define _BASE_CLV_CLASS_H_
/************************************************************************
*
* C++<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* BaseCLVClass<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><EFBFBD>ܱȽ<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD>ܴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵĴ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD>new<EFBFBD><EFBFBD>__gc<EFBFBD><EFBFBD>__get<EFBFBD><EFBFBD>__set<EFBFBD><EFBFBD>__eq<EFBFBD><EFBFBD>__add<EFBFBD><EFBFBD>__sub<EFBFBD><EFBFBD>__mul<EFBFBD><EFBFBD>__div<EFBFBD><EFBFBD>
* __mod<EFBFBD><EFBFBD>__unm<EFBFBD><EFBFBD>__len<EFBFBD><EFBFBD>__lt<EFBFBD><EFBFBD>__le<EFBFBD><EFBFBD>__concat<EFBFBD><EFBFBD>ЩԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>͡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD>ʵ<EFBFBD><EFBFBD>ģʽ֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ʵ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD>ű<EFBFBD>gc<EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ļܹ<EFBFBD><EFBFBD><EFBFBD>
* ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tolua++<EFBFBD><EFBFBD>ʱû<EFBFBD><EFBFBD>ʵ<EFBFBD>ֵģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>ǶԸ<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ָ<EFBFBD>Ϊȫ<EFBFBD>
*
* <EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
*
_typename : string <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
* _typeid : number <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>IDֵ<EFBFBD><EFBFBD>IDֵ<EFBFBD>ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>
* _classInst : lightuserdata <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
************************************************************************/
#define CLC_CS_TYPENAME "_typename" //<2F><><EFBFBD><EFBFBD>metatable<6C>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD>
#define CLC_CS_TYPEID "_typeid" //<2F><><EFBFBD><EFBFBD>metatable<6C>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ID<49><44>
#define CLC_CS_CLASSINST "_classInst"//<2F><><EFBFBD><EFBFBD>metatable<6C>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>
template <class T, class CHILD>
class BaseCLVClass
{
public:
typedef T DataType;
typedef BaseCLVClass<T, CHILD> ClassType;
public:
/*
* Comments: <EFBFBD><EFBFBD>LUA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return void:
*/
virtual void regist(lua_State* L)
{
registClassName(L, ClassTypeName);
registClassName(L, ClassRefTypeName);
}
/*
* Comments: <EFBFBD><EFBFBD>LUA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>gcɾ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
* Param lua_State * L:
* Param T & ref:
* @Return int:
*/
virtual int newReference(lua_State* L, T& ref)
{
T** ppRef = (T**)lua_newuserdata(L, sizeof(*ppRef));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>
setType(L, ClassRefTypeName);
*ppRef = &ref;
return 1;
}
protected:
typedef int (CHILD::*ExportCallFn)(lua_State* L, DataType* pInst);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9><EFBFBD><EFBFBD> */
struct FuncCall
{
const char* name;
ExportCallFn call;
};
private:
/** <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýṹ **/
struct RawCallFunc
{
unsigned int name;//hash<73><68><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
union
{
ExportCallFn call;//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
void* pfn;
};
};
protected:
/*
* Comments: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ɽű<EFBFBD>T:new<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return T*:
*/
virtual T* create(lua_State* L)
{
//Ĭ<>ϵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>lua_newuserdata<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ɽű<C9BD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻgc
return (T*)lua_newuserdata(L, sizeof(T));
}
/*
* Comments: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ɽű<EFBFBD>T:new<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* Param T * ptr:
* @Return void:
*/
virtual void destroy(lua_State*, T*)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>lua_newuserdata<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ɽű<C9BD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻgc<67><63><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ù<EFBFBD><C3B9>Ĵ<EFBFBD><C4B4>ڴ<EFBFBD>
}
/*
* Comments: <EFBFBD><EFBFBD>__getԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int get(lua_State* L, T*)
{
if (NumCall > 0)
{
const char* sName = lua_tostring(L, 1);
unsigned int nh = hashstr(sName);
RawCallFunc* pCall = CallList;
for (int i = NumCall - 1; i >= 0; --i)
{
if (pCall->name == nh)
{
//<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
lua_pushlightuserdata(L, this);
lua_pushlightuserdata(L, pCall->pfn);
lua_pushvalue(L, 1);
lua_pushcclosure(L, _callFn, 3);
return 1;
}
pCall++;
}
}
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__setԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int set(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__eqԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int eq(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__addԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int add(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__subԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int sub(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__mulԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int mul(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__divԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int div(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__modԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int mod(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__unmԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int unm(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__lenԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int len(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__ltԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int lt(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__leԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int le(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD>__concatԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* @Return int:
*/
virtual int concat(lua_State*, T*)
{
return 0;
}
/*
* Comments: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* Param const char * className:
* @Return void:
*/
virtual void registClassName(lua_State* L, const char* className)
{
lua_createtable(L, 0, 18 + NumCall);
//_typename
lua_pushstring(L, CLC_CS_TYPENAME);
lua_pushstring(L, className);
lua_rawset(L, -3);
//_typeid
lua_pushstring(L, CLC_CS_TYPEID);
lua_pushnumber(L, hashstr(className));
lua_rawset(L, -3);
//_classInst
lua_pushstring(L, CLC_CS_CLASSINST);
lua_pushlightuserdata(L, this);
lua_rawset(L, -3);
//constructor
setMetaNameClosure(L, "new", (const void*)_new);
//__gc
setMetaClosure(L, TM_GC, (const void*)_gc);
//__index
setMetaClosure(L, TM_INDEX, (const void*)_get);
//__newindex
setMetaClosure(L, TM_NEWINDEX, (const void*)_set);
//__eq
setMetaClosure(L, TM_EQ, (const void*)_eq);
//__add
setMetaClosure(L, TM_ADD, (const void*)_add);
//__sub
setMetaClosure(L, TM_SUB, (const void*)_sub);
//__mul
setMetaClosure(L, TM_MUL, (const void*)_mul);
//__div
setMetaClosure(L, TM_DIV, (const void*)_div);
//__mod
setMetaClosure(L, TM_MOD, (const void*)_mod);
//__unm
setMetaClosure(L, TM_UNM, (const void*)_unm);
//__len
setMetaClosure(L, TM_LEN, (const void*)_len);
//__lt
setMetaClosure(L, TM_LT, (const void*)_lt);
//__le
setMetaClosure(L, TM_LE, (const void*)_le);
//__concat
setMetaClosure(L, TM_CONCAT, (const void*)_concat);
lua_setglobal(L, className);
}
/*
* Comments: <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* Param int index:
* @Return CCLVariant*:
*/
virtual T* getDataPtr(lua_State* L, int index = 1)
{
if (lua_type(L, index) != LUA_TUSERDATA)
return NULL;
T* result = NULL;
/*
int lua_getmetatable (lua_State *L, int index);
<EFBFBD>Ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵû<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>ѹ<EFBFBD>κζ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
if (lua_getmetatable(L, index))
{
lua_pushstring(L, CLC_CS_TYPEID);
lua_rawget(L, -2);
if (lua_isnumber(L, -1))
{
unsigned int tpid = (unsigned int)lua_tonumber(L, -1);
if (ClassRefTypeId == tpid)
result = *(T**)lua_touserdata(L, (index > 0) ? index : index - 2);
else if (ClassTypeId == tpid)
result = (T*)lua_touserdata(L, (index > 0) ? index : index - 2);
}
//<2F><><EFBFBD><EFBFBD>_typeid<69>Լ<EFBFBD>metatable
lua_pop(L, 2);
}
return result;
}
/*
* Comments: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD>
* Param const FuncCall * funcs:
* Param const size_t count:
* @Return void:
*/
inline void exportFunctions(const FuncCall* funcs, const size_t count)
{
RawCallFunc* call = CallList = (RawCallFunc*)realloc(CallList, sizeof(*CallList) * count);
call += NumCall;
for (size_t i = 0; i < count; ++i)
{
call->name = hashstr(funcs[i].name);
call->call = funcs[i].call;
NumCall++;
call++;
}
}
protected:
/*
* Comments: <EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֺ<EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* Param const char * metaName: Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param const void * fn: ʵ<EFBFBD>ֺ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* Param int tidx: Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return void:
*/
inline static void setMetaNameClosure(lua_State* L, const char* metaName, const void* fn, int tidx = -1)
{
lua_pushstring(L, metaName);
lua_pushcfunction(L, (lua_CFunction)fn);
lua_rawset(L, (tidx < 0) ? tidx - 2 : tidx);
}
/*
* Comments: <EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֺ<EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* Param TMS tm:
* Param const void * fn:
* Param int tidx:
* @Return void:
*/
inline static void setMetaClosure(lua_State* L, TMS tm, const void* fn, int tidx = -1)
{
const char* sTMName = getTMName(tm);
if (sTMName)
{
setMetaNameClosure(L, sTMName, fn, tidx);
}
}
/*
* Comments: <EFBFBD><EFBFBD>ȡԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param TMS tm:
* @Return const char *:
*/
inline static const char* getTMName(TMS tm)
{
static const char* const luaT_eventname[] = /* ORDER TM */
{
"__index", "__newindex",
"__gc", "__mode", "__eq",
"__add", "__sub", "__mul", "__div", "__mod",
"__pow", "__unm", "__len", "__lt", "__le",
"__concat", "__call"
};
if (tm < 0 || tm >= (int)ArrayCount(luaT_eventname))
return NULL;
return luaT_eventname[tm];
}
/*
* Comments: <EFBFBD><EFBFBD>ȡջ<EFBFBD><EFBFBD>userdata<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* Param lua_State * L:
* Param int vidx: userdata<EFBFBD><EFBFBD>ջ<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return ClassType*:
*/
inline static ClassType* getClassTypeInstance(lua_State* L, int vidx = 1)
{
if (!lua_isuserdata(L, vidx))
return NULL;
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>ջ<EFBFBD>д洢<D0B4>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
if (!lua_getmetatable(L, vidx))
return NULL;
ClassType* result = NULL;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
lua_pushstring(L, CLC_CS_CLASSINST);
lua_rawget(L, -2);
result = (ClassType*)lua_touserdata(L, -1);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
//<2F><><EFBFBD><EFBFBD>_classInst<73>Լ<EFBFBD>metatable
lua_pop(L, 2);
return result;
}
public:
BaseCLVClass(const char* sClassName)
{
NumCall = 0;
CallList = NULL;
size_t len = strlen(sClassName);
if (len > sizeof(ClassTypeName))
len = sizeof(ClassTypeName) - 4;
memcpy(ClassTypeName, sClassName, len);
ClassTypeName[len] = 0;
memcpy(ClassRefTypeName, sClassName, len);
ClassRefTypeName[len + 0] = 'R';
ClassRefTypeName[len + 1] = 'e';
ClassRefTypeName[len + 2] = 'f';
ClassRefTypeName[len + 3] = 0;
ClassTypeId = hashstr(ClassTypeName);
ClassRefTypeId = hashstr(ClassRefTypeName);
}
virtual ~BaseCLVClass()
{
if (CallList)
{
free(CallList);
}
}
private:
/*
* Comments: Ϊ<EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param lua_State * L:
* Param const char * classeName: Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param int tidx: ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return void:
*/
inline static void setType(lua_State* L, const char* classeName, int tidx = -1)
{
lua_getglobal(L, classeName);
if (lua_istable(L, -1))
lua_setmetatable(L, (tidx > 0) ? tidx : tidx - 1);
else lua_pop(L, 1);
}
private:
inline static int _new(lua_State* L)
{
ClassType* pthis;
if (!lua_istable(L, 1))
return 0;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
lua_pushstring(L, CLC_CS_CLASSINST);
lua_rawget(L, 1);
pthis = (ClassType*)lua_touserdata(L, -1);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
//<2F><><EFBFBD><EFBFBD>_classInst
lua_pop(L, 1);
if (pthis)
{
pthis->create(L);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>
setType(L, pthis->ClassTypeName);
return 1;
}
return 0;
}
inline static int _gc(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
/*
int lua_getmetatable (lua_State *L, int index);
<EFBFBD>Ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵû<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>ѹ<EFBFBD>κζ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
if (pthis && lua_getmetatable(L, 1))
{
lua_pushlstring(L, CLC_CS_TYPEID, 7);
lua_rawget(L, -2);
if (lua_isnumber(L, -1))
{
unsigned int tpid = (unsigned int)lua_tonumber(L, -1);
if (pthis->ClassRefTypeId == tpid)
*(T**)lua_touserdata(L, 1) = NULL;
else if (pthis->ClassTypeId == tpid)
pthis->destroy(L, (T*)lua_touserdata(L, 1));
}
//<2F><><EFBFBD><EFBFBD>_typeid<69>Լ<EFBFBD>metatable
lua_pop(L, 2);
}
return 0;
}
inline static int _get(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->get(L, pInst);
}
}
return 0;
}
inline static int _set(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->set(L, pInst);
}
}
return 0;
}
inline static int _eq(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->eq(L, pInst);
}
}
return 0;
}
inline static int _add(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->add(L, pInst);
}
}
return 0;
}
inline static int _sub(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->sub(L, pInst);
}
}
return 0;
}
inline static int _mul(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->mul(L, pInst);
}
}
return 0;
}
inline static int _div(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->div(L, pInst);
}
}
return 0;
}
inline static int _mod(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->mod(L, pInst);
}
}
return 0;
}
inline static int _unm(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->unm(L, pInst);
}
}
return 0;
}
inline static int _len(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->len(L, pInst);
}
}
return 0;
}
inline static int _lt(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->lt(L, pInst);
}
}
return 0;
}
inline static int _le(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->le(L, pInst);
}
}
return 0;
}
inline static int _concat(lua_State* L)
{
ClassType* pthis = getClassTypeInstance(L);
if (pthis)
{
T* pInst = pthis->getDataPtr(L);
if (pInst)
{
lua_remove(L, 1);
return pthis->concat(L, pInst);
}
}
return 0;
}
inline static int _callFn(lua_State* L)
{
//<2F><>get<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcclosure<72><65><EFBFBD>õĵ<C3B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>thisָ<73><D6B8>
CHILD* pthis = (CHILD*)lua_touserdata(L, lua_upvalueindex(1));
//<2F><>get<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcclosure<72><65><EFBFBD>õĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD>ָ<EFBFBD><D6B8>
union
{
ExportCallFn call;
void* pfn;
} c;
c.pfn = lua_touserdata(L, lua_upvalueindex(2));
T* pInst = pthis->getDataPtr(L, 1);
if (pInst)
{
lua_remove(L, 1);
return (pthis->*(c.call))(L, pInst);
}
else
{
const char* sName = lua_tostring(L, lua_upvalueindex(3));
lua_pushfstring(L, "%s:%s arg 1 is not %s, please use o:%s().",
pthis->ClassTypeName, sName, pthis->ClassTypeName, sName);
lua_error(L);
}
return 0;
}
protected:
char ClassTypeName[64]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char ClassRefTypeName[64]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int ClassTypeId; //<2F><><EFBFBD><EFBFBD>ID
unsigned int ClassRefTypeId; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
private:
RawCallFunc* CallList;
int NumCall;
};
#endif