Lua之实现一个bool数组
来源:互联网 发布:精易编程助手 编辑:程序博客网 时间:2024/06/05 03:54
参考《Lua程序设计》第28章 用户自定义类型
#include <stdlib.h>#include <limits.h>#include "lua.h"#include "lauxlib.h"#define BITS_PER_WORD (CHAR_BIT*sizeof(unsigned int))#define I_WORD(n) ((n-1+BITS_PER_WORD)/BITS_PER_WORD)#define I_MASK(n) (1<<((n-1)%BITS_PER_WORD))typedef struct BoolArray { int size; unsigned int value[0];} BoolArray;static int newArray(lua_State *L){ int n = luaL_checkint(L, 1); luaL_argcheck(L, n>0, 1, "invalid size"); int nbytes = sizeof(int) + sizeof(unsigned int)*I_WORD(n); BoolArray *b = (BoolArray*)lua_newuserdata(L, nbytes); b->size = n; int i=0; for(; i<I_WORD(n); ++i) b->value[i] = 0; luaL_getmetatable(L, "ba.meta"); lua_setmetatable(L, -2);//将创建的userdata的metatable设为栈顶的ba.meta return 1;}static int setArray(lua_State *L){ BoolArray *b = (BoolArray*)luaL_checkudata(L, 1, "ba.meta"); int index = luaL_checkint(L, 2); luaL_argcheck(L, index>0 && index<=b->size, 1, "index out of range"); if(lua_toboolean(L, 3)) b->value[I_WORD(index)] |= I_MASK(index); else b->value[I_WORD(index)] &= ~I_MASK(index); return 0;}static int getArray(lua_State *L){ BoolArray *b = (BoolArray*)luaL_checkudata(L, 1, "ba.meta"); int index = luaL_checkint(L, 2); luaL_argcheck(L, index>0 && index<=b->size, 1, "index out of range"); lua_pushboolean(L, b->value[I_WORD(index)] & I_MASK(index)); return 1;}static int getSize(lua_State *L){ BoolArray *b = (BoolArray*)luaL_checkudata(L, 1, "ba.meta"); lua_pushinteger(L, b->size); return 1;}static const luaL_Reg lib[] = { {"new", newArray}, {NULL, NULL}};static const luaL_Reg lib_m[] = { {"size", getSize}, {"set", setArray}, {"get", getArray}, {NULL, NULL}};LUA_API int luaopen_boolarray (lua_State *L) { luaL_newmetatable(L, "ba.meta");//创建一个metatable lua_pushvalue(L, -1);//复制它 lua_setfield(L, -2, "__index");//将它的__index指向它自己 luaL_register(L, NULL, lib_m);//为栈顶的table添加一些成员 luaL_register(L, "boolarray", lib);//创建名为boolarray的table,并为其添加一个new成员 return 1;}
编译
gcc -fpic -shared boolarray.c -o boolarray.so
测试
require "boolarray"m=boolarray.new(4)print(m:size())m:set(3,true)m:set(2,false)print(m:get(1))print(m:get(2))print(m:get(3))print(m:get(4))
阅读全文
0 0
- Lua之实现一个bool数组
- lua基础之数组
- LUA的数组迭代器实现
- 实现一个lua 调试器
- 实现一个lua 调试器
- lua实现一个2048小游戏
- bool数组初始化
- C++怎么传递一个数组到LUA
- 快速排序之Lua实现
- 学习lua之实现类
- lua 之如何便利数组和table
- PHP之Bool类型
- java基础之实现一个简单的数组
- 一个数组实现俩个栈
- 一个数组实现连个栈
- 一个简易版本的lua debugger实现
- 一个纯C#的Lua 5.2实现
- lua实现一个小数取整数部分
- mysql查询表里的重复数据方法:
- 常用参考资料
- 关于Fragment的显示状态
- ex1
- 【微信公众号开发】自我学习第八章:群发信息
- Lua之实现一个bool数组
- 机器学习方法论
- erlang安装
- Python yield 使用浅析
- Android NDK: From Elementary to Expert Episode 11
- JAVA 路径详解
- Java中使用System.out.printf().如何控制输出格式及类型不一致的解决方法
- MySQL 字符截断攻击
- C语言中枚举(enum)类型的用法