feat(datatype): added conversion function for lua objects
This commit is contained in:
parent
d8ffd574f5
commit
6bb1d8b3a4
10 changed files with 89 additions and 29 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
#include <ios>
|
#include <ios>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include "lua.h"
|
||||||
|
|
||||||
#define IMPL_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE, TYPE_NAME) Data::CLASS_NAME::CLASS_NAME(WRAPPED_TYPE in) : value(in) {} \
|
#define IMPL_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE, TYPE_NAME) Data::CLASS_NAME::CLASS_NAME(WRAPPED_TYPE in) : value(in) {} \
|
||||||
Data::CLASS_NAME::~CLASS_NAME() = default; \
|
Data::CLASS_NAME::~CLASS_NAME() = default; \
|
||||||
|
@ -32,6 +33,10 @@ Data::Variant Data::Null::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Null();
|
return Data::Null();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Data::Null::PushLuaValue(lua_State* L) const {
|
||||||
|
lua_pushnil(L);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
IMPL_WRAPPER_CLASS(Bool, bool, "bool")
|
IMPL_WRAPPER_CLASS(Bool, bool, "bool")
|
||||||
|
@ -39,27 +44,50 @@ IMPL_WRAPPER_CLASS(Int, int, "int")
|
||||||
IMPL_WRAPPER_CLASS(Float, float, "float")
|
IMPL_WRAPPER_CLASS(Float, float, "float")
|
||||||
IMPL_WRAPPER_CLASS(String, std::string, "string")
|
IMPL_WRAPPER_CLASS(String, std::string, "string")
|
||||||
|
|
||||||
|
// ToString
|
||||||
|
|
||||||
const Data::String Data::Bool::ToString() const {
|
const Data::String Data::Bool::ToString() const {
|
||||||
return Data::String(value ? "true" : "false");
|
return Data::String(value ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Bool::Deserialize(pugi::xml_node node) {
|
|
||||||
return Data::Bool(node.text().as_bool());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<Data::Variant> Data::Bool::FromString(std::string string) {
|
|
||||||
return Data::Bool(string[0] == 't' || string[0] == 'T' || string[0] == '1' || string[0] == 'y' || string[0] == 'Y');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const Data::String Data::Int::ToString() const {
|
const Data::String Data::Int::ToString() const {
|
||||||
return Data::String(std::to_string(value));
|
return Data::String(std::to_string(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Data::String Data::Float::ToString() const {
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << std::noshowpoint << value;
|
||||||
|
return Data::String(stream.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
const Data::String Data::String::ToString() const {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deserialize
|
||||||
|
|
||||||
|
Data::Variant Data::Bool::Deserialize(pugi::xml_node node) {
|
||||||
|
return Data::Bool(node.text().as_bool());
|
||||||
|
}
|
||||||
|
|
||||||
Data::Variant Data::Int::Deserialize(pugi::xml_node node) {
|
Data::Variant Data::Int::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Int(node.text().as_int());
|
return Data::Int(node.text().as_int());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Data::Variant Data::Float::Deserialize(pugi::xml_node node) {
|
||||||
|
return Data::Float(node.text().as_float());
|
||||||
|
}
|
||||||
|
|
||||||
|
Data::Variant Data::String::Deserialize(pugi::xml_node node) {
|
||||||
|
return Data::String(node.text().as_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromString
|
||||||
|
|
||||||
|
std::optional<Data::Variant> Data::Bool::FromString(std::string string) {
|
||||||
|
return Data::Bool(string[0] == 't' || string[0] == 'T' || string[0] == '1' || string[0] == 'y' || string[0] == 'Y');
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<Data::Variant> Data::Int::FromString(std::string string) {
|
std::optional<Data::Variant> Data::Int::FromString(std::string string) {
|
||||||
char* endPos;
|
char* endPos;
|
||||||
int value = (int)std::strtol(string.c_str(), &endPos, 10);
|
int value = (int)std::strtol(string.c_str(), &endPos, 10);
|
||||||
|
@ -67,17 +95,6 @@ std::optional<Data::Variant> Data::Int::FromString(std::string string) {
|
||||||
return Data::Int(value);
|
return Data::Int(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const Data::String Data::Float::ToString() const {
|
|
||||||
std::stringstream stream;
|
|
||||||
stream << std::noshowpoint << value;
|
|
||||||
return Data::String(stream.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
Data::Variant Data::Float::Deserialize(pugi::xml_node node) {
|
|
||||||
return Data::Float(node.text().as_float());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<Data::Variant> Data::Float::FromString(std::string string) {
|
std::optional<Data::Variant> Data::Float::FromString(std::string string) {
|
||||||
char* endPos;
|
char* endPos;
|
||||||
float value = std::strtof(string.c_str(), &endPos);
|
float value = std::strtof(string.c_str(), &endPos);
|
||||||
|
@ -85,15 +102,24 @@ std::optional<Data::Variant> Data::Float::FromString(std::string string) {
|
||||||
return Data::Float(value);
|
return Data::Float(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const Data::String Data::String::ToString() const {
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
Data::Variant Data::String::Deserialize(pugi::xml_node node) {
|
|
||||||
return Data::String(node.text().as_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<Data::Variant> Data::String::FromString(std::string string) {
|
std::optional<Data::Variant> Data::String::FromString(std::string string) {
|
||||||
return Data::String(string);
|
return Data::String(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PushLuaValue
|
||||||
|
|
||||||
|
void Data::Bool::PushLuaValue(lua_State* L) const {
|
||||||
|
lua_pushboolean(L, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Data::Int::PushLuaValue(lua_State* L) const {
|
||||||
|
lua_pushinteger(L, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Data::Float::PushLuaValue(lua_State* L) const {
|
||||||
|
lua_pushnumber(L, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Data::String::PushLuaValue(lua_State* L) const {
|
||||||
|
lua_pushstring(L, value.c_str());
|
||||||
}
|
}
|
|
@ -5,6 +5,8 @@
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
|
|
||||||
|
extern "C" { typedef struct lua_State lua_State; }
|
||||||
|
|
||||||
#define DEF_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE) class CLASS_NAME : public Data::Base { \
|
#define DEF_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE) class CLASS_NAME : public Data::Base { \
|
||||||
const WRAPPED_TYPE value; \
|
const WRAPPED_TYPE value; \
|
||||||
public: \
|
public: \
|
||||||
|
@ -16,6 +18,8 @@ public: \
|
||||||
\
|
\
|
||||||
virtual const Data::String ToString() const override; \
|
virtual const Data::String ToString() const override; \
|
||||||
virtual void Serialize(pugi::xml_node node) const override; \
|
virtual void Serialize(pugi::xml_node node) const override; \
|
||||||
|
virtual void PushLuaValue(lua_State*) const override; \
|
||||||
|
\
|
||||||
static Data::Variant Deserialize(pugi::xml_node node); \
|
static Data::Variant Deserialize(pugi::xml_node node); \
|
||||||
static std::optional<Data::Variant> FromString(std::string); \
|
static std::optional<Data::Variant> FromString(std::string); \
|
||||||
};
|
};
|
||||||
|
@ -38,6 +42,7 @@ namespace Data {
|
||||||
virtual const TypeInfo& GetType() const = 0;
|
virtual const TypeInfo& GetType() const = 0;
|
||||||
virtual const Data::String ToString() const = 0;
|
virtual const Data::String ToString() const = 0;
|
||||||
virtual void Serialize(pugi::xml_node node) const = 0;
|
virtual void Serialize(pugi::xml_node node) const = 0;
|
||||||
|
virtual void PushLuaValue(lua_State*) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Null : Base {
|
class Null : Base {
|
||||||
|
@ -49,6 +54,8 @@ namespace Data {
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
|
virtual void PushLuaValue(lua_State*) const override;
|
||||||
|
|
||||||
static Data::Variant Deserialize(pugi::xml_node node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -145,4 +145,9 @@ Data::Variant Data::CFrame::Deserialize(pugi::xml_node node) {
|
||||||
node.child("R21").text().as_float(),
|
node.child("R21").text().as_float(),
|
||||||
node.child("R22").text().as_float()
|
node.child("R22").text().as_float()
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Data::CFrame::PushLuaValue(lua_State* L) const {
|
||||||
|
// TODO:
|
||||||
|
panic();
|
||||||
}
|
}
|
|
@ -35,6 +35,7 @@ namespace Data {
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node parent) const override;
|
virtual void Serialize(pugi::xml_node parent) const override;
|
||||||
|
virtual void PushLuaValue(lua_State*) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
|
|
||||||
operator glm::mat4() const;
|
operator glm::mat4() const;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "color3.h"
|
#include "color3.h"
|
||||||
#include "meta.h" // IWYU pragma: keep
|
#include "meta.h" // IWYU pragma: keep
|
||||||
|
#include "panic.h"
|
||||||
|
|
||||||
Data::Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {};
|
Data::Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {};
|
||||||
Data::Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {};
|
Data::Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {};
|
||||||
|
@ -45,3 +46,9 @@ void Data::Color3::Serialize(pugi::xml_node node) const {
|
||||||
Data::Variant Data::Color3::Deserialize(pugi::xml_node node) {
|
Data::Variant Data::Color3::Deserialize(pugi::xml_node node) {
|
||||||
return Color3::FromHex(node.text().get());
|
return Color3::FromHex(node.text().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Data::Color3::PushLuaValue(lua_State* L) const {
|
||||||
|
// TODO:
|
||||||
|
panic();
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ namespace Data {
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
std::string ToHex() const;
|
std::string ToHex() const;
|
||||||
virtual void Serialize(pugi::xml_node node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
|
virtual void PushLuaValue(lua_State*) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
|
|
||||||
operator glm::vec3() const;
|
operator glm::vec3() const;
|
||||||
|
|
|
@ -32,3 +32,8 @@ void Data::InstanceRef::Serialize(pugi::xml_node node) const {
|
||||||
// Data::Variant Color3::Deserialize(pugi::xml_node node) {
|
// Data::Variant Color3::Deserialize(pugi::xml_node node) {
|
||||||
// return Color3::FromHex(node.text().get());
|
// return Color3::FromHex(node.text().get());
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
void Data::InstanceRef::PushLuaValue(lua_State* L) const {
|
||||||
|
// TODO:
|
||||||
|
panic();
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ namespace Data {
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
|
virtual void PushLuaValue(lua_State*) const override;
|
||||||
// static Data::Variant Deserialize(pugi::xml_node node);
|
// static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <glm/ext/quaternion_geometric.hpp>
|
#include <glm/ext/quaternion_geometric.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "meta.h" // IWYU pragma: keep
|
#include "meta.h" // IWYU pragma: keep
|
||||||
|
#include "panic.h"
|
||||||
|
|
||||||
Data::Vector3::Vector3() : vector(glm::vec3(0, 0, 0)) {};
|
Data::Vector3::Vector3() : vector(glm::vec3(0, 0, 0)) {};
|
||||||
Data::Vector3::Vector3(const glm::vec3& src) : vector(src) {};
|
Data::Vector3::Vector3(const glm::vec3& src) : vector(src) {};
|
||||||
|
@ -100,4 +101,9 @@ std::optional<Data::Variant> Data::Vector3::FromString(std::string string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return Data::Vector3(components[0], components[1], components[2]);
|
return Data::Vector3(components[0], components[1], components[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Data::Vector3::PushLuaValue(lua_State* L) const {
|
||||||
|
// TODO:
|
||||||
|
panic();
|
||||||
}
|
}
|
|
@ -26,6 +26,7 @@ namespace Data {
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
|
virtual void PushLuaValue(lua_State*) const override;
|
||||||
|
|
||||||
static Data::Variant Deserialize(pugi::xml_node node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
static std::optional<Data::Variant> FromString(std::string);
|
static std::optional<Data::Variant> FromString(std::string);
|
||||||
|
|
Loading…
Add table
Reference in a new issue