Lua UserData

来源:互联网 发布:康耐视视觉软件下载 编辑:程序博客网 时间:2024/05/15 03:42
#pragma once#include "lua.h"#include "lualib.h"#include "lauxlib.h"#include "limits.h"#define BITS_PER_WORD (CHAR_BIT*sizeof(unsigned int))#define I_WORD(i) ((unsigned int)(i)/BITS_PER_WORD)#define I_BIT(i) (1<<((unsigned int)(i)%BITS_PER_WORD))#define checkarray(L) (NumArray*)luaL_checkudata(L,1,"xk.array");static unsigned int *getindex(lua_State* L,unsigned int *mask){NumArray* a = checkarray(L);int index = luaL_checkinteger(L, 2) - 1;luaL_argcheck(L, 0 <= index && index < a->size, 2, "index out of range");*mask = I_BIT(index);return &a->values[I_WORD(index)];}typedef struct NumArray{int size;unsigned int values[1];//可变部分}NumArray;static int newarray(lua_State* L){int i, n;size_t nbytes;NumArray* a;n = luaL_checkinteger(L,1);luaL_argcheck(L, n >= 1, 1, "invalid size");nbytes = sizeof(NumArray) + sizeof(unsigned int)*I_WORD(n - 1);a = (NumArray*)lua_newuserdata(L, nbytes);a->size = n;for (i = 0; i<I_WORD(n - 1); i++){a->values[i] = 0;}lua_getmetatable(L, "xk.array");lua_setmetatable(L,-2);return 1;}static int setarray(lua_State* L){/*NumArray* a = (NumArray*)lua_touserdata(L, 1);int index = luaL_checkinteger(L, 2) - 1;luaL_checkany(L, 3);luaL_argcheck(L, a != NULL, 1, "'array' expected");luaL_argcheck(L, 0 <= index && index < a->size, 2, "index out of range");if (lua_toboolean(L, 3)){a->values[I_WORD(index)] |= I_BIT(index);}else{a->values[I_WORD(index)] &= -I_BIT(index);}*/unsigned int mask;unsigned int *entry = getindex(L,&mask);luaL_checkany(L,3);if(lua_toboolean(L,3)){*entry |= mask;}else{*entry &= mask;}return 0;}static int getarray(lua_State* L){/*NumArray* a = (NumArray*)lua_touserdata(L, 1);int index = luaL_checkinteger(L, 2) - 1;luaL_argcheck(L, a != NULL, 1, "array expected");luaL_argcheck(L, 0 <= index && index < a->size, 2, "index out of range");lua_pushboolean(L, a->values[I_WORD(index)] & I_BIT(index));*/unsigned int mask;unsigned int* entry = getindex(L, &mask);lua_pushboolean(L,*entry & mask);return 1;}static int getsize(lua_State* L){//NumArray* a = (NumArray*)lua_touserdata(L, 1);//luaL_argcheck(L, a != NULL, 1, "array expected");NumArray* a = checkarray(L);lua_pushstring(L, a->size);return 1;}static const luaL_Reg lua_xk_lib[] ={{ "sum",lua_sum },{ "map",lua_map },{ "split",lua_split},{"array",newarray},{"set",setarray},{"get",getarray},{"size",getsize},{ NULL,NULL }};extern  __declspec(dllexport) int luaopen_LuaLibrary(lua_State* L){luaL_newmetatable(L, "xk.array");luaL_newlib(L, lua_xk_lib);return 1;}

0 0
原创粉丝点击