LuaOO 0.1.1.1是对0.1.1.0的修正,修正了很多bug。添加了LuaState::new*() 的一系列操作,方便对象的创建初始化。
此版本提供一个demo示例是简单的数组操作的扩展库(像C语言中的数组),其功能远比不上lua自带的数组,但在性能以及所占内存上是有些优势的。
此demo作为扩展lua库的示例,包含userdata类型的验证,以及面向对象的调用方法,metaTable的操作以及registry的操作等,加深用户对luaOO的了解。
Demo的代码如下:
下载地址:https://sourceforge.net/projects/luaoo/
struct NumArray
{
static char id;
size_t size;
double data[1];
};
char NumArray::id=0;
void newNumArray(lua::LuaFuncState* L)
{
if(!L->arg(0).isNumber()||L->arg(0).toUInt()==0)
{
L->error("param is not a number or size==0");
return;
}
size_t size=sizeof(NumArray)+(L->arg(0).toUInt()-1)*sizeof(double);
lua::LuaObject arr=L->newObject();
NumArray* narr=(NumArray*)arr.setUData(size);
arr.setMetaTable(L->getRegistery(&NumArray::id));
narr->size=L->arg(0).toUInt();
L->mreturn(1,arr);
}
void getNumArraySize(lua::LuaFuncState *L)
{
if(L->arg(0).getMetaTable().toPointer()!=L->getRegistery(&NumArray::id).toPointer())//判断是否是数组
{
L->error("param error");
return;
}
NumArray *arr=(NumArray *)L->arg(0).toUData();
lua::LuaObject size=L->newUInt(arr->size);
L->mreturn(1,size);
}
void setNumArray(lua::LuaFuncState* L)
{
if(L->arg(0).getMetaTable().toPointer()!=L->getRegistery(&NumArray::id).toPointer()||!L->arg(1).isNumber()||!L->arg(2).isNumber())
{
L->error("param error");
return;
}
NumArray *arr=(NumArray *)L->arg(0).toUData();
if(L->arg(1).toUInt()>arr->size)
{
L->error("数组越界");
return;
}
arr->data[L->arg(1).toUInt()]=L->arg(2).toNumber();
}
//arg0 array
//arg1 index
void getNumArray(lua::LuaFuncState* L)
{
if(L->arg(0).getMetaTable().toPointer()!=L->getRegistery(&NumArray::id).toPointer()||!L->arg(1).isNumber())
{
L->error("param error");
return;
}
NumArray *arr=(NumArray *)L->arg(0).toUData();
if(L->arg(1).toUInt()>arr->size)
{
L->error("数组越界");return;
}
lua::LuaObject num=L->newObject();
num=arr->data[L->arg(1).toUInt()];
L->mreturn(1,num);
}
lua::LuaReg arrayLib[]=
{
{"new",newNumArray},
{"size",getNumArraySize},
{"set",setNumArray},
{"get",getNumArray},
{NULL,NULL}
};
void openArrayLib(lua::LuaState* L)
{
lua::LuaObject funcTable=L->newObject();
funcTable.setNewTable();
lua::LuaObject func=L->newObject();
int i=0;
while(arrayLib[i].funcName)
{
func.setStateFunction(arrayLib[i].func);
funcTable.setTable(arrayLib[i].funcName,func);
i++;
}
L->setGlobal("MyArray",funcTable);
//设置metaTable
lua::LuaObject gmt=L->newObject();
gmt.setNewTable();
gmt.setTable("__index",gmt);
gmt.setTable("set",funcTable.getTable("set"));
gmt.setTable("get",funcTable.getTable("get"));
gmt.setTable("size",funcTable.getTable("size"));
L->setRegistry(&NumArray::id,gmt);
}