From 6decc8c40dfaf7cb04156f1ab233cd856ed06b37 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 20 May 2024 17:15:25 +0200
Subject: Improve the DECLARE_GTYPE() macro and use it everywhere.

---
 src/analysis/content.h               | 17 ++--------
 src/analysis/contents/encapsulated.h | 18 ++---------
 src/analysis/contents/file.h         | 18 ++---------
 src/analysis/contents/memory.h       | 18 ++---------
 src/analysis/contents/restricted.h   | 18 ++---------
 src/glibext/helpers.h                | 60 ++++++++++++++++++------------------
 src/plugins/plugin.h                 | 18 ++---------
 7 files changed, 48 insertions(+), 119 deletions(-)

diff --git a/src/analysis/content.h b/src/analysis/content.h
index ad50c02..ce6810f 100644
--- a/src/analysis/content.h
+++ b/src/analysis/content.h
@@ -32,26 +32,15 @@
 //#include "cattribs.h" // FIXME
 #include "../arch/vmpa.h"
 #include "../common/leb128.h"
+#include "../glibext/helpers.h"
 
 
 
-#define G_TYPE_BIN_CONTENT            g_binary_content_get_type()
-#define G_BIN_CONTENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BIN_CONTENT, GBinContent))
-#define G_IS_BIN_CONTENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BIN_CONTENT))
-#define G_BIN_CONTENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_CONTENT, GBinContentClass))
-#define G_IS_BIN_CONTENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_CONTENT))
-#define G_BIN_CONTENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_CONTENT, GBinContentClass))
+#define G_TYPE_BIN_CONTENT (g_binary_content_get_type())
 
+DECLARE_GTYPE(GBinContent, g_binary_content, G, BIN_CONTENT);
 
-/* Accès à un contenu binaire quelconque (instance) */
-typedef struct _GBinContent GBinContent;
 
-/* Accès à un contenu binaire quelconque (classe) */
-typedef struct _GBinContentClass GBinContentClass;
-
-
-/* Détermine le type d'un contenu binaire à parcourir. */
-GType g_binary_content_get_type(void) G_GNUC_CONST;
 #if 0 // FIXME
 /* Associe un ensemble d'attributs au contenu binaire. */
 void g_binary_content_set_attributes(GBinContent *, GContentAttributes *);
diff --git a/src/analysis/contents/encapsulated.h b/src/analysis/contents/encapsulated.h
index 9b74eac..bfd17e7 100644
--- a/src/analysis/contents/encapsulated.h
+++ b/src/analysis/contents/encapsulated.h
@@ -29,26 +29,14 @@
 
 
 #include "../content.h"
+#include "../../glibext/helpers.h"
 
 
 
-#define G_TYPE_ENCAPS_CONTENT            (g_encaps_content_get_type())
-#define G_ENCAPS_CONTENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_ENCAPS_CONTENT, GEncapsContent))
-#define G_IS_ENCAPS_CONTENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_ENCAPS_CONTENT))
-#define G_ENCAPS_CONTENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_ENCAPS_CONTENT, GEncapsContentClass))
-#define G_IS_ENCAPS_CONTENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_ENCAPS_CONTENT))
-#define G_ENCAPS_CONTENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_ENCAPS_CONTENT, GEncapsContentClass))
+#define G_TYPE_ENCAPS_CONTENT (g_encaps_content_get_type())
 
+DECLARE_GTYPE(GEncapsContent, g_encaps_content, G, ENCAPS_CONTENT);
 
-/* Contenu de issu d'un contenu plus global (instance) */
-typedef struct _GEncapsContent GEncapsContent;
-
-/* Contenu de issu d'un contenu plus global (classe) */
-typedef struct _GEncapsContentClass GEncapsContentClass;
-
-
-/* Indique le type défini par la GLib pour les contenus encapsulés. */
-GType g_encaps_content_get_type(void);
 
 /* Charge en mémoire un contenu binaire encapsulé. */
 GBinContent *g_encaps_content_new(GBinContent *, const char *, GBinContent *);
diff --git a/src/analysis/contents/file.h b/src/analysis/contents/file.h
index 5039f81..c54d890 100644
--- a/src/analysis/contents/file.h
+++ b/src/analysis/contents/file.h
@@ -29,26 +29,14 @@
 
 
 #include "../content.h"
+#include "../../glibext/helpers.h"
 
 
 
-#define G_TYPE_FILE_CONTENT            (g_file_content_get_type())
-#define G_FILE_CONTENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FILE_CONTENT, GFileContent))
-#define G_IS_FILE_CONTENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FILE_CONTENT))
-#define G_FILE_CONTENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FILE_CONTENT, GFileContentClass))
-#define G_IS_FILE_CONTENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FILE_CONTENT))
-#define G_FILE_CONTENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_FILE_CONTENT, GFileContentClass))
+#define G_TYPE_FILE_CONTENT (g_file_content_get_type())
 
