1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
#include "LuaValue.h"
#include "LuaException.h"
namespace {
using namespace luacpp;
ValueType luaToEnumType(int luaType) {
switch (luaType) {
case LUA_TNONE:
return ValueType::NONE;
case LUA_TNIL:
return ValueType::NIL;
case LUA_TBOOLEAN:
return ValueType::BOOLEAN;
case LUA_TLIGHTUSERDATA:
return ValueType::LIGHTUSERDATA;
case LUA_TNUMBER:
return ValueType::NUMBER;
case LUA_TSTRING:
return ValueType::STRING;
case LUA_TTABLE:
return ValueType::TABLE;
case LUA_TFUNCTION:
return ValueType::FUNCTION;
case LUA_TUSERDATA:
return ValueType::USERDATA;
case LUA_TTHREAD:
return ValueType::THREAD;
default:
return ValueType::NONE;
}
}
}
namespace luacpp {
LuaValue LuaValue::createNil(lua_State* L)
{
lua_pushnil(L);
LuaValue val(L);
val.setReference(UniqueLuaReference::create(L));
return val;
}
LuaValue::LuaValue() = default;
LuaValue::LuaValue(lua_State* state) : _luaState(state)
{
Assertion(state != nullptr, "Lua state pointer is not valid!");
}
LuaValue::LuaValue(const LuaValue&) = default;
LuaValue& LuaValue::operator=(const LuaValue&) = default;
LuaValue::LuaValue(LuaValue&&) noexcept = default;
LuaValue& LuaValue::operator=(LuaValue&&) noexcept = default;
LuaValue::~LuaValue() = default;
void LuaValue::setReference(const LuaReference& ref)
{
this->_reference = ref;
this->_luaState = ref->getState();
if (isValid()) {
this->_reference->pushValue(_luaState);
this->_luaType = luaToEnumType(lua_type(_luaState, -1));
lua_pop(_luaState, 1);
} else {
_luaType = ValueType::NONE;
}
}
const LuaReference LuaValue::getReference() const {
return _reference;
}
ValueType LuaValue::getValueType() const {
return _luaType;
}
bool LuaValue::isValid() const {
return _reference && _reference->isValid();
}
bool LuaValue::pushValue(lua_State* thread, bool manualStackAllocation) const
{
if (this->_reference->isValid()) {
this->_reference->pushValue(thread, manualStackAllocation);
return true;
} else {
return false;
}
}
lua_State* LuaValue::getLuaState() const { return _luaState; }
namespace convert {
void pushValue(lua_State* luaState, const LuaValue& value) { value.pushValue(luaState); }
bool popValue(lua_State* luaState, LuaValue& target, int stackposition, bool remove)
{
if (!internal::isValidIndex(luaState, stackposition)) {
return false;
}
target.setReference(UniqueLuaReference::create(luaState, stackposition));
if (remove) {
lua_remove(luaState, stackposition);
}
return true;
}
}
}
|