lua封装

来源:互联网 发布:平面装修设计软件 编辑:程序博客网 时间:2024/06/05 10:10
// test.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
extern "C" 
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
using namespace std;


void Show(int i,char* s)
{
cout<<"show is call"<<endl;
cout<<"arg 1 : "<<i<<endl;
cout<<"arg 2 : "<<s<<endl;
}


void Fuck(int c)
{
cout<<"fuck"<<endl;
}


void Like(char* s)
{
cout<<"Like"<<endl;
}


template<typename T>
T read1(lua_State* L,int index);


template<>
const char* read1<const char*>(lua_State* L,int index)
{
return lua_tostring(L,index);
}


template<>
char* read1<char*>(lua_State* L,int index)
{
return (char*)lua_tostring(L,index);
}


template<>
int read1<int>(lua_State* L,int index)
{
return (int)lua_tointeger(L,index);
}




template<typename RVal, typename T=void, typename T1=void, typename T2=void,typename T3=void,typename T4=void> struct functor;


template<typename RVal,typename T>
struct functor<RVal,T>
{
static int invoke(lua_State* L)
{
T func = (T)lua_touserdata(L,lua_upvalueindex(1)); 
func();
return 0;
}
};




template<typename RVal,typename T,typename T1>
struct functor<RVal,T,T1>
{
static int invoke(lua_State* L)
{
T func = (T)lua_touserdata(L,lua_upvalueindex(1));
func(read1<T1>(L,-1));
return 0;
}
};


template<typename RVal,typename T,typename T1,typename T2>
struct functor<RVal,T,T1,T2>
{
static int invoke(lua_State* L)
{
T func = (T)lua_touserdata(L,lua_upvalueindex(1)); 
func(read1<T1>(L,-2),read1<T2>(L,-1));
return 0;
}
};


template<typename RVal>
void push_func(lua_State* L,RVal (*)())
{
lua_pushcclosure(L,functor<RVal,RVal (*)()>::invoke,1);
}


template<typename RVal,typename T1>
void push_func(lua_State* L,RVal (*)(T1))
{
lua_pushcclosure(L,functor<RVal,RVal (*)(T1),T1>::invoke,1);
}


template<typename RVal,typename T1,typename T2>
void push_func(lua_State* L,RVal (*)(T1,T2))
{
lua_pushcclosure(L,functor<RVal,RVal (*)(T1,T2),T1,T2>::invoke,1);
}


template<typename T>
void _def(lua_State* L,const char* name,T func)
{
lua_pushlightuserdata(L,(void*)func);
push_func(L,func);
lua_setglobal(L,name); 
}


template<typename T0,typename T1>
T0 _call(lua_State* L,char* name,T1 arg1)
{
lua_pcall(L,1,0,0);
}


struct DataTest
{
int m_a;
double m_b;
char m_c;
};


class A
{
public:
static int show()
{
cout<<"asdfasfasfasfasdfasdfas12"<<endl;
return 1;
}
};


typedef int (*pShow)();




int CallSome(lua_State* L)
{
cout<<"stack size"<<lua_gettop(L)<<endl;
for(int i = -1;i>=-lua_gettop(L);--i)
{
cout<<lua_tonumber(L,i)<<endl;
}
pShow ps = (pShow)lua_touserdata(L,lua_upvalueindex(1));
ps();
return 0;
}


struct TestData
{
int m_a;
double m_b;
char m_c;
int array[100];
};


void showAllThing(TestData* p)
{
cout<<p->m_a<<endl;
cout<<p->m_b<<endl;
cout<<p->m_c<<endl;


for(int i = 0;i < 100;++i)
{
cout<<p->array[i]<<endl;
}
}


int test(lua_State* L)
{
TestData * p = (TestData*)lua_touserdata(L,-1);
showAllThing(p);
cout<<"lua call test is success"<<endl;
return 0;
}


int show(lua_State* L)
{
cout<<"lua call show is success"<<endl;
return 0;
}


int _MyNew(lua_State* L)
{
TestData* pData = (TestData*)lua_newuserdata(L,sizeof(TestData));
pData->m_a = 100;
pData->m_b = 35.3;
pData->m_c = 'a';


for(int i = 0 ; i < 100 ; ++i)
{
pData->array[i] = i+1;
}


luaL_getmetatable(L,"RegMetatable");
lua_setmetatable(L,-2);


return 1;
}


luaL_Reg CFunctionReg[] =
{
{"new",_MyNew},
{NULL,NULL}
};


int _tmain(int argc, _TCHAR* argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);




lua_getglobal(L,"package");
lua_getfield(L,-1,"path");


string s = "E:\\code\\test\\?.lua;";
s += lua_tostring(L,-1);


lua_pushstring(L,s.c_str());
lua_setfield(L,-3,"path");

lua_pop(L,2);


int result = luaL_dofile(L,"E:\\code\\test\\Main.lua");



lua_newtable(L);


lua_pushstring(L,"MyShow");
lua_pushcclosure(L,show,0);
lua_rawset(L,-3);


lua_setglobal(L,"TbYou");




lua_getglobal(L,"CallEverthing");
lua_pcall(L,0,0,0);


//userdata使用


//TestData* pData = (TestData*)lua_newuserdata(L,sizeof(TestData));
//pData->m_a = 100;
//pData->m_b = 35.3;
//pData->m_c = 'a';


//for(int i = 0 ; i < 100 ; ++i)
//{
// pData->array[i] = i+1;
//}




//luaL_newmetatable(L,"RegMetatable");
//lua_pushcclosure(L,test,0);
//lua_setfield(L,-2,"test");


////将RegMetatable 的 index设置为RegMetatable
//lua_pushvalue(L,-1);
//lua_setfield(L,-2,"__index");


//lua_setmetatable(L,-2);
//
//lua_getglobal(L,"CallEverthing");
//lua_pushvalue(L,-2);
//lua_pcall(L,1,0,0);






//模版封装
//lua_pushlightuserdata(L,A::show);


//lua_pushcclosure(L,CallSome,1);
//lua_setglobal(L,"GiveToLua");


//lua_getglobal(L,"CallFunc");
//lua_pcall(L,0,0,0);


/*_def(L,"Show",Show);
_def(L,"Fuck",Fuck);
_def(L,"Like",Like);


lua_getglobal(L,"GetVersionInfoSize");
lua_pcall(L,0,0,0);*/

}

0 0