diff options
author | aunsane <aunsane@gmail.com> | 2017-09-13 00:54:02 +0300 |
---|---|---|
committer | aunsane <aunsane@gmail.com> | 2017-09-13 00:54:24 +0300 |
commit | 2b8358694bdbe12eb2506e41d9dcfe8c6e13ba69 (patch) | |
tree | a33c81a1b7e05951ceb8103485ad2204e13470f0 | |
parent | 8b5a61afd06177b7774dee8c03f18f01188a3117 (diff) |
MirLua: m_enumerale: chenged syntax
-rw-r--r-- | plugins/MirLua/Modules/m_enumerable/src/main.cpp | 323 |
1 files changed, 159 insertions, 164 deletions
diff --git a/plugins/MirLua/Modules/m_enumerable/src/main.cpp b/plugins/MirLua/Modules/m_enumerable/src/main.cpp index 8494c1385a..f12b8fcc0c 100644 --- a/plugins/MirLua/Modules/m_enumerable/src/main.cpp +++ b/plugins/MirLua/Modules/m_enumerable/src/main.cpp @@ -1,106 +1,52 @@ #include "stdafx.h" -#define MT_ENUMERABLE "ENUMERABLE" - -/***********************************************/ - -static int lua_WhereIterator(lua_State *L) +static int lua__call(lua_State *L) { - int enumeratorRef = lua_tointeger(L, lua_upvalueindex(1)); - int whereRef = lua_tointeger(L, lua_upvalueindex(2)); + int enumeratorRef = *(int*)lua_touserdata(L, 1); int top = lua_gettop(L); - while (true) - { - lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); - lua_call(L, 0, LUA_MULTRET); - int nres = lua_gettop(L) - top; - if (lua_isnoneornil(L, top + 1)) - { - lua_pop(L, nres); - break; - } - - lua_rawgeti(L, LUA_REGISTRYINDEX, whereRef); - for (int i = top; i < top + nres; i++) - lua_pushvalue(L, i + 1); - lua_call(L, nres, 1); - if (lua_toboolean(L, -1)) - { - lua_pop(L, 1); - return nres; - } - lua_pop(L, nres + 1); - } - - lua_pushnil(L); + lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); + lua_call(L, 0, LUA_MULTRET); + int nres = lua_gettop(L) - top; - return 1; + return nres; } -static int lua_Where(lua_State *L) +static int lua__pairs(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); + int enumeratorRef = *(int*)lua_touserdata(L, 1); + + lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); - lua_pushinteger(L, enumeratorRef); - lua_pushvalue(L, 2); - lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); - lua_pushcclosure(L, lua_WhereIterator, 2); - enumeratorRef = luaL_ref(L, LUA_REGISTRYINDEX); - int *udata = (int*)lua_newuserdata(L, sizeof(int)); - *udata = enumeratorRef; - luaL_setmetatable(L, MT_ENUMERABLE); - return 1; } -static int lua_SelectIterator(lua_State *L) +static int lua__gc(lua_State *L) { - int enumeratorRef = lua_tointeger(L, lua_upvalueindex(1)); - int selectRef = lua_tointeger(L, lua_upvalueindex(2)); + int enumeratorRef = *(int*)lua_touserdata(L, 1); - int top = lua_gettop(L); - lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); - lua_call(L, 0, LUA_MULTRET); - int nres = lua_gettop(L) - top; - if (lua_isnoneornil(L, top + 1)) - { - lua_pop(L, nres); - return 0; - } - - lua_rawgeti(L, LUA_REGISTRYINDEX, selectRef); - lua_insert(L, top + 1); - lua_call(L, nres, LUA_MULTRET); - nres = lua_gettop(L) - top; + luaL_unref(L, LUA_REGISTRYINDEX, enumeratorRef); - return nres; + return 0; } -static int lua_Select(lua_State *L) +static luaL_Reg enumerableMeta[] = { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); + { "__call", lua__call }, + { "__pairs", lua__pairs }, + { "__gc", lua__gc }, - lua_pushinteger(L, enumeratorRef); - lua_pushvalue(L, 2); - lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); - lua_pushcclosure(L, lua_SelectIterator, 2); - enumeratorRef = luaL_ref(L, LUA_REGISTRYINDEX); - int *udata = (int*)lua_newuserdata(L, sizeof(int)); - *udata = enumeratorRef; - luaL_setmetatable(L, MT_ENUMERABLE); + { NULL, NULL } +}; - return 1; -} +/***********************************************/ static int lua_Any(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - bool hasFunc = lua_gettop(L) >= 2; - if(hasFunc) - luaL_checktype(L, 2, LUA_TFUNCTION); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + + if (lua_type(L, 1) > LUA_TNONE) + luaL_checktype(L, 1, LUA_TFUNCTION); int top = lua_gettop(L); while (true) @@ -114,9 +60,9 @@ static int lua_Any(lua_State *L) break; } - if (hasFunc) + if (lua_isfunction(L, 1)) { - lua_pushvalue(L, 2); + lua_pushvalue(L, 1); lua_insert(L, top + 1); lua_call(L, nres, 1); nres = lua_gettop(L) - top; @@ -143,10 +89,10 @@ static int lua_Any(lua_State *L) static int lua_First(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - bool hasFunc = lua_gettop(L) >= 2; - if (hasFunc) - luaL_checktype(L, 2, LUA_TFUNCTION); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + + if (lua_type(L, 1) > LUA_TNONE) + luaL_checktype(L, 1, LUA_TFUNCTION); int top = lua_gettop(L); while (true) @@ -160,9 +106,9 @@ static int lua_First(lua_State *L) break; } - if (hasFunc) + if (lua_isfunction(L, 1)) { - lua_pushvalue(L, 2); + lua_pushvalue(L, 1); for (int i = top; i < top + nres; i++) lua_pushvalue(L, i + 1); lua_call(L, nres, 1); @@ -185,10 +131,10 @@ static int lua_First(lua_State *L) static int lua_Last(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - bool hasFunc = lua_gettop(L) >= 2; - if (hasFunc) - luaL_checktype(L, 2, LUA_TFUNCTION); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + + if (lua_type(L, 1) > LUA_TNONE) + luaL_checktype(L, 1, LUA_TFUNCTION); int top = lua_gettop(L); lua_pushnil(L); @@ -204,9 +150,9 @@ static int lua_Last(lua_State *L) break; } - if (hasFunc) + if (lua_isfunction(L, 1)) { - lua_pushvalue(L, 2); + lua_pushvalue(L, 1); for (int i = top + nres; i < top + nres + newres; i++) lua_pushvalue(L, i + 1); lua_call(L, newres, 1); @@ -228,7 +174,7 @@ static int lua_Last(lua_State *L) static int lua_Count(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); int count = 0; while (true) @@ -252,7 +198,7 @@ static int lua_Count(lua_State *L) static int lua_ToArray(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); lua_newtable(L); for (int i = 1;; i++) @@ -275,11 +221,11 @@ static int lua_ToArray(lua_State *L) static int lua_ToTable(lua_State *L) { - int enumeratorRef = *(int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - bool hasValueSelectorFunc = lua_gettop(L) >= 3; - if (hasValueSelectorFunc) - luaL_checktype(L, 3, LUA_TFUNCTION); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + luaL_checktype(L, 1, LUA_TFUNCTION); + + if (lua_type(L, 2) > LUA_TNONE) + luaL_checktype(L, 2, LUA_TFUNCTION); lua_newtable(L); int top = lua_gettop(L); @@ -294,14 +240,14 @@ static int lua_ToTable(lua_State *L) break; } - lua_pushvalue(L, 2); + lua_pushvalue(L, 1); for (int i = top; i < top + nres; i++) lua_pushvalue(L, i + 1); lua_call(L, nres, 1); - if (hasValueSelectorFunc) + if (lua_isfunction(L, 2)) { - lua_pushvalue(L, 3); + lua_pushvalue(L, 2); for (int i = top; i < top + nres; i++) lua_pushvalue(L, i + 1); lua_call(L, nres, 1); @@ -316,35 +262,130 @@ static int lua_ToTable(lua_State *L) return 1; } +static int lua_Where(lua_State *L); +static int lua_Select(lua_State *L); + +static luaL_Reg enumerableApi[] = +{ + { "Where", lua_Where }, + { "Select", lua_Select }, + + { "Any", lua_Any }, + { "First", lua_First }, + { "Last", lua_Last }, + { "Count", lua_Count }, + + { "ToArray", lua_ToArray }, + { "ToTable", lua_ToTable }, + + { NULL, NULL } +}; + /***********************************************/ -static int lua__call(lua_State *L) +static void CreateMetatable(lua_State *L) { - int *enumeratorRef = (int*)luaL_checkudata(L, 1, MT_ENUMERABLE); + lua_newtable(L); + lua_pushvalue(L, -1); + lua_pushvalue(L, -3); + luaL_setfuncs(L, enumerableApi, 1); + lua_setfield(L, -2, "__index"); + luaL_setfuncs(L, enumerableMeta, 0); +} + +static int lua_WhereIterator(lua_State *L) +{ + int enumeratorRef = lua_tointeger(L, lua_upvalueindex(1)); + int whereRef = lua_tointeger(L, lua_upvalueindex(2)); int top = lua_gettop(L); - lua_rawgeti(L, LUA_REGISTRYINDEX, *enumeratorRef); - lua_call(L, 0, LUA_MULTRET); - int nres = lua_gettop(L) - top; + while (true) + { + lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); + lua_call(L, 0, LUA_MULTRET); + int nres = lua_gettop(L) - top; + if (lua_isnoneornil(L, top + 1)) + { + lua_pop(L, nres); + luaL_unref(L, LUA_REGISTRYINDEX, whereRef); + break; + } - return nres; + lua_rawgeti(L, LUA_REGISTRYINDEX, whereRef); + for (int i = top; i < top + nres; i++) + lua_pushvalue(L, i + 1); + lua_call(L, nres, 1); + if (lua_toboolean(L, -1)) + { + lua_pop(L, 1); + return nres; + } + lua_pop(L, nres + 1); + } + + lua_pushnil(L); + + return 1; } -static int lua__pairs(lua_State *L) +static int lua_Where(lua_State *L) { - int *enumeratorRef = (int*)luaL_checkudata(L, 1, MT_ENUMERABLE); + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + luaL_checktype(L, 1, LUA_TFUNCTION); - lua_rawgeti(L, LUA_REGISTRYINDEX, *enumeratorRef); + lua_pushinteger(L, enumeratorRef); + lua_pushvalue(L, 1); + lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); + lua_pushcclosure(L, lua_WhereIterator, 2); + enumeratorRef = luaL_ref(L, LUA_REGISTRYINDEX); + int *udata = (int*)lua_newuserdata(L, sizeof(int)); + *udata = enumeratorRef; + CreateMetatable(L); + lua_setmetatable(L, -2); return 1; } -static int lua__gc(lua_State *L) +static int lua_SelectIterator(lua_State *L) { - int *enumeratorRef = (int*)luaL_checkudata(L, 1, MT_ENUMERABLE); - luaL_unref(L, LUA_REGISTRYINDEX, *enumeratorRef); + int enumeratorRef = lua_tointeger(L, lua_upvalueindex(1)); + int selectRef = lua_tointeger(L, lua_upvalueindex(2)); - return 0; + int top = lua_gettop(L); + lua_rawgeti(L, LUA_REGISTRYINDEX, enumeratorRef); + lua_call(L, 0, LUA_MULTRET); + int nres = lua_gettop(L) - top; + if (lua_isnoneornil(L, top + 1)) + { + lua_pop(L, nres); + luaL_unref(L, LUA_REGISTRYINDEX, selectRef); + return 0; + } + + lua_rawgeti(L, LUA_REGISTRYINDEX, selectRef); + lua_insert(L, top + 1); + lua_call(L, nres, LUA_MULTRET); + nres = lua_gettop(L) - top; + + return nres; +} + +static int lua_Select(lua_State *L) +{ + int enumeratorRef = *(int*)lua_touserdata(L, lua_upvalueindex(1)); + luaL_checktype(L, 1, LUA_TFUNCTION); + + lua_pushinteger(L, enumeratorRef); + lua_pushvalue(L, 1); + lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); + lua_pushcclosure(L, lua_SelectIterator, 2); + enumeratorRef = luaL_ref(L, LUA_REGISTRYINDEX); + int *udata = (int*)lua_newuserdata(L, sizeof(int)); + *udata = enumeratorRef; + CreateMetatable(L); + lua_setmetatable(L, -2); + + return 1; } /***********************************************/ @@ -381,67 +422,21 @@ static int lua__new(lua_State *L) } int enumeratorRef = luaL_ref(L, LUA_REGISTRYINDEX); - int *udata = (int*)lua_newuserdata(L, sizeof(int)); *udata = enumeratorRef; - luaL_setmetatable(L, MT_ENUMERABLE); + CreateMetatable(L); + lua_setmetatable(L, -2); return 1; } /***********************************************/ -static luaL_Reg enumerableApi[] = -{ - { "Where", lua_Where }, - { "Select", lua_Select }, - - { "Any", lua_Any }, - { "First", lua_First }, - { "Last", lua_Last }, - { "Count", lua_Count }, - - { "ToArray", lua_ToArray }, - { "ToTable", lua_ToTable }, - - { NULL, NULL } -}; - -static luaL_Reg enumerableMeta[] = -{ - { "__call", lua__call }, - { "__pairs", lua__pairs }, - { "__gc", lua__gc }, - - { NULL, NULL } -}; - -static luaL_Reg methods[] = -{ - { "new", lua__new }, - - { NULL, NULL } -}; - -/***********************************************/ - extern "C" LUAMOD_API int luaopen_m_enumerable(lua_State *L) { - luaL_newlib(L, methods); - - luaL_newmetatable(L, MT_ENUMERABLE); - luaL_setfuncs(L, enumerableMeta, 0); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - luaL_setfuncs(L, enumerableApi, 0); - lua_pop(L, 1); - lua_createtable(L, 0, 1); lua_pushcfunction(L, lua__new); lua_setfield(L, -2, "new"); - lua_pushvalue(L, -1); - lua_setglobal(L, MT_ENUMERABLE); - lua_pop(L, 1); return 1; } |