Lua之LuaWrapper

1660阅读 0评论2018-12-10 scq2099yt
分类:C/C++

        Lua由于其小巧、几乎无依赖、性能接近于C/C++,通常被用来作为胶水语言存在,用于串联C/C++组件或者在C/C++中完成热加载的业务逻辑,这样在C/C++和Lua之间交互就必不可少了。通过C Lua API能解锁这一技能,但是这项工作不是一件轻而易举或者“高段位”的事情,不要惊慌,只从有了LuaWrapper,妈妈再也不用担心C/C++和Lua之间交互的那些烂事儿了,哔哔了这么久,终于要进正题了。
1.概述
        LuaWrapper的源码请看。
        LuaWrapper设计的初衷是为了方便Lua和C++之间桥接的库。库小巧(单头文件)、简单、快速和类型安全。除了lua库自己外,没有额外的依赖库,且不需要预编译;头文件简单到可以直接拖入工程就可以立即使用了。它甚至在一定程度上支持类继承。对象可以在Lua或C++中创建,并来回传递。
        LuaWrapper的作者非常良心,提供了简单易用的示例工程用来介绍如何使用库,具体源码请看,关于示例的详细介绍后文书会详细介绍。
        在Lua中对象即userdata,但是通过metatable几乎可以当做table来使用。每个userdata分别都有一个__index和__newindex函数,这两个函数都映射到一个table中,该table隐式存储在注册表中。
        该库的主要函数如下:
        luaW_is
        luaW_to
        luaW_check
        luaW_push
        luaW_register
        luaW_extend
        luaW_hold
        luaW_release
(1)基本类型操作
        前四个函数允许您像处理基本类型一样操作任意类(比如:数值或者字符串),具体信息如下:
(a)luaW_is
        luaW_is允许您检查对象是否是您认为的对象,并将考虑is-a关系,除非设置了可选的严格参数。

(b)luaW_to
        luaW_to将返回一个类型为T的指针到您的对象(除非它是错误的类型,在这种情况下它将返回NULL)。
(2)注册一个类
        luaW_register用于注册一个类。
        运行luaW_register来为你的类创建一个table和metatable。这将创建一个table,并通过table参数指定函数名称,除了函数new外。这通常适用于于C++中的静态方法。metatable变成您的每个类对象的metatable。这些可以看成是成员函数或者方法。
        您还可以为没有默认构造函数或者需要指定set up或者tear down的类提供
构造函数和析构函数
。您也可以指定构造函数为NULL,这样意味着您将不能在您的类table中调用new函数。您将需要手工从C++推送对象。默认情况下,缺省构造函数用于创建对象,简单调用delete用于destroy对象。当使用构造函数的时候,您不能访问userdata的存储table。如果您想增加或者调整values到存储table,您可以使用指定的post构造函数metamethod(“__postctor”或者LUAW_POSTCTOR_KEY)。
        默认情况下,LuaWrapper使用C++对象的地址来标识唯一的对象。在某些情况下,这是不需要的,例如shared_ptrs。两个shared_ptrs他们自己有唯一的内存地址,但是仍然表示相同对象。对于这种情况,可以指定一个标识符函数,该函数负责将表示对象的key推送到stack上。
(3)扩展一个类

        luaW_extend用于扩展一个类。
        使用函数luaW_extend来扩展一个类,即T是一个类来扩展U。基类中的所有函数对派生类都是可用的(除非它们共享一个函数名,在这种情况下派生类的函数获胜)。
(4)指针所有权

        luaW_hold用于指定指针所有权,luaW_release用于释放指针所有权
        从Lua脚本创建对象(或者通过luaW_new创建)被认为是为Lua所有。所有权仅仅意味着当所有对它的引用都被移除时,垃圾收集器将删除该对象。在C++中创建并推送到Lua的对象不被认为是拥有的,除非luaW_hold在其上运行。LuaWrapper使用一个弱table来缓存对象,以防止__gc metamethod删除指向仍在使用的对象的指针。如果一个对象是在Lua中创建的,并且您不希望它属于Lua,那么您可以对它调用luaW_release
(5)Lua包装工具
        第二个文件即LuaWrapperUtil.hpp包含许多可能有用的附加函数,它们构建在核心LuaWrapper
API之上。其主要特性是一些函数,这些函数自动将interger类型转换为enum类型,并为指向对象的指针模板化getter和setter原语。LuaWrapperUtil.hpp中所有函数的前缀都是luaU_。文件的注释中提供了文档和一些示例。

2.实例
       未完,待续。。。。。
上一篇:GPU架构系列--持续更新
下一篇:没有了