JD2022-TU1/main/extern/dtest/dtcore/inc/dtscriptobject.h

93 lines
3.1 KiB
C++

#pragma once
#include "dtcore/inc/dtstreamjsonoutput.h"
#include "dtcore/inc/dtstreamjsoninput.h"
#include "dtcore/inc/dtjsonvalue.h"
namespace dt
{
// This class represent the value of an object in the scripting system.
// It allows to serialize a native value to a Json form which allows to easily
// send it over the network. It also allows to deserialize it back to a native format.
class ScriptObject : public Serializable
{
public:
// Default constructor, represents an empty value
DT_CORE_DLL_ENTRY ScriptObject();
// Constructor accepting any of serializable types:
// - S8, S16, S32, S64, U8, U16, U32, U64
// - bool
// - double, float
// - String
// - ByteBuffer
// - Vector, Map, Set
// - Serializable
template <typename T> ScriptObject(const T& value, bool isReference = false);
// comparison operator
DT_CORE_DLL_ENTRY bool operator==(const ScriptObject& rhs) const;
// comparison operator
DT_CORE_DLL_ENTRY bool operator!=(const ScriptObject& rhs) const;
// change the current script object value to the new value specified
template <typename T> void Set(const T& value, bool isReference = false);
// get the current script object value back into a native type
template <typename T> bool Get(T* out) const;
// returns true, if the script object is empty
DT_CORE_DLL_ENTRY bool IsEmpty() const { return m_JsonValue.IsEmpty(); }
// returns true, if the script object is a String referring to another variable
DT_CORE_DLL_ENTRY bool IsReference() const { return m_IsReference; }
// returns the Json representation of the script object value
DT_CORE_DLL_ENTRY const JsonValue& GetJsonValue() const { return m_JsonValue; }
// change the Json representation of the script object value
DT_CORE_DLL_ENTRY void SetJsonValue(const JsonValue& json) { m_JsonValue = json; }
// serialize function
DT_CORE_DLL_ENTRY virtual void Serialize(U8 version, Stream& stream) override;
private:
bool m_IsReference;
JsonValue m_JsonValue;
};
// stringify the script object Json value
DT_CORE_DLL_ENTRY String& operator<<(String& out, const ScriptObject& obj);
template <typename T> inline ScriptObject::ScriptObject(const T& value, bool isReference)
{
Set(value, isReference);
}
template <typename T> inline void ScriptObject::Set(const T& value, bool isReference)
{
m_IsReference = isReference;
String jsonStr;
StreamJsonOutput sjo(&jsonStr);
sjo << value;
JsonValue::Parse(jsonStr, &m_JsonValue);
}
template <> inline void ScriptObject::Set(const JsonValue& value, bool isReference)
{
SetJsonValue(value);
m_IsReference = isReference;
}
template <typename T> inline bool ScriptObject::Get(T* out) const
{
if (IsEmpty())
{
return false;
}
StreamJsonInput sji(m_JsonValue);
sji << *out;
return sji.HasSucceeded();
}
}