summaryrefslogtreecommitdiff
path: root/g_object.h
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-09-19 20:54:13 +0200
committerNikita Kostovsky <nikita@kostovsky.me>2025-09-19 20:54:13 +0200
commite7019763076cbbe3d52c2a03133c3ded5558f017 (patch)
treebcf5ff116630bebaa09492bdcdaf08a54dfd1e28 /g_object.h
initial commit
Diffstat (limited to 'g_object.h')
-rw-r--r--g_object.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/g_object.h b/g_object.h
new file mode 100644
index 0000000..725fbc1
--- /dev/null
+++ b/g_object.h
@@ -0,0 +1,138 @@
+#pragma once
+
+// qt
+#include <QDebug>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QMetaProperty>
+#include <QObject>
+
+#define JSON_CONSTRUCTOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class( \
+ const QJsonObject& json, \
+ QObject* parent = nullptr \
+ ) \
+ : base_class(json, parent) \
+ { \
+ constructFromJson(json); \
+ }
+
+#define JSON_VALUE_CONSTRUCTOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class( \
+ const QJsonValue& json, \
+ QObject* parent = nullptr \
+ ) \
+ : base_class(json.toObject(), parent) \
+ { \
+ constructFromJson(json.toObject()); \
+ }
+
+#define JSON_ASSING_OPERATOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class& operator=(const QJsonObject& json) \
+ { \
+ constructFromJson(json); \
+ return *this; \
+ }
+
+#define JSON_VALUE_ASSING_OPERATOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class& operator=(const QJsonValue& json) \
+ { \
+ *this = json.toObject(); \
+ return *this; \
+ }
+
+#define COPY_CONSTRUCTOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class( \
+ const derived_class& other, \
+ QObject* parent = nullptr \
+ ) \
+ : base_class(other, parent) \
+ { \
+ *this = other; \
+ }
+
+#define ASSIGN_OPERATOR(base_class, derived_class) \
+public: \
+ derived_class& operator=(const derived_class& other) \
+ { \
+ base_class::operator=(other); \
+ return *this; \
+ }
+
+#define COMPARE_OPERATOR(base_class, derived_class) \
+public: \
+ bool operator==(const derived_class& other) const \
+ { \
+ if (!base_class::operator==(other)) \
+ return false; \
+ for (int i = metaObject()->propertyOffset(); \
+ i < metaObject()->propertyCount(); \
+ i++) \
+ { \
+ auto key = metaObject()->property(i).name(); \
+ \
+ if (property(key) != other.property(key)) \
+ { \
+ return false; \
+ } \
+ } \
+ \
+ return true; \
+ }
+
+#define JSON_VALUE_OPERATOR(base_class) \
+public: \
+ operator const QJsonValue() const \
+ { \
+ return (base_class::operator const QJsonObject()); \
+ }
+
+#define DEFAULT_DESTRUCTOR(classname) \
+public: \
+ Q_INVOKABLE ~classname() Q_DECL_OVERRIDE = default
+
+#define DEFAULT_CONSTRUCTOR(base_class, derived_class) \
+public: \
+ Q_INVOKABLE derived_class(QObject* parent = nullptr) \
+ : base_class(parent) \
+ { \
+ }
+
+#define G_OBJECT(base_class, derived_class) \
+ /*Q_OBJECT*/ \
+ JSON_CONSTRUCTOR(base_class, derived_class) \
+ JSON_VALUE_CONSTRUCTOR(base_class, derived_class) \
+ COPY_CONSTRUCTOR(base_class, derived_class)
+
+class G_Object : public QObject
+{
+ Q_OBJECT
+
+ // constructors
+public:
+ G_Object(QObject* parent = nullptr);
+
+ G_Object(const QJsonObject& json, QObject* parent = nullptr);
+ G_Object(const QJsonValue& json, QObject* parent = nullptr);
+
+ G_Object(const G_Object& other, QObject* parent = nullptr);
+
+ // operators
+public:
+ virtual G_Object& operator=(const G_Object& other);
+ virtual G_Object& operator=(const QJsonObject& json);
+ virtual G_Object& operator=(const QJsonValue& json);
+ virtual operator const QJsonObject() const;
+ virtual operator const QJsonValue() const;
+ virtual bool operator==(const G_Object& other) const;
+
+protected:
+ bool constructFromJson(const QJsonObject& json);
+};
+
+QDebug operator<<(QDebug d, const G_Object& o);