+DECLARE_GTYPE(GFileContent, g_file_content, G, FILE_CONTENT);
 
-/* Contenu de données binaires issues d'un fichier (instance) */
-typedef struct _GFileContent GFileContent;
-
-/* Contenu de données binaires issues d'un fichier (classe) */
-typedef struct _GFileContentClass GFileContentClass;
-
-
-/* Indique le type défini par la GLib pour les contenus de données. */
-GType g_file_content_get_type(void);
 
 /* Charge en mémoire le contenu d'un fichier donné. */
 GBinContent *g_file_content_new(const char *);
diff --git a/src/analysis/contents/memory.h b/src/analysis/contents/memory.h
index 1759e69..20e3d18 100644
--- a/src/analysis/contents/memory.h
+++ b/src/analysis/contents/memory.h
@@ -29,26 +29,14 @@
 
 
 #include "../content.h"
+#include "../../glibext/helpers.h"
 
 
 
-#define G_TYPE_MEMORY_CONTENT            (g_memory_content_get_type())
-#define G_MEMORY_CONTENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_MEMORY_CONTENT, GMemoryContent))
-#define G_IS_MEMORY_CONTENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_MEMORY_CONTENT))
-#define G_MEMORY_CONTENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_MEMORY_CONTENT, GMemoryContentClass))
-#define G_IS_MEMORY_CONTENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_MEMORY_CONTENT))
-#define G_MEMORY_CONTENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_MEMORY_CONTENT, GMemoryContentClass))
+#define G_TYPE_MEMORY_CONTENT (g_memory_content_get_type())
 
+DECLARE_GTYPE(GMemoryContent, g_memory_content, G, MEMORY_CONTENT);
 
-/* Contenu de données binaires résidant en mémoire (instance) */
-typedef struct _GMemoryContent GMemoryContent;
-
-/* Contenu de données binaires résidant en mémoire (classe) */
-typedef struct _GMemoryContentClass GMemoryContentClass;
-
-
-/* Indique le type défini par la GLib pour les contenus de données en mémoire. */
-GType g_memory_content_get_type(void);
 
 /* Charge en mémoire le contenu de données brutes. */
 GBinContent *g_memory_content_new(const bin_t *, phys_t);
diff --git a/src/analysis/contents/restricted.h b/src/analysis/contents/restricted.h
index 1cea390..3925233 100644
--- a/src/analysis/contents/restricted.h
+++ b/src/analysis/contents/restricted.h
@@ -29,26 +29,14 @@
 
 
 #include "../content.h"
+#include "../../glibext/helpers.h"
 
 
 
-#define G_TYPE_RESTRICTED_CONTENT             (g_restricted_content_get_type())
-#define G_RESTRICTED_CONTENT(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_RESTRICTED_CONTENT, GRestrictedContent))
-#define G_IS_RESTRICTED_CONTENT(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_RESTRICTED_CONTENT))
-#define G_RESTRICTED_CONTENT_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_RESTRICTED_CONTENT, GRestrictedContentClass))
-#define G_IS_RESTRICTED_CONTENT_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_RESTRICTED_CONTENT))
-#define G_RESTRICTED_CONTENT_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_RESTRICTED_CONTENT, GRestrictedContentClass))
+#define G_TYPE_RESTRICTED_CONTENT (g_restricted_content_get_type())
 
+DECLARE_GTYPE(GRestrictedContent, g_restricted_content, G, RESTRICTED_CONTENT);
 
-/* Contenu de données binaires issues d'un contenu restreint (instance) */
-typedef struct _GRestrictedContent GRestrictedContent;
-
-/* Contenu de données binaires issues d'un contenu restreint (classe) */
-typedef struct _GRestrictedContentClass GRestrictedContentClass;
-
-
-/* Indique le type défini par la GLib pour les contenus de données. */
-GType g_restricted_content_get_type(void);
 
 /* Charge en mémoire le contenu d'un contenu restreint. */
 GBinContent *g_restricted_content_new(GBinContent *, const mrange_t *);
diff --git a/src/glibext/helpers.h b/src/glibext/helpers.h
index 752eb07..71a7269 100644
--- a/src/glibext/helpers.h
+++ b/src/glibext/helpers.h
@@ -56,36 +56,36 @@
  * préalable de manière globale et cohérente dans l'ensemble du code d'emploi.
  */
 
