LuaOO 0.1.1.1发布

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);

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值