summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-05-26 13:28:10 +0200
committerThomas Haller <thaller@redhat.com>2022-05-31 18:32:33 +0200
commit08c010cb2b700113ddb173eac8b12636b026699a (patch)
treeaba4e27da7ac56feef4ac4dce144ceb0b7909e28
parentd81a9aec31bf71c9a53fed183092c7170a00a289 (diff)
downloadNetworkManager-08c010cb2b700113ddb173eac8b12636b026699a.tar.gz
glib-aux: add nm_g_array_index_p() helper and cleanup nm_g_array*() helpers
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.h75
1 files changed, 47 insertions, 28 deletions
diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h
index 5552bf0567..51a3e0afa5 100644
--- a/src/libnm-glib-aux/nm-shared-utils.h
+++ b/src/libnm-glib-aux/nm-shared-utils.h
@@ -2194,38 +2194,57 @@ nm_g_array_unref(GArray *arr)
g_array_unref(arr);
}
-#define nm_g_array_first(arr, type) \
- ({ \
- GArray *const _arr = (arr); \
- guint _len; \
- \
- nm_assert(_arr); \
- _len = _arr->len; \
- nm_assert(_len > 0); \
- &g_array_index(arr, type, 0); \
+#define nm_g_array_first(arr, Type) \
+ ({ \
+ GArray *const _arr = (arr); \
+ \
+ nm_assert(_arr); \
+ nm_assert(sizeof(Type) == g_array_get_element_size(_arr)); \
+ nm_assert(_arr->len > 0); \
+ \
+ &g_array_index(arr, Type, 0); \
+ })
+
+#define nm_g_array_last(arr, Type) \
+ ({ \
+ GArray *const _arr = (arr); \
+ \
+ nm_assert(_arr); \
+ nm_assert(sizeof(Type) == g_array_get_element_size(_arr)); \
+ nm_assert(_arr->len > 0); \
+ \
+ &g_array_index(arr, Type, _arr->len - 1u); \
})
-#define nm_g_array_last(arr, type) \
- ({ \
- GArray *const _arr = (arr); \
- guint _len; \
- \
- nm_assert(_arr); \
- _len = _arr->len; \
- nm_assert(_len > 0); \
- &g_array_index(arr, type, _len - 1u); \
+/* Similar to g_array_index(). The differences are
+ * - this does nm_assert() checks that the arguments are valid.
+ * - returns a pointer to the element. */
+#define nm_g_array_index_p(arr, Type, idx) \
+ ({ \
+ GArray *const _arr = (arr); \
+ const guint _idx = (idx); \
+ \
+ nm_assert(_arr); \
+ nm_assert(sizeof(Type) == g_array_get_element_size(_arr)); \
+ nm_assert(_idx < _arr->len); \
+ \
+ &g_array_index(_arr, Type, _idx); \
})
-#define nm_g_array_append_new(arr, type) \
- ({ \
- GArray *const _arr = (arr); \
- guint _len; \
- \
- nm_assert(_arr); \
- _len = _arr->len; \
- nm_assert(_len < G_MAXUINT); \
- g_array_set_size(_arr, _len + 1u); \
- &g_array_index(arr, type, _len); \
+#define nm_g_array_append_new(arr, Type) \
+ ({ \
+ GArray *const _arr = (arr); \
+ guint _len; \
+ \
+ nm_assert(_arr); \
+ nm_assert(sizeof(Type) == g_array_get_element_size(_arr)); \
+ \
+ _len = _arr->len; \
+ \
+ nm_assert(_len < G_MAXUINT); \
+ \
+ g_array_set_size(_arr, _len + 1u); \
+ &g_array_index(arr, Type, _len); \
})
/*****************************************************************************/