lua简单包装
#ifndef _LUA_WRAPPER_
#define _LUA_WRAPPER_ extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <vector>
#include <string>
#include <assert.h> static size_t Lua_GetSize(lua_State* L, int pos)
{
if (lua_istable(L, pos))
{
return lua_rawlen(L, pos);
}
return 0;
} static void Lua_Remove(lua_State* L, int n)
{
if (n > 0)
{
lua_pop(L, n);
}
else if (n < 0)
{
int top = lua_gettop(L);
lua_pop(L, top);
}
} static int Lua_CreateRef(lua_State* L)
{
if (lua_isfunction(L, -1))
{
return luaL_ref(L, LUA_REGISTRYINDEX);
}
return 0;
} static void Lua_DeleteRef(lua_State* L,int ref)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
luaL_unref(L, LUA_REGISTRYINDEX, ref);
} /*****************************************************************/ static void Lua_Pack(lua_State * L, int value)
{
lua_pushinteger(L, value);
}
static void Lua_Pack(lua_State* L, size_t value)
{
lua_pushinteger(L, value);
}
static void Lua_Pack(lua_State* L, float value)
{
lua_pushnumber(L, value);
}
static void Lua_Pack(lua_State* L, double value)
{
lua_pushnumber(L, value);
}
static void Lua_Pack(lua_State* L, const char* value)
{
lua_pushstring(L, value);
}
static void Lua_Pack(lua_State* L, const std::string& value)
{
lua_pushlstring(L, value.c_str(), value.length());
} template<class T>
static void Lua_Pack(lua_State* L, const std::vector<T>& value)
{
lua_newtable(L);
for (size_t i = 0; i < value.size(); ++i)
{
Lua_Pack(L, value[i]);
lua_rawseti(L,-2,i+1);
}
} template<typename T1, typename T2, typename... Args>
static void Lua_Pack(lua_State* L, const T1& value1, const T2& value2, Args&... args)
{
Lua_Pack(L, value1);
Lua_Pack(L, value2, args...);
} /*******************************************************/ static int Lua_Unpack(lua_State* L, int& value)
{
if (lua_isnumber(L, -1))
{
value = (int)lua_tointeger(L, -1);
lua_pop(L, 1);
return 1;
}
return 0;
} static int Lua_Unpack(lua_State* L, size_t& value)
{
if (lua_isnumber(L, -1))
{
value = (size_t)lua_tointeger(L, -1);
lua_pop(L, 1);
return 1;
}
return 0;
} static int Lua_Unpack(lua_State* L, float& value)
{
if (lua_isnumber(L, -1))
{
value = (float)lua_tonumber(L, -1);
lua_pop(L, 1);
return 1;
}
return 0;
}
static int Lua_Unpack(lua_State* L, double& value)
{
if (lua_isnumber(L, -1))
{
value = lua_tonumber(L, -1);
lua_pop(L, 1);
return 1;
}
return 0;
} static int Lua_Unpack(lua_State* L, const char* value)
{
if (lua_isstring(L, -1))
{
value = lua_tostring(L, -1);
lua_pop(L,1);
return 1;
}
return 0;
} static int Lua_Unpack(lua_State* L, std::string& value)
{
if (lua_isstring(L, -1))
{
const char* str = lua_tostring(L, -1);
value.append(str);
lua_pop(L, 1);
return 1;
}
return 0;
} template<class T>
static void Lua_Unpack(lua_State* L, std::vector<T>& value)
{
T t;
if (!lua_istable(L, -1))
return 0;
size_t len = Lua_GetSize(L, -1);
for (size_t i = 1; i <= len; ++i)
{
lua_rawgeti(L, -1, i);
if (Lua_Unpack(L, t))
value.push_back(t);
else
lua_pop(L, 1);
}
lua_pop(L, 1);
return 1;
} template<typename T1, typename T2, typename... Args>
static void Lua_Unpack(lua_State* L, T1& value1, T2& value2, Args&... args)
{
Lua_Unpack(L, value2, args...);
Lua_Unpack(L, value1);
}
/*******************************************/ static bool Lua_LoadFile(lua_State* L, const char* filename)
{
if (luaL_dofile(L, filename))
{
const char* err = lua_tostring(L, -1);
printf("loadl file %s failed , err: %s\n",filename,err);
lua_pop(L, 1);
return false;
}
return true;
} static void Lua_Split(const char* str, char c, std::vector<std::string>& result)
{
const char* pre = str;
while (*str != 0)
{
while (*str && *str != c) ++str;
result.push_back(std::string(pre,str));
pre = *str ? ++str : str;
}
} /*****************************************************************/ static int Lua_GetField(lua_State* L, int index, const char* key)
{
if (lua_istable(L, index))
{
lua_pushstring(L, key);
lua_rawget(L, index);
return 1;
}
return 0;
} static int Lua_GetField(lua_State* L, int index, int i)
{
if (lua_istable(L, index))
{
lua_rawgeti(L, index, i);
return 1;
}
return 0;
} template<typename T1,typename T2,typename... Args>
static int Lua_GetField(lua_State* L, int index, T1& t1, T2& t2, Args& ... args)
{
int ret = Lua_GetField(L, index, t1) + Lua_GetField(L, index, t2, args...);
return ret;
} /**********************************************************/
static int Lua_TopField(lua_State* L, const char* key)
{
if (lua_istable(L, -1))
{
lua_pushstring(L, key);
lua_rawget(L, -1);
return 1;
}
return 0;
} static int Lua_TopField(lua_State* L, int i)
{
if (lua_istable(L, -1))
{
lua_rawgeti(L, -1, i);
return 1;
}
return 0;
} template<typename T1,typename T2,typename... Args>
static int Lua_TopField(lua_State* L, T1& t1, T2& t2, Args... args)
{
int ret = Lua_TopField(L, t1) + Lua_TopField(L, t2, args...);
return ret;
} static bool Lua_CallFunc(lua_State* L, int rt)
{
if (!lua_isfunction(L, -1))
return false;
if (lua_pcall(L, 0, rt, 0) != 0)
{
const char* err = lua_tostring(L, -1);
printf("call lua func failed!!!, err:%s\n", err);
lua_pop(L, 1);
return false;
}
return true;
} template<typename T, typename... Args>
static bool Lua_CallFunc(lua_State* L,int rt, T& t, Args&... args)
{
const int len = sizeof...(args) + 1;
if (!lua_isfunction(L, -len))
return false; Lua_Pack(L, t, args...) ;
if (lua_pcall(L, len, rt, 0) != 0 )
{
const char* err = lua_tostring(L, -1);
printf("call lua func failed!!!, err:%s\n",err);
lua_pop(L, 1);
return false;
}
return true;
} #endif
lua简单包装的更多相关文章
- CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据
1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...
- lua简单入门
一.安装windows下的lua环境,luaforwindows 下载最新的5.3版本,下载地址: https://sourceforge.net/projects/luabinaries/files ...
- SpringBoot+RestTemplate 简单包装
RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应的类. 在SpringBoot中对这个类进行 ...
- Lua刚開始学习的人(一)--Lua 简单教学
近期因为工作原因.临时木有<Oracle起步学习>续集.领导知道学习下Lua脚本语言.看了一周了.趁热打铁,留下点实用的东西吧. 本系列会主要针对宿主语言为 Delphi,原理都是一样的, ...
- [转]通过AngularJS directive对bootstrap日期控件的的简单包装
本文转自:http://www.cnblogs.com/Benoly/p/4109460.html 最近项目上了AngularJS,而原来使用的日期控件的使用方式也需要改变,于是开始了倒腾,看了官方的 ...
- [整理]通过AngularJS directive对bootstrap日期控件的的简单包装
最近项目上了AngularJS,而原来使用的日期控件的使用方式也需要改变,于是开始了倒腾,看了官方的例子,可以使用AngularJS的directive做简单的处理,这样在html里直接使用申明的的形 ...
- 基于nginx+lua简单的灰度发布系统
upstream.conf upstream grey_1 { keepalive 1000; server localhost:8020; } upstream grey_2 { keepalive ...
- 正确lua简单的扩展,可以加速相关C++数据。
很早的时候,我有一件事纠结.如果,我在这里C++打开界面脚本.使用C++其中一个目标,和.我的程序有很多不同的lua虚拟机.每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lu ...
- lua学习笔记10:lua简单的命令行
前面反复使用的命令行,好学喜欢命令行: 一 格公式 lua [options][script][args] 两 详细命令 -e 直接命令传递一个lua -l 加载文件 -i 进入交互模式 比例如.端子 ...
随机推荐
- CIE-LUV是什么颜色特征
参考文献:维基百科 a simple-to-compute transformation of the 1931 CIE XYZ color space, but which attempted pe ...
- C#方法(函数)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 去掉PowerDesigner生成SQL脚本中字段名带的引号
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照“”中的名称建表,如果没有“”,会按照ORACL ...
- python下的select模块使用 以及epoll与select、poll的区别
python下的select模块使用 以及epoll与select.poll的区别 先说epoll与select.poll的区别(总结) 整理http://www.zhihu.com/question ...
- posix对线程的调整
fork 当多线程进程调用fork创建子进程时,从fork返回时,只有调用fork的线程在进程内存在(其他线程在子进程中不存在,好比调用pthread_exit退出,不再拥有私有数据destructo ...
- VMware ESXi 网卡
esxcfg-vswitch -A "VMkernel09" vswitch0 esxcfg-vmknic -a "VMkernel09" -i 172.10. ...
- springboot 有关拦截器遇到的问题
最近改造搜索服务,原来是用 ngx + lua 写的,虽然性能很高,带来的问题是可维护性不太方便,不是指lua语言方面,是因为团队就2个开发人员,另外一个开发人员的擅长语言是Java,于是准备将搜索服 ...
- ASP/ASP.NET/VB6文件上传
1. asp asp 上传文件真的蛋疼,很麻烦,有时候就用第三方组件,或者比较复杂的写法来实现无组件上传. 测试OK的一个叫风声无组件上传类 V2.1 [Fonshen UpLoadClass Ver ...
- [转]FluentData
本文来自:http://fluentdata.codeplex.com/wikipage?title=Fluency&referringTitle=Home Documentation Fl ...
- js将UTC时间转化为当地时区时间(UTC转GMT)
我们在进行网站开发的时候有可能会涉及到国外的用户或者用户身在国外,这时就会存在时差问题,比如说我们在中国的时间是08:00,但是此时韩国的时间是09:00,如果在网页上需要进行相关显示的话就会出现问题 ...