Files
mir_server/Gateway/srvlib/include/luabase/script_value.hpp

417 lines
8.1 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _SCRIPT_VALUE_HPP_
#define _SCRIPT_VALUE_HPP_
/************************************************************************
* LUA<EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>nil<EFBFBD><EFBFBD>bool<EFBFBD><EFBFBD>number<EFBFBD><EFBFBD>string<EFBFBD><EFBFBD>lightuserdata<EFBFBD><EFBFBD>userdata<EFBFBD><EFBFBD>cfunction
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD>CScriptValue<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Щֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʹ<EFBFBD>á<EFBFBD>
*
************************************************************************/
class ScriptValue
{
public:
// <20><><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum ScriptValueType
{
vNull = LUA_TNIL, // nilֵ
vBool = LUA_TBOOLEAN, // boolֵ
vLightData = LUA_TLIGHTUSERDATA,//<2F><>ָ<EFBFBD><D6B8>ֵ
vNumber = LUA_TNUMBER,//numberֵ
vString = LUA_TSTRING,//stringֵ
vCFunction = LUA_TFUNCTION,//C<><43><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ
vUserData = LUA_TUSERDATA,//userdataֵ
};
// <20><><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>ֵ<EFBFBD><D6B5>ֵ<EFBFBD><D6B5><EFBFBD>ݽṹ
union ScriptValueData
{
bool boVal; //boolֵ
const void* lightPtr; //ָ<><D6B8>ֵ
double numVal; //numberֵ
struct
{
const char* str; //<2F>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8>
size_t len;//<2F>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} strVal; //<2F>ַ<EFBFBD><D6B7><EFBFBD>ֵ
lua_CFunction cfnVal;//C<><43><EFBFBD><EFBFBD>ֵ
struct
{
const void* ptr; //<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
size_t size;//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
} userVal; //<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ֵ
};
public:
ScriptValue()
{
type_ = vNull;
data_.userVal.ptr = 0;
data_.userVal.size = 0;
}
~ScriptValue()
{
clear();
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline void clear()
{
if (type_ != vNull)
{
if (type_ == vString)
free((void*)data_.strVal.str);
else if (type_ == vUserData)
free((void*)data_.userVal.ptr);
type_ = vNull;
data_.userVal.ptr = 0;
data_.userVal.size = 0;
}
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline ScriptValueType getType()
{
return type_;
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD>С
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vNull<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ0,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vBool<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsizeof(bool),
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vLightData<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>sizeof(LPCVOID),
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vNumber<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>sizeof(double),
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vString<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vCFunction<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>sizeof(lua_CFunction),
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vUserData<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ֽڳ<EFBFBD><EFBFBD><EFBFBD>,
*/
inline size_t getSize()
{
switch (type_)
{
case vBool:
return sizeof(data_.boVal);
case vLightData:
return sizeof(data_.lightPtr);
case vNumber:
return sizeof(data_.numVal);
case vString:
return data_.strVal.len;
case vCFunction:
return sizeof(data_.cfnVal);
case vUserData:
return data_.userVal.size;
default:
return 0;
}
}
/*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>
*/
inline void loadFromStream(stream::BaseStream& stm)
{
clear();
stm.read(&type_, sizeof(uint8_t));
switch (type_)
{
case vBool:
stm.read(&data_.boVal, sizeof(data_.boVal));
break;
case vLightData:
stm.read(&data_.lightPtr, sizeof(data_.lightPtr));
break;
case vNumber:
stm.read(&data_.numVal, sizeof(data_.numVal));
break;
case vString:
stm.read(&data_.strVal.len, sizeof(data_.strVal.len));
data_.strVal.str = (const char*)malloc(data_.strVal.len + sizeof(int));
stm.read((void*)data_.strVal.str, (const int)(data_.strVal.len * sizeof(data_.strVal.str[0])));
((char*)(data_.strVal.str))[data_.strVal.len] = 0;
break;
case vCFunction:
stm.read(&data_.cfnVal, sizeof(data_.cfnVal));
break;
case vUserData:
stm.read(&data_.userVal.size, sizeof(data_.userVal.size));
data_.userVal.ptr = malloc(data_.userVal.size);
stm.read((void*)data_.userVal.ptr, (const int)(data_.userVal.size));
break;
default:
break;
}
}
/*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
inline int64_t saveToStream(stream::BaseStream& stm) const
{
int64_t dwPos = stm.getPosition();
stm.write(&type_, sizeof(uint8_t));
switch (type_)
{
case vBool:
stm.write(&data_.boVal, sizeof(data_.boVal));
break;
case vLightData:
stm.write(&data_.lightPtr, sizeof(data_.lightPtr));
break;
case vNumber:
stm.write(&data_.numVal, sizeof(data_.numVal));
break;
case vString:
stm.write(&data_.strVal.len, sizeof(data_.strVal.len));
stm.write(data_.strVal.str, data_.strVal.len * sizeof(data_.strVal.str[0]));
break;
case vCFunction:
stm.write(&data_.cfnVal, sizeof(data_.cfnVal));
break;
case vUserData:
stm.write(&data_.userVal.size, sizeof(data_.userVal.size));
stm.write(data_.userVal.ptr, data_.userVal.size);
break;
default:
break;
}
return stm.getPosition() - dwPos;
}
public:
#define SETLUANUMBER(val) clear(); type_ = vNumber; data_.numVal = (double)val;
inline ScriptValue& operator = (const int val)
{
SETLUANUMBER(val);
return *this;
}
inline ScriptValue& operator = (const unsigned int val)
{
SETLUANUMBER(val);
return *this;
}
inline ScriptValue& operator = (const int64_t val)
{
SETLUANUMBER(val);
return *this;
}
inline ScriptValue& operator = (const uint64_t val)
{
SETLUANUMBER(val);
return *this;
}
inline ScriptValue& operator = (const double val)
{
SETLUANUMBER(val);
return *this;
}
inline ScriptValue& operator = (const float val)
{
SETLUANUMBER(val);
return *this;
}
/* <20><>boolֵ<6C>ĸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E3BAAF> */
inline ScriptValue& operator = (const bool val)
{
clear();
type_ = vBool;
data_.boVal = val;
return *this;
}
inline ScriptValue& operator = (const char* val)
{
clear();
type_ = vString;
if (val)
{
data_.strVal.len = strlen(val);
data_.strVal.str = (const char*)malloc(data_.strVal.len + sizeof(int));
memcpy((char*)data_.strVal.str, val, data_.strVal.len);
((char*)(data_.strVal.str))[data_.strVal.len] = 0;
}
else
{
data_.strVal.len = 0;
data_.strVal.str = NULL;
}
return *this;
}
inline ScriptValue& operator = (const void* val)
{
clear();
type_ = vLightData;
data_.lightPtr = val;
return *this;
}
/* <20><>LUAC<41><43><EFBFBD><EFBFBD>ָ<EFBFBD>루lua_CFunction<6F><6E>ֵ<EFBFBD>ĸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E3BAAF> */
inline ScriptValue& operator = (const lua_CFunction val)
{
clear();
type_ = vCFunction;
data_.cfnVal = val;
return *this;
}
/* <20><>ScriptValueDataֵ<61>ĸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E3BAAF> */
inline ScriptValue& operator = (const ScriptValue& val)
{
switch (val.type_)
{
case vBool:
return operator = (val.data_.boVal);
case vLightData:
return operator = (val.data_.lightPtr);
case vNumber:
return operator = (val.data_.numVal);
case vString:
return operator = (val.data_.strVal.str);
case vCFunction:
return operator = (val.data_.cfnVal);
case vUserData:
return SetUserData(val.data_.userVal.ptr, val.data_.userVal.size);
default:
clear();
return *this;
}
}
/* <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> */
inline ScriptValue& SetUserData(const void* data, size_t dwSize)
{
clear();
type_ = vUserData;
data_.userVal.size = dwSize;
data_.userVal.ptr = malloc(dwSize);
memcpy((void*)data_.userVal.ptr, data, dwSize);
return *this;
}
public:
//ת<><D7AA>Ϊint<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator int ()
{
if (type_ == vNumber)
return (int)data_.numVal;
return 0;
}
//ת<><D7AA>Ϊint64<36><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator int64_t ()
{
if (type_ == vNumber)
return (int64_t)data_.numVal;
return 0;
}
//ת<><D7AA>Ϊdouble<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator double()
{
if (type_ == vNumber)
return data_.numVal;
return 0.0;
}
//ת<><D7AA>Ϊfloat<61><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator float()
{
if (type_ == vNumber)
return (float)data_.numVal;
return 0.0;
}
/* ת<><D7AA>Ϊbool<6F><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline operator bool ()
{
switch (type_)
{
case vBool:
return data_.boVal;
case vLightData:
return data_.lightPtr != NULL;
case vNumber:
return data_.numVal != 0;
case vString:
return data_.strVal.str && strcmp("true", data_.strVal.str) == 0;
case vCFunction:
return data_.cfnVal != NULL;
case vUserData:
return data_.userVal.ptr != NULL;
default:
return false;
}
}
//ת<><D7AA>Ϊconst char*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator const char* ()
{
if (type_ == vString)
return (const char*)data_.strVal.str;
return NULL;
}
//ת<><D7AA>Ϊconst lua_CFunction<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator const lua_CFunction()
{
if (type_ == vCFunction)
return data_.cfnVal;
return NULL;
}
//ת<><D7AA>Ϊconst void*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline operator const void* ()
{
if (type_ == vLightData || type_ == vUserData)
return (const void*)data_.lightPtr;
else if (type_ == vString)
return (const void*)data_.strVal.str;
return NULL;
}
protected:
ScriptValueType type_; //ֵ<><D6B5><EFBFBD><EFBFBD>
ScriptValueData data_; //ֵ
};
#endif