Files
pke/thirdparty/luaplus/Src/LuaPlus/LuaStackObject.inl
2026-02-12 11:46:06 +03:00

573 lines
17 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// This source file is part of the LuaPlus source distribution and is Copyright
// 2001-2011 by Joshua C. Jensen (jjensen@workspacewhiz.com).
//
// The latest version may be obtained from http://luaplus.org/.
//
// The code presented in this file may be used in any environment it is
// acceptable to use Lua.
///////////////////////////////////////////////////////////////////////////////
#ifndef LUAPLUS__LUASTACKOBJECT_INL
#define LUAPLUS__LUASTACKOBJECT_INL
///////////////////////////////////////////////////////////////////////////////
// namespace LuaPlus
///////////////////////////////////////////////////////////////////////////////
namespace LuaPlus
{
/**
Constructor.
**/
LUAPLUS_INLINE LuaStackObject::LuaStackObject( lua_State* inL, int stackIndex ) :
L( inL ),
m_stackIndex( stackIndex )
{
}
/**
Constructor.
**/
LUAPLUS_INLINE LuaStackObject::LuaStackObject( LuaState* state, int stackIndex ) :
L( LuaState_to_lua_State( state ) ),
m_stackIndex( stackIndex )
{
}
/**
**/
LUAPLUS_INLINE bool LuaStackObject::operator==(const LuaStackObject& right) const
{
#if LUA_VERSION_NUM == 501
return lua_equal(LuaState_to_lua_State(L), (int)*this, (int)right) != 0;
#elif LUA_VERSION_NUM >= 502
return lua_compare(LuaState_to_lua_State(L), (int)*this, (int)right, LUA_OPEQ) != 0;
#endif
}
/**
**/
LUAPLUS_INLINE LuaState* LuaStackObject::GetState() const
{
return lua_State_to_LuaState( L );
}
LUAPLUS_INLINE lua_State* LuaStackObject::GetCState() const { return L; }
/**
Retrieves the type name. Corresponds to the information presented in section
4.5 of the Lua manual.
**/
LUAPLUS_INLINE const char* LuaStackObject::GetTypeName() const
{
return lua_typename( GetCState(), m_stackIndex );
}
/**
Returns one of the LUA_T* constants, based on the type. Corresponds to section
4.5 of the Lua manual.
\return Returns one of the following constants: LUA_TNIL, LUA_TINTEGER, LUA_TNUMBER,
LUA_TSTRING, LUA_TBOOLEAN, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA,
LUA_TLIGHTUSERDATA, LUA_TWSTRING
**/
LUAPLUS_INLINE int LuaStackObject::GetType() const
{
return lua_type( GetCState(), m_stackIndex );
}
/**
\return Returns true if the object is nil.
**/
LUAPLUS_INLINE bool LuaStackObject::IsNil() const { return lua_isnil( GetCState(), m_stackIndex ); }
/**
\return Returns true if the object is a table.
**/
LUAPLUS_INLINE bool LuaStackObject::IsTable() const { return lua_istable( GetCState(), m_stackIndex ); }
/**
\return Returns true if the object is user data, including light user data.
**/
LUAPLUS_INLINE bool LuaStackObject::IsUserdata() const { return lua_isuserdata( GetCState(), m_stackIndex ) != 0; }
/**
\return Returns true if the object is a C function callback.
**/
LUAPLUS_INLINE bool LuaStackObject::IsCFunction() const { return lua_iscfunction( GetCState(), m_stackIndex ) != 0; }
/**
\return Returns true if the object is a number.
**/
LUAPLUS_INLINE bool LuaStackObject::IsInteger() const { return lua_type( GetCState(), m_stackIndex ) == LUA_TNUMBER; }
/**
\return Returns true if the object is a number.
**/
LUAPLUS_INLINE bool LuaStackObject::IsNumber() const { return lua_type( GetCState(), m_stackIndex ) == LUA_TNUMBER; }
/**
\return Returns true if the object is a string.
**/
LUAPLUS_INLINE bool LuaStackObject::IsString() const { return lua_isstring( GetCState(), m_stackIndex ) != 0; }
/**
\return Returns true if the object is a Lua function.
**/
LUAPLUS_INLINE bool LuaStackObject::IsFunction() const { return lua_isfunction( GetCState(), m_stackIndex ); }
/**
\return Returns true if the object is none.
**/
LUAPLUS_INLINE bool LuaStackObject::IsNone() const { return !L || lua_isnone( GetCState(), m_stackIndex ); }
/**
\return Returns true if the object is light user data (that is, the object
is just a pointer.
**/
LUAPLUS_INLINE bool LuaStackObject::IsLightUserdata() const { return lua_islightuserdata( GetCState(), m_stackIndex ) != 0; }
/**
\return Returns true if the object is a boolean.
**/
LUAPLUS_INLINE bool LuaStackObject::IsBoolean() const { return lua_isboolean( GetCState(), m_stackIndex ); }
/**
\return Returns true if the object is a thread.
**/
LUAPLUS_INLINE bool LuaStackObject::IsThread() const { return lua_isthread( GetCState(), m_stackIndex ); }
/**
**/
LUAPLUS_INLINE float LuaStackObject::GetFloat() const { return (float)lua_tonumber( GetCState(), m_stackIndex); }
LUAPLUS_INLINE double LuaStackObject::GetDouble() const { return (double)lua_tonumber( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE int LuaStackObject::GetInteger() const { return (int)lua_tonumber( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE lua_Number LuaStackObject::GetNumber() const { return lua_tonumber( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE const char* LuaStackObject::GetString() const
{
const char* str = lua_tostring( GetCState(), m_stackIndex );
luaplus_assert(str);
return str;
}
LUAPLUS_INLINE size_t LuaStackObject::StrLen() const {
#if LUA_VERSION_NUM == 501
return lua_objlen( GetCState(), m_stackIndex );
#elif LUA_VERSION_NUM >= 502
return lua_rawlen( GetCState(), m_stackIndex );
#endif
}
LUAPLUS_INLINE lua_CFunction LuaStackObject::GetCFunction() const { luaplus_assert( lua_iscfunction( GetCState(), m_stackIndex ) ); return lua_tocfunction( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE void* LuaStackObject::GetUserdata() const { luaplus_assert( lua_isuserdata( GetCState(), m_stackIndex ) ); return lua_touserdata( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE const void* LuaStackObject::GetLuaPointer() const { return lua_topointer( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE void* LuaStackObject::GetLightUserdata() const { luaplus_assert( lua_islightuserdata( GetCState(), m_stackIndex )); return (void*)lua_touserdata( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE bool LuaStackObject::GetBoolean() const { luaplus_assert( lua_isboolean( GetCState(), m_stackIndex ) || lua_isnil( GetCState(), m_stackIndex ) ); return (int)lua_toboolean( GetCState(), m_stackIndex ) != 0; }
LUAPLUS_INLINE lua_State* LuaStackObject::GetThread() const { luaplus_assert( lua_isthread( GetCState(), m_stackIndex ) || lua_isnil( GetCState(), m_stackIndex ) ); return lua_tothread( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE void LuaStackObject::Push() { lua_pushvalue( GetCState(), m_stackIndex ); }
// This is a dangerous function, as it can affect the stack placement of other LuaObjects.
LUAPLUS_INLINE void LuaStackObject::Pop() { lua_remove( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE int LuaStackObject::Ref( int lock )
{
Push();
return luaL_ref( LuaState_to_lua_State( L ), m_stackIndex );
}
LUAPLUS_INLINE LuaStackObject LuaStackObject::GetMetatable()
{
lua_getmetatable( GetCState(), m_stackIndex );
return LuaStackObject( GetState(),
lua_gettop( GetCState() ) );
}
LUAPLUS_INLINE void LuaStackObject::SetMetatable() { lua_setmetatable( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE void LuaStackObject::SetMetatable( LuaStackObject value )
{
value.Push();
lua_setmetatable( GetCState(), m_stackIndex );
}
LUAPLUS_INLINE void LuaStackObject::SetTable() { lua_settable( GetCState(), m_stackIndex ); }
LUAPLUS_INLINE size_t LuaStackObject::GetCount() {
#if LUA_VERSION_NUM == 501
return lua_objlen( GetCState(), m_stackIndex );
#elif LUA_VERSION_NUM >= 502
return lua_rawlen( GetCState(), m_stackIndex );
#endif
}
/**
Creates a table called [name] within the current LuaStackObject.
@param name The name of the table to create.
@param size The size of the table.
@return Returns the object representing the newly created table.
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::CreateTable( const char* name, int narray, int lnhash )
{
(void)narray;
(void)lnhash;
//jj lua_newtablesize(L, narray, lnhash); // T
lua_newtable( GetCState() ); // T
lua_pushstring( GetCState(), name ); // T name
lua_pushvalue( GetCState(), lua_gettop( GetCState() ) - 1 ); // T name T
lua_settable( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
Creates a table called [key] within the current LuaStackObject.
@param index The index of the table to create.
@param size The size of the table.
@return Returns the object representing the newly created table.
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::CreateTable(int index, int narray, int lnhash )
{
lua_createtable( GetCState(), narray, lnhash ); // T
lua_pushnumber( GetCState(), (lua_Number)index ); // T name
lua_pushvalue( GetCState(), lua_gettop( GetCState() ) - 1 ); // T name T
lua_settable( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
Assigns the table key [name] to nil.
@param name The name of the object to make nil.
**/
LUAPLUS_INLINE void LuaStackObject::SetNil( const char* name )
{
lua_pushstring( GetCState(), name );
lua_pushnil( GetCState() );
lua_settable( GetCState(), m_stackIndex );
}
/**
Assigns the table key [index] to nil.
@param key The index of the object to make nil.
**/
LUAPLUS_INLINE void LuaStackObject::SetNil( int index )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushnil( GetCState() );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetBoolean( const char* name, bool value )
{
lua_pushstring( GetCState(), name );
lua_pushboolean( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetBoolean( int index, bool value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushboolean( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetInteger( const char* name, int value )
{
lua_pushstring( GetCState(), name );
lua_pushnumber( GetCState(), (lua_Number)value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetInteger( int index, int value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushnumber( GetCState(), (lua_Number)value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetNumber( const char* name, lua_Number value )
{
lua_pushstring( GetCState(), name );
lua_pushnumber( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetNumber( int index, lua_Number value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushnumber( GetCState(), (lua_Number)value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetString( const char* name, const char* value )
{
lua_pushstring( GetCState(), name );
lua_pushstring( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetString( int index, const char* value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushstring( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetUserdata( const char* name, void* value )
{
lua_pushstring( GetCState(), name );
(*(void **)(lua_newuserdata(GetCState(), sizeof(void *))) = (value));
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetUserdata( int index, void* value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
(*(void **)(lua_newuserdata(GetCState(), sizeof(void *))) = (value));
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetLightUserdata( int index, void* value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushlightuserdata( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetLightUserdata( const char* name, void* value )
{
lua_pushstring( GetCState(), name );
lua_pushlightuserdata( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [name] to [value].
@param name The name of the object to assign the value to.
@param value The value to assign to [name].
**/
LUAPLUS_INLINE void LuaStackObject::SetObject( const char* name, LuaStackObject& value )
{
lua_pushstring( GetCState(), name );
lua_pushvalue( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Creates (or reassigns) the object called [index] to [value].
@param index The index of the object to assign the value to.
@param value The value to assign to [index].
**/
LUAPLUS_INLINE void LuaStackObject::SetObject( int index, LuaStackObject& value )
{
lua_pushnumber( GetCState(), (lua_Number)index );
lua_pushvalue( GetCState(), value );
lua_settable( GetCState(), m_stackIndex );
}
/**
Assuming the current object is a table, retrieves the table entry
called [name].
@param name The name of the entry from the current table to retrieve.
@return Returns an LuaStackObject representing the retrieved entry.
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::GetByName( const char* name )
{
lua_pushstring( GetCState(), name );
lua_gettable( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
Assuming the current object is a table, retrieves the table entry
at [index].
@param index The numeric name of a table entry.
@return Returns an LuaStackObject representing the retrieved entry.
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::GetByIndex( int index )
{
lua_rawgeti( GetCState(), m_stackIndex, index );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
Assuming the current object is a table, retrieves the table entry
called [name].
@param name The name of the entry from the current table to retrieve.
@return Returns an LuaStackObject representing the retrieved entry.
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::GetByObject( LuaStackObject& obj )
{
lua_pushvalue( GetCState(), obj );
lua_rawget( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::operator[]( const char* name ) const
{
lua_pushstring( GetCState(), name );
lua_rawget( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::operator[]( int index ) const
{
lua_rawgeti( GetCState(), m_stackIndex, index );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
/**
**/
LUAPLUS_INLINE LuaStackObject LuaStackObject::operator[]( LuaStackObject& obj ) const
{
lua_pushvalue( GetCState(), obj );
lua_rawget( GetCState(), m_stackIndex );
return LuaStackObject( GetState(), lua_gettop( GetCState() ) );
}
LUAPLUS_INLINE const LuaAutoObject& LuaAutoObject::operator=( const LuaStackObject& src )
{
lua_remove( GetCState(), m_stackIndex );
L = src.L;
m_stackIndex = src.m_stackIndex;
return *this;
}
LUAPLUS_INLINE LuaAutoObject::~LuaAutoObject()
{
lua_remove( GetCState(), m_stackIndex );
}
LUAPLUS_INLINE LuaStack::LuaStack(LuaState* state)
: L( LuaState_to_lua_State( state ) )
{
m_numStack = lua_gettop(LuaState_to_lua_State(L));
}
LUAPLUS_INLINE LuaStack::LuaStack(lua_State* inL) :
L( inL )
{
}
LUAPLUS_INLINE LuaStack::~LuaStack()
{
}
LUAPLUS_INLINE LuaStackObject LuaStack::operator[](int index)
{
// luaplus_assert(index <= m_numStack);
return LuaStackObject(L, index);
}
} // namespace LuaPlus
#endif // LUAPLUS__LUASTACKOBJECT_INL