diff --git a/luprex/core/cpp/table.cpp b/luprex/core/cpp/table.cpp index 41c0b3b3..07235b3f 100644 --- a/luprex/core/cpp/table.cpp +++ b/luprex/core/cpp/table.cpp @@ -316,6 +316,36 @@ LuaDefine(deque_nthr, "c") { return LS.result(); } +LuaDefine(deque_setl, "c") { + LuaArg deque, nn, val; + LuaStack LS(L, deque, nn, val); + int left, fill, max; + deque_get_info(L, deque.index(), &left, &fill, &max); + int n = LS.ckint(nn); + if ((n < 1) || (n > fill)) { + luaL_error(L, "invalid index"); + return LS.result(); + } + int target = (left + n - 1) & (max - 1); + LS.rawseti(deque, DEQUE_BASE + target, val); + return LS.result(); +} + +LuaDefine(deque_setr, "c") { + LuaArg deque, nn, val; + LuaStack LS(L, deque, nn, val); + int left, fill, max; + deque_get_info(L, deque.index(), &left, &fill, &max); + int n = LS.ckint(nn); + if ((n < 1) || (n > fill)) { + luaL_error(L, "invalid index"); + return LS.result(); + } + int target = (left + fill - n) & (max - 1); + LS.rawseti(deque, DEQUE_BASE + target, val); + return LS.result(); +} + LuaDefine(deque_findl, "c") { LuaArg deque, val; LuaRet pos; diff --git a/luprex/core/cpp/table.hpp b/luprex/core/cpp/table.hpp index 315c6cd9..52d1e557 100644 --- a/luprex/core/cpp/table.hpp +++ b/luprex/core/cpp/table.hpp @@ -85,6 +85,11 @@ int deque_popr(lua_State *L); int deque_nthl(lua_State *L); int deque_nthr(lua_State *L); +// Set (overwrite) the nth element in a deque. +// +int deque_setl(lua_State *L); +int deque_setr(lua_State *L); + // // Search a deque for a value. //