From d6672e59d0704f154b934a27dc22a15c68a91849 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 27 Nov 2016 22:29:49 +1100 Subject: [PATCH] RegionPager's API now takes a pager as an optional first parameter to all methods --- region_pager_api.cpp | 132 ++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 72 deletions(-) diff --git a/region_pager_api.cpp b/region_pager_api.cpp index 06392f6..7a7a253 100644 --- a/region_pager_api.cpp +++ b/region_pager_api.cpp @@ -27,124 +27,124 @@ #include //DOCS: These glue functions simply wrap RegionPagerLua's methods +//DOCS: These functions take a pager as an optional first parameter + //NOTE: zero indexing is used here, but not in the region API -static int setTile(lua_State* L) { - //get the global pager +static RegionPagerLua* getPager(lua_State* L) { + RegionPagerLua* pager = nullptr; + + //get the pager, either the global pager or the parameter pager lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); + if (lua_isnil(L, -1)) { + pager = reinterpret_cast(lua_touserdata(L, 1)); + } + else { + pager = reinterpret_cast(lua_touserdata(L, -1)); + } lua_pop(L, 1); + return pager; +} + +static int setTile(lua_State* L) { + //get the pager + RegionPagerLua* pager = getPager(L); + //set tile - int ret = pager->SetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); + int ret = pager->SetTile(lua_tointeger(L, -4), lua_tointeger(L, -3), lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushinteger(L, ret); return 1; } static int getTile(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //get tile - int ret = pager->GetTile(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_tointeger(L, 3)); + int ret = pager->GetTile(lua_tointeger(L, -3), lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushinteger(L, ret); return 1; } static int setSolid(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //set solid - bool ret = pager->SetSolid(lua_tointeger(L, 1), lua_tointeger(L, 2), lua_toboolean(L, 3)); + bool ret = pager->SetSolid(lua_tointeger(L, -3), lua_tointeger(L, -2), lua_toboolean(L, -1)); lua_pushboolean(L, ret); return 1; } static int getSolid(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //get solid - bool ret = pager->GetSolid(lua_tointeger(L, 1), lua_tointeger(L, 2)); + bool ret = pager->GetSolid(lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushboolean(L, ret); return 1; } static int getRegion(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //get region - Region* region = pager->GetRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); + Region* region = pager->GetRegion(lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushlightuserdata(L, region); return 1; } static int loadRegion(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //load region - Region* region = pager->LoadRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); + Region* region = pager->LoadRegion(lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushlightuserdata(L, region); return 1; } static int saveRegion(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //save region - Region* region = pager->SaveRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); + Region* region = pager->SaveRegion(lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushlightuserdata(L, region); return 1; } static int createRegion(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //create region - Region* region = pager->CreateRegion(lua_tointeger(L, 1), lua_tointeger(L, 2)); + Region* region = pager->CreateRegion(lua_tointeger(L, -2), lua_tointeger(L, -1)); lua_pushlightuserdata(L, region); return 1; } static int unloadRegion(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //two argument types: coords & the region itself - switch(lua_type(L, 1)) { + switch(lua_type(L, -1)) { case LUA_TNUMBER: //unload using coords pager->UnloadIf([&](Region const& region) -> bool { - int x = lua_tointeger(L, 1); - int y = lua_tointeger(L, 2); + int x = lua_tointeger(L, -2); + int y = lua_tointeger(L, -1); return region.GetX() == x && region.GetY() == y; }); break; case LUA_TLIGHTUSERDATA: //unloading using reference pager->UnloadIf([&](Region const& region) -> bool { - return (®ion) == lua_touserdata(L, 1); + return (®ion) == lua_touserdata(L, -1); }); break; } @@ -152,10 +152,8 @@ static int unloadRegion(lua_State* L) { } static int setOnLoad(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //set on load luaL_unref(L, LUA_REGISTRYINDEX, pager->GetLoadReference()); @@ -164,10 +162,8 @@ static int setOnLoad(lua_State* L) { } static int setOnSave(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //set on save luaL_unref(L, LUA_REGISTRYINDEX, pager->GetSaveReference()); @@ -176,10 +172,8 @@ static int setOnSave(lua_State* L) { } static int setOnCreate(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //set on create luaL_unref(L, LUA_REGISTRYINDEX, pager->GetCreateReference()); @@ -188,10 +182,8 @@ static int setOnCreate(lua_State* L) { } static int setOnUnload(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //set on unload luaL_unref(L, LUA_REGISTRYINDEX, pager->GetUnloadReference()); @@ -200,14 +192,12 @@ static int setOnUnload(lua_State* L) { } static int forEach(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //run the given closure on each region pager->ForEach([L](Region& r) -> void { - lua_pushvalue(L, 1); //copy the closure passed + lua_pushvalue(L, -1); //copy the closure passed lua_pushlightuserdata(L, &r); //push this region //call the function, catching any errors @@ -221,10 +211,8 @@ static int forEach(lua_State* L) { //debugging static int containerSize(lua_State* L) { - //get the global pager - lua_getglobal(L, REGION_PAGER_NAME); - RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, -1)); - lua_pop(L, 1); + //get the pager + RegionPagerLua* pager = getPager(L); //push container size lua_pushinteger(L, pager->GetContainer()->size());