809 lines
16 KiB
C
809 lines
16 KiB
C
|
|
#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
|
|||
|
|
|