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);*/
}
//
#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
- lua封装
- lua - c++封装 dxlua
- 封装Lua for C#
- 封装Lua的调用
- Lua的C++封装
- 封装Lua for C#
- Lua的C++封装
- lua C++封装
- 封装Lua for C#
- Lua封装map
- Lua封装格式化html
- Lua封装格式化float
- Lua的C++封装
- 封装Lua for C#
- lua table封装
- lua tcp通讯封装 http通讯封装
- Lua FFI 简单封装 libpcap
- Lua实现类的封装
- 不同变量类型的不同输出格式
- Java流--flush()
- MySql常用命令总结
- ArrayList的几个常用方法
- Openvpn的配置和连接
- lua封装
- 创建和销毁对象——避免创建不必要的对象——重用不可变对象(摘自Effective java)
- PG13阅读笔记
- 关于视图控制器push or present...处理的相关
- 使用CocoaPods配置第三方类库
- 使用IOS7原生API进行二维码条形码的扫描
- v310增强型项目蓝牙集成的问题
- web开发 mysql数据库操作 之 分页技术
- 深入块存储服务Cinder(转)