tolua

Using Lua API and tag method facilities, tolua maps C/C++ constants, external variables, functions, classes, and methods to Lua.How tolua works(1)創(chuàng)建a package file (a C/C++ cleaned header file) listing the constants, variables, functions, classes, and methods we want to export to the Lua environment.(2)parses this file and creates a C/C++ file that automatically binds the C/C++ code to Lua. (3) accesed from LuaHow to use toLua由(1)an executable (2)and a library組成the executable represents the parser that reads a package file and output a C/C++ code that implements the binding to access the C/C++ features from Lua.tolua -o myfile.c myfile.pkgtolua -H lua_XXX.h -o lua_XXX.cpp -n pkgXXX XXX.pkgtolua -n pkgname -o myfile.c myfile.pkgwhen using C++, we can opt for automatic initializationtolua -a -n pkgname -o myfile.c myfile.pkgautomatic initialization sometimes does not work也可以調(diào)用tolua_pkgname_close(void);解綁可以使用-H選項將open與close操作導(dǎo)出到頭文件中。void tolua_restorestate (void);Basic Conceptspackage file may include other package file, use $Basic types

char int float double ? ? -> ? ? ? number

char* ? ? ? -> ? ? ? ? ? ? ?string

void* ? ? ? -> ? ? ? ? ? ? ?userdata

tolua ignores const modifier

Functions in C/C++ can also manipulate Lua objects explicitly.

lua_Object也是一種基本類型。

User defined types

非Basic Types均為用戶自定義類型,are mapped to tagged userdata type in Lua.

Lua can only store pointers to 自定義類型。

NULL and nil

Typedefs

必須使用之前聲明

typedef double real;

Including real header files

$#include "header1.h"

可以使用C/C++支持的注釋方式進(jìn)行注釋。

Binding constants

(1) define's

#define NAME [VALUE]

(2) enum's

enum {

NAME1[=VALUE1],

NAME2[=VALUE2]

};

Binding external variables

[extern] type var;

double v[10];//Lua中下標(biāo)從1開始

Binding functions

無參數(shù)時加void

Arrays

change to table

void func (int n, int m, double image[n*m]);

Overloaded functions

接受

但是只會根據(jù)參數(shù)轉(zhuǎn)換后的Lua類型進(jìn)行判斷

Default parameters values

void func(lua_Object lo = TOLUA_NIL)

void func(int a[5] = 0);

Multiple returned values

tolua uses feature of?Multiple returned values to simulate values passed by references

void swap (double* x, double* y);

or

void swap (double& x, double& y);

x, y = swap (x, y)

Binding struct fields

typdef struct [name] {

int x[10];

int y[10];

} Example;

Binding classes and methods

Specifying inheritance

class classname: public basename

{

/* class definition*/

};

Specifying exported memebers and methods

Constructors are called as static methods, named new,

Destructors are called as a conventional method called delete

virtual keyword has no effect in the package file

example:

class Point {

static int n;

double x;

double y;

static char* className(void);

Point (void);

Point (double px, double py);

~Point(void);

Point add (Point& other);

};

overloaded operators

operator+ - * / < > <= >=

operator[]

example:

double operator[](int index);

Module definition

module name

{

#define N

extern int var;

int func (...);

}

Renaming constants, variables and functions

#define CNAME @ ivar;

void cfunc @ ifunc (...);

class cannot be renamed, because they represent types in C.

Storing additional fields

based on table

Exported utility functions

tolua uses itself to export some utility functions to Lua, including its object-oriented framework.

tolua.using(table)

receives a table and maps all its fields to the global environment. thus we can map an entire module and access its features without the module prefix.

tolua.type(var)

returns a string representing the object type

tolua.tag("type")

returns type corresponding tag number

tolua.foreach(object)

this function filters all fields starting with a dot, not passing them to the provided callback function.

tolua.cast(object, "typename")

Returns the object "casted" to the given type. The object must represent an user type, otherwise return nil.

tolua.takeownership(object)

asks tolua to take the ownership of the given object.

This means the C/C++ object will be freed/destructed when garbage-collected by Lua. The object must represent an user type, otherwise an執(zhí)行錯誤產(chǎn)生。

tolua.class(table, base = nil)

the created class can inherit from a base class, previously created.

tolua.instance(table, class)

Sets the given table to be an instance of the given class.

example:

--define a Point class

classPoint = {x=0, y=0}

tolua.class(classPoint)--set as a class

--define print function

function classPoint:print()

print (self.x, self.y)

end

-- define add method

function classPoint:add(p2)

return Point{x=self.x+p2.x, y=self.y+p2.y}

end

-- define a Point constructor

function Point (p)

tolua.instance(p, classPoint) -- set as an instance of classPoint

return p

end

-- define a Color Point class

classColorPoint = {color = 'black' }

tolua.class(classColorPoint, classPoint) -- set as class inheriting from classPoint

-- define class methods

function classColorPoint:print()

print(self.x, self.y, self.color)

end

-- define Color Point constructor

function ColorPoint(p)

tolua.instance(p, classColorPoint) -- set as an instance of classColorPoint

return p

end

-- some valid codes would then be

p = Point{ x= 1}

q = ColorPoint{x=2, y =3, color =2)

r = p:add(q)

r:print()

Embedded Lua code

tolua allows us to embed Lua code in the C/C++ generated code.

$[

embedded Lua code

...

$]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容