-#define DECLARE_GTYPE(TN, t_n, MOD, NAME)                                           \
-                                                                                    \
-    GType t_n##_get_type(void);                                                     \
-                                                                                    \
-    typedef struct _##TN TN;                                                        \
-    typedef struct _##TN##Class TN##Class;                                          \
-                                                                                    \
-    G_GNUC_UNUSED static inline TN *MOD##_##NAME(gpointer obj)                      \
-    {                                                                               \
-        return G_TYPE_CHECK_INSTANCE_CAST(obj, MOD##_TYPE_##NAME, TN);              \
-    }                                                                               \
-                                                                                    \
-    G_GNUC_UNUSED static inline TN##Class *MOD##_##NAME##_CLASS(gpointer klass)     \
-    {                                                                               \
-        return G_TYPE_CHECK_CLASS_CAST(klass, MOD##_TYPE_##NAME, TN##Class);        \
-    }                                                                               \
-                                                                                    \
-    G_GNUC_UNUSED static inline gboolean MOD##_IS_##NAME(gpointer obj)              \
-    {                                                                               \
-        return G_TYPE_CHECK_INSTANCE_TYPE(obj, MOD##_TYPE_##NAME);                  \
-    }                                                                               \
-                                                                                    \
-    G_GNUC_UNUSED static inline gboolean MOD##_IS_##NAME##_CLASS(gpointer klass)    \
-    {                                                                               \
-        return G_TYPE_CHECK_CLASS_TYPE(klass, MOD##_TYPE_##NAME);                   \
-    }                                                                               \
-                                                                                    \
-    G_GNUC_UNUSED static inline TN##Class *MOD##_##NAME##_GET_CLASS(gpointer obj)   \
-    {                                                                               \
-        return G_TYPE_INSTANCE_GET_CLASS(obj, MOD##_TYPE_##NAME, TN##Class);        \
+#define DECLARE_GTYPE(TN, t_n, MOD, NAME)                                               \
+                                                                                        \
+    GType t_n##_get_type(void) G_GNUC_CONST;                                            \
+                                                                                        \
+    typedef struct _##TN TN;                                                            \
+    typedef struct _##TN##Class TN##Class;                                              \
+                                                                                        \
+    G_GNUC_UNUSED static inline TN *MOD##_##NAME(gconstpointer obj)                     \
+    {                                                                                   \
+        return G_TYPE_CHECK_INSTANCE_CAST(obj, MOD##_TYPE_##NAME, TN);                  \
+    }                                                                                   \
+                                                                                        \
+    G_GNUC_UNUSED static inline TN##Class *MOD##_##NAME##_CLASS(gconstpointer klass)    \
+    {                                                                                   \
+        return G_TYPE_CHECK_CLASS_CAST(klass, MOD##_TYPE_##NAME, TN##Class);            \
+    }                                                                                   \
+                                                                                        \
+    G_GNUC_UNUSED static inline gboolean MOD##_IS_##NAME(gconstpointer obj)             \
+    {                                                                                   \
+        return G_TYPE_CHECK_INSTANCE_TYPE(obj, MOD##_TYPE_##NAME);                      \
+    }                                                                                   \
+                                                                                        \
+    G_GNUC_UNUSED static inline gboolean MOD##_IS_##NAME##_CLASS(gconstpointer klass)   \
+    {                                                                                   \
+        return G_TYPE_CHECK_CLASS_TYPE(klass, MOD##_TYPE_##NAME);                       \
+    }                                                                                   \
+                                                                                        \
+    G_GNUC_UNUSED static inline TN##Class *MOD##_##NAME##_GET_CLASS(gconstpointer obj)  \
+    {                                                                                   \
+        return G_TYPE_INSTANCE_GET_CLASS(obj, MOD##_TYPE_##NAME, TN##Class);            \
     }
 
 
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 7e51f6e..5c473b2 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -31,6 +31,7 @@
 
 #include "plugin-def.h"
 #include "../core/logs.h"
+#include "../glibext/helpers.h"
 #if 0
 #include "../analysis/binary.h"
 #include "../core/logs.h"
@@ -46,11 +47,9 @@
 
 
 
-/* Greffon pour Chrysalide (instance) */
-typedef struct _GPluginModule GPluginModule;
+#define G_TYPE_PLUGIN_MODULE (g_plugin_module_get_type())
 
-/* Greffon pour Chrysalide (classe) */
-typedef struct _GPluginModuleClass GPluginModuleClass;
+DECLARE_GTYPE(GPluginModule, g_plugin_module, G, PLUGIN_MODULE);
 
 
 /* Fanions indiquant le statut du greffon */
@@ -68,17 +67,6 @@ typedef enum _PluginStatusFlags
 #define BROKEN_PLUGIN_STATUS (PSF_UNKNOW_DEP | PSF_DEP_LOOP | PSF_FAILURE)
 
 
-#define G_TYPE_PLUGIN_MODULE            (g_plugin_module_get_type())
-#define G_PLUGIN_MODULE(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_PLUGIN_MODULE, GPluginModule))
-#define G_IS_PLUGIN_MODULE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_PLUGIN_MODULE))
-#define G_PLUGIN_MODULE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_PLUGIN_MODULE, GPluginModuleClass))
-#define G_IS_PLUGIN_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_PLUGIN_MODULE))
-#define G_PLUGIN_MODULE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_PLUGIN_MODULE, GPluginModuleClass))
-
-
-/* Indique le type défini pour un greffon. */
-GType g_plugin_module_get_type(void);
-
 /* Crée un module pour un greffon donné. */
 GPluginModule *g_plugin_module_new(const gchar *);
 
-- 
cgit v0.11.2-87-g4458