LuaState tovalue, pushvalue for dynamic::Value

This commit is contained in:
MihailRis
2024-04-01 00:04:10 +03:00
parent 8950f4ecd5
commit 75a7b89fc8
9 changed files with 126 additions and 31 deletions
+51
View File
@@ -205,6 +205,32 @@ int lua::LuaState::pushvalue(int idx) {
return 1;
}
int lua::LuaState::pushvalue(const dynamic::Value& value) {
using dynamic::valtype;
switch (value.type) {
case valtype::boolean:
pushboolean(std::get<bool>(value.value));
break;
case valtype::integer:
pushinteger(std::get<integer_t>(value.value));
break;
case valtype::number:
pushnumber(std::get<number_t>(value.value));
break;
case valtype::string:
pushstring(std::get<std::string>(value.value).c_str());
break;
case valtype::none:
pushnil();
break;
case valtype::list:
throw std::runtime_error("type 'list' is not implemented");
case valtype::map:
throw std::runtime_error("type 'map' is not implemented");
}
return 1;
}
int lua::LuaState::pushglobals() {
lua_pushvalue(L, LUA_GLOBALSINDEX);
return 1;
@@ -248,6 +274,31 @@ const char* lua::LuaState::tostring(int idx) {
return lua_tostring(L, idx);
}
dynamic::Value lua::LuaState::tovalue(int idx) {
using dynamic::valtype;
auto type = lua_type(L, idx);
switch (type) {
case LUA_TNIL:
case LUA_TNONE:
return dynamic::Value(valtype::none, 0);
case LUA_TBOOLEAN:
return dynamic::Value::of(lua_toboolean(L, idx) == 1);
case LUA_TNUMBER: {
auto number = lua_tonumber(L, idx);
auto integer = lua_tointeger(L, idx);
if (number == (lua_Number)integer) {
return dynamic::Value::of(integer);
} else {
return dynamic::Value::of(number);
}
}
case LUA_TSTRING:
return dynamic::Value::of(lua_tostring(L, idx));
default:
throw std::runtime_error("lua type "+std::to_string(type)+" is not supported");
}
}
bool lua::LuaState::isstring(int idx) {
return lua_isstring(L, idx);
}
+4
View File
@@ -5,6 +5,8 @@
#include <string>
#include <stdexcept>
#include "../../../data/dynamic.h"
#ifndef LUAJIT_VERSION
#error LuaJIT required
#endif
@@ -36,6 +38,7 @@ namespace lua {
int pushstring(const std::string& str);
int pushenv(int env);
int pushvalue(int idx);
int pushvalue(const dynamic::Value& value);
int pushnil();
int pushglobals();
void pop(int n=1);
@@ -44,6 +47,7 @@ namespace lua {
bool toboolean(int idx);
luaint tointeger(int idx);
luanumber tonumber(int idx);
dynamic::Value tovalue(int idx);
const char* tostring(int idx);
bool isstring(int idx);
bool isfunction(int idx);