1 /*
2  * libosinfo:
3  *
4  * Copyright (C) 2020 Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library. If not, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef __OSINFO_MACROS_H__
22 # define __OSINFO_MACROS_H__
23 
24 # include <glib-object.h>
25 
26 # define OSINFO_DECLARE_TYPE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName)                \
27     G_DECLARE_DERIVABLE_TYPE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName)
28 
29 # define OSINFO_DECLARE_TYPE_WITH_PRIVATE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName)  \
30   GType module_obj_name##_get_type (void);                                                               \
31   G_GNUC_BEGIN_IGNORE_DEPRECATIONS                                                                       \
32   typedef struct _##ModuleObjName ModuleObjName;                                                         \
33   typedef struct _##ModuleObjName##Class ModuleObjName##Class;                                           \
34   typedef struct _##ModuleObjName##Private ModuleObjName##Private;                                       \
35   struct _##ModuleObjName { ParentName parent_instance; ModuleObjName##Private *priv; };                 \
36                                                                                                          \
37   _GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, ParentName)                                               \
38                                                                                                          \
39   static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) {                                     \
40     return G_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); }             \
41   static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_CLASS (gpointer ptr) {                      \
42     return G_TYPE_CHECK_CLASS_CAST (ptr, module_obj_name##_get_type (), ModuleObjName##Class); }         \
43   static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) {                                         \
44     return G_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); }                            \
45   static inline gboolean MODULE##_IS_##OBJ_NAME##_CLASS (gpointer ptr) {                                 \
46     return G_TYPE_CHECK_CLASS_TYPE (ptr, module_obj_name##_get_type ()); }                               \
47   static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_GET_CLASS (gpointer ptr) {                  \
48     return G_TYPE_INSTANCE_GET_CLASS (ptr, module_obj_name##_get_type (), ModuleObjName##Class); }       \
49   G_GNUC_END_IGNORE_DEPRECATIONS
50 
51 # define OSINFO_DECLARE_TYPE_WITH_PRIVATE_AND_CLASS(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName) \
52   GType module_obj_name##_get_type (void);                                                                        \
53   G_GNUC_BEGIN_IGNORE_DEPRECATIONS                                                                                \
54   typedef struct _##ModuleObjName ModuleObjName;                                                                  \
55   typedef struct _##ModuleObjName##Class ModuleObjName##Class;                                                    \
56   typedef struct _##ModuleObjName##Private ModuleObjName##Private;                                                \
57   struct _##ModuleObjName { ParentName parent_instance; ModuleObjName##Private *priv; };                          \
58   struct _##ModuleObjName##Class { ParentName##Class parent_class ; };                                            \
59                                                                                                                   \
60   _GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, ParentName)                                                        \
61   G_DEFINE_AUTOPTR_CLEANUP_FUNC (ModuleObjName##Class, g_type_class_unref)                                        \
62                                                                                                                   \
63   G_GNUC_UNUSED static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) {                                       \
64     return G_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); }                      \
65   G_GNUC_UNUSED static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_CLASS (gpointer ptr) {                 \
66     return G_TYPE_CHECK_CLASS_CAST (ptr, module_obj_name##_get_type (), ModuleObjName##Class); }                  \
67   G_GNUC_UNUSED static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) {                                    \
68     return G_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); }                                     \
69   G_GNUC_UNUSED static inline gboolean MODULE##_IS_##OBJ_NAME##_CLASS (gpointer ptr) {                            \
70     return G_TYPE_CHECK_CLASS_TYPE (ptr, module_obj_name##_get_type ()); }                                        \
71   G_GNUC_UNUSED static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_GET_CLASS (gpointer ptr) {             \
72     return G_TYPE_INSTANCE_GET_CLASS (ptr, module_obj_name##_get_type (), ModuleObjName##Class); }                \
73   G_GNUC_END_IGNORE_DEPRECATIONS
74 
75 #endif /* __OSINFO_MACROS_H__ */
76