Files

119 lines
2.9 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/************************************************************************/
/* LUA脚本值列表
/*
/* 脚本值列表中最多允许保存MaxValueCount个值。此类适用于在与脚本交互中的函数调用参数
/* 表的传递以及返回值列表的获取操作的场合。
/*
/************************************************************************/
class CScriptValueList
{
public:
static const INT_PTR MaxValueCount = 32; //脚本值列表允许存储的值数量上限
public:
CScriptValueList()
{
m_nCount = 0;
}
CScriptValueList(const CScriptValueList& valList)
{
//m_nCount = 0;
operator = (valList);
}
//获取列表中的值数量
inline INT_PTR count()
{
return m_nCount;
}
//将列表转换为ScriptValue数组的运算符重载
inline operator CScriptValue* ()
{
return m_Values;
}
inline CScriptValue& operator[](int i)
{
return m_Values[i];
}
//添加一个值
template <typename T>
inline CScriptValueList& operator << (const T val)
{
if ( m_nCount < MaxValueCount )
{
m_Values[m_nCount++] = val;
}
return *this;
}
//从另一个列表中赋值
inline CScriptValueList& operator = (const CScriptValueList &valList)
{
clear();
for (UINT_PTR i=valList.m_nCount; i; --i)
{
m_Values[i-1] = valList.m_Values[i-1];
}
m_nCount = valList.m_nCount;
return *this;
}
inline CScriptValueList& operator += (const CScriptValueList &valList)
{
for (UINT_PTR i = 0; i < valList.m_nCount && m_nCount < MaxValueCount; i++)
{
m_Values[m_nCount++] = valList.m_Values[i];
}
return *this;
}
//清空值列表
inline void clear()
{
for (UINT_PTR i=m_nCount; i; --i)
{
m_Values[i-1].clear();
}
m_nCount = 0;
}
/* 将值列表中的值压入lua脚本中。
*
*/
void pushArgs(lua_State *pLua, INT_PTR nCount);
/* 从lua脚本中取出返回值到值列表中函数返回取出了多少个值。
*
*/
INT_PTR getResults(lua_State *pLua, int nCount);
/* 将lua中传入的参数保存到值列表中。
*
*
*/
INT_PTR getArguments(lua_State *pLua, INT_PTR nStackIdx);
/* 将值列表保存到流中 */
inline void loadFromStream(wylib::stream::CBaseStream &stm)
{
clear();
stm.read(&m_nCount, sizeof(m_nCount));
for (UINT_PTR i=0; i<m_nCount; ++i)
{
m_Values[i].loadFromStream(stm);
}
}
/* 从流中读取值列表 */
inline LONGLONG saveToStream(wylib::stream::CBaseStream &stm) const
{
LONGLONG dwPos = stm.getPosition();
stm.write(&m_nCount, sizeof(m_nCount));
for (UINT_PTR i=0; i<m_nCount; ++i)
{
m_Values[i].saveToStream(stm);
}
return stm.getPosition() - dwPos;
}
protected:
CScriptValue m_Values[MaxValueCount];//值内存块
UINT_PTR m_nCount;//值数量
};