スタック操作系の関数を紹介します.
int lua_gettop(lua_State* L);
void lua_settop(lua_State* L, int index);
void lua_pushvalue(lua_State* L, int index);
void lua_remove(lua_State* L, int index);
void lua_insert(lua_State* L, int index);
void lua_replace(lua_State* L, int index);
lua_gettop関数はスタックに積まれている数を取得します.
lua_settop関数はスタックに積まれている値の数を変更します.
スタックの値を削除(ポップ)するのに使われています.
indexには変更後のスタックの数を指定します.
ただし,マイナスのindexは上から積まれたスタックの数を表しています.
つまり,
lua_settop(L, -1); //一番上のスタック
は一番上のスタックまで残すという意味です.
つまりこの操作をしてもスタックには変化がありません.
スタックを操作する時にはマイナスのindexを指定する方法がよく使われます.
スタックを空にするにはindexに0を指定します.
lua_settop(L, 0); //スタックをすべて削除
スタックの値をポップする場合はlua_pop関数を利用しましたが,
この関数は実はlua_settop関数のマクロとなっています.
#define lua_pop(L, n) lua_settop(L, -(n) - 1)
lua_pushvalue関数は指定したindexの値を
コピーしてスタックにプッシュします.
lua_remove関数は指定したindexの値を削除します.
要素を削除したら,指定したindexの上に乗っていた要素をずらして隙間を埋めます.
lua_insert関数はスタックの一番上にある要素を指定した
indexに挿入します.
lua_replace関数はスタックの一番上の要素を指定した
indexに置き換えます.
スタック操作系の関数のサンプルコードをお見せします.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
void dumpStack(lua_State* L)
{
(略)
}
int main (void)
{
lua_State* L = luaL_newstate();
lua_pushnumber(L, 10); //10 push
lua_pushnumber(L, 20); //20 push
lua_pushnumber(L, 30); //30 push
lua_pushnumber(L, 40); //40 push
dumpStack(L);
//スタックの要素数取得
printf("現在のスタックの数 : %d\n", lua_gettop(L));
//上から3つ目の要素をコピーしてスタックに積む
printf("pushvalue -3\n");
lua_pushvalue(L, -3);
dumpStack(L);
//上から3つ目の要素を削除する
printf("remove -3\n");
lua_remove(L, -3);
dumpStack(L);
//スタックトップの値を2番目に挿入する
printf("insert 2\n");
lua_insert(L, 2);
dumpStack(L);
//スタックトップの値を2番目の要素とする
printf("replace 2\n");
lua_replace(L, 2);
dumpStack(L);
lua_close(L);
return 0;
}
実行結果
Stack[ 4- number] : 40.000000
Stack[ 3- number] : 30.000000
Stack[ 2- number] : 20.000000
Stack[ 1- number] : 10.000000
現在のスタックの数 : 4
pushvalue -3
Stack[ 5- number] : 20.000000
Stack[ 4- number] : 40.000000
Stack[ 3- number] : 30.000000
Stack[ 2- number] : 20.000000
Stack[ 1- number] : 10.000000
remove -3
Stack[ 4- number] : 20.000000
Stack[ 3- number] : 40.000000
Stack[ 2- number] : 20.000000
Stack[ 1- number] : 10.000000
insert 2
Stack[ 4- number] : 40.000000
Stack[ 3- number] : 20.000000
Stack[ 2- number] : 20.000000
Stack[ 1- number] : 10.000000
replace 2
Stack[ 3- number] : 20.000000
Stack[ 2- number] : 40.000000
Stack[ 1- number] : 10.000000