大改
This commit is contained in:
126
csgo2/LuaBridge/luaBridge/detail/LuaHelpers.h
Normal file
126
csgo2/LuaBridge/luaBridge/detail/LuaHelpers.h
Normal file
@@ -0,0 +1,126 @@
|
||||
// https://github.com/vinniefalco/LuaBridge
|
||||
// Copyright 2012, Vinnie Falco <vinnie.falco@gmail.com>
|
||||
// Copyright 2007, Nathan Reed
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cassert>
|
||||
|
||||
namespace luabridge {
|
||||
|
||||
// These are for Lua versions prior to 5.2.0.
|
||||
//
|
||||
#if LUA_VERSION_NUM < 502
|
||||
inline int lua_absindex(lua_State* L, int idx)
|
||||
{
|
||||
if (idx > LUA_REGISTRYINDEX && idx < 0)
|
||||
return lua_gettop(L) + idx + 1;
|
||||
else
|
||||
return idx;
|
||||
}
|
||||
|
||||
inline void lua_rawgetp(lua_State* L, int idx, void const* p)
|
||||
{
|
||||
idx = lua_absindex(L, idx);
|
||||
lua_pushlightuserdata(L, const_cast<void*>(p));
|
||||
lua_rawget(L, idx);
|
||||
}
|
||||
|
||||
inline void lua_rawsetp(lua_State* L, int idx, void const* p)
|
||||
{
|
||||
idx = lua_absindex(L, idx);
|
||||
lua_pushlightuserdata(L, const_cast<void*>(p));
|
||||
// put key behind value
|
||||
lua_insert(L, -2);
|
||||
lua_rawset(L, idx);
|
||||
}
|
||||
|
||||
#define LUA_OPEQ 1
|
||||
#define LUA_OPLT 2
|
||||
#define LUA_OPLE 3
|
||||
|
||||
inline int lua_compare(lua_State* L, int idx1, int idx2, int op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case LUA_OPEQ:
|
||||
return lua_equal(L, idx1, idx2);
|
||||
break;
|
||||
|
||||
case LUA_OPLT:
|
||||
return lua_lessthan(L, idx1, idx2);
|
||||
break;
|
||||
|
||||
case LUA_OPLE:
|
||||
return lua_equal(L, idx1, idx2) || lua_lessthan(L, idx1, idx2);
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
inline int get_length(lua_State* L, int idx)
|
||||
{
|
||||
return int(lua_objlen(L, idx));
|
||||
}
|
||||
|
||||
#else
|
||||
inline int get_length(lua_State* L, int idx)
|
||||
{
|
||||
lua_len(L, idx);
|
||||
int len = int(luaL_checknumber(L, -1));
|
||||
lua_pop(L, 1);
|
||||
return len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef LUA_OK
|
||||
#define LUABRIDGE_LUA_OK 0
|
||||
#else
|
||||
#define LUABRIDGE_LUA_OK LUA_OK
|
||||
#endif
|
||||
|
||||
/** Get a table value, bypassing metamethods.
|
||||
*/
|
||||
inline void rawgetfield(lua_State* L, int index, char const* key)
|
||||
{
|
||||
assert(lua_istable(L, index));
|
||||
index = lua_absindex(L, index);
|
||||
lua_pushstring(L, key);
|
||||
lua_rawget(L, index);
|
||||
}
|
||||
|
||||
/** Set a table value, bypassing metamethods.
|
||||
*/
|
||||
inline void rawsetfield(lua_State* L, int index, char const* key)
|
||||
{
|
||||
assert(lua_istable(L, index));
|
||||
index = lua_absindex(L, index);
|
||||
lua_pushstring(L, key);
|
||||
lua_insert(L, -2);
|
||||
lua_rawset(L, index);
|
||||
}
|
||||
|
||||
/** Returns true if the value is a full userdata (not light).
|
||||
*/
|
||||
inline bool isfulluserdata(lua_State* L, int index)
|
||||
{
|
||||
return lua_isuserdata(L, index) && !lua_islightuserdata(L, index);
|
||||
}
|
||||
|
||||
/** Test lua_State objects for global equality.
|
||||
|
||||
This can determine if two different lua_State objects really point
|
||||
to the same global state, such as when using coroutines.
|
||||
|
||||
@note This is used for assertions.
|
||||
*/
|
||||
inline bool equalstates(lua_State* L1, lua_State* L2)
|
||||
{
|
||||
return lua_topointer(L1, LUA_REGISTRYINDEX) == lua_topointer(L2, LUA_REGISTRYINDEX);
|
||||
}
|
||||
|
||||
} // namespace luabridge
|
||||
Reference in New Issue
Block a user