diff options
Diffstat (limited to 'shared/nm-glib-aux/nm-value-type.h')
| -rw-r--r-- | shared/nm-glib-aux/nm-value-type.h | 287 |
1 files changed, 151 insertions, 136 deletions
diff --git a/shared/nm-glib-aux/nm-value-type.h b/shared/nm-glib-aux/nm-value-type.h index 6fe6f072..c07f1104 100644 --- a/shared/nm-glib-aux/nm-value-type.h +++ b/shared/nm-glib-aux/nm-value-type.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2019 Red Hat, Inc. */ @@ -7,11 +7,11 @@ #define __NM_VALUE_TYPE_H__ typedef enum { - NM_VALUE_TYPE_UNSPEC = 1, - NM_VALUE_TYPE_BOOL = 2, - NM_VALUE_TYPE_INT32 = 3, - NM_VALUE_TYPE_INT = 4, - NM_VALUE_TYPE_STRING = 5, + NM_VALUE_TYPE_UNSPEC = 1, + NM_VALUE_TYPE_BOOL = 2, + NM_VALUE_TYPE_INT32 = 3, + NM_VALUE_TYPE_INT = 4, + NM_VALUE_TYPE_STRING = 5, } NMValueType; /*****************************************************************************/ @@ -19,176 +19,191 @@ typedef enum { #ifdef NM_VALUE_TYPE_DEFINE_FUNCTIONS typedef union { - bool v_bool; - gint32 v_int32; - int v_int; - const char *v_string; + bool v_bool; + gint32 v_int32; + int v_int; + const char *v_string; - /* for convenience, also let the union contain other pointer types. These are - * for NM_VALUE_TYPE_UNSPEC. */ - gconstpointer *v_ptr; - const GPtrArray *v_ptrarray; + /* for convenience, also let the union contain other pointer types. These are + * for NM_VALUE_TYPE_UNSPEC. */ + gconstpointer * v_ptr; + const GPtrArray *v_ptrarray; } NMValueTypUnion; -/* Set the NMValueTypUnion. You can also assign the member directly. + /* Set the NMValueTypUnion. You can also assign the member directly. * The only purpose of this is that it also returns a pointer to the * union. So, you can do * * ptr = NM_VALUE_TYP_UNION_SET (&value_typ_union_storage, v_bool, TRUE); */ -#define NM_VALUE_TYP_UNION_SET(_arg, _type, _val) \ - ({ \ - NMValueTypUnion *const _arg2 = (_arg); \ - \ - *_arg2 = (NMValueTypUnion) { \ - ._type = (_val), \ - }; \ - _arg2; \ - }) + #define NM_VALUE_TYP_UNION_SET(_arg, _type, _val) \ + ({ \ + NMValueTypUnion *const _arg2 = (_arg); \ + \ + *_arg2 = (NMValueTypUnion){ \ + ._type = (_val), \ + }; \ + _arg2; \ + }) typedef struct { - bool has; - NMValueTypUnion val; + bool has; + NMValueTypUnion val; } NMValueTypUnioMaybe; -#define NM_VALUE_TYP_UNIO_MAYBE_SET(_arg, _type, _val) \ - ({ \ - NMValueTypUnioMaybe *const _arg2 = (_arg); \ - \ - *_arg2 = (NMValueTypUnioMaybe) { \ - .has = TRUE, \ - .val._type = (_val), \ - }; \ - _arg2; \ - }) + #define NM_VALUE_TYP_UNIO_MAYBE_SET(_arg, _type, _val) \ + ({ \ + NMValueTypUnioMaybe *const _arg2 = (_arg); \ + \ + *_arg2 = (NMValueTypUnioMaybe){ \ + .has = TRUE, \ + .val._type = (_val), \ + }; \ + _arg2; \ + }) /*****************************************************************************/ static inline int -nm_value_type_cmp (NMValueType value_type, - gconstpointer p_a, - gconstpointer p_b) +nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b) { - switch (value_type) { - case NM_VALUE_TYPE_BOOL: NM_CMP_DIRECT (*((const bool *) p_a), *((const bool *) p_b)); return 0; - case NM_VALUE_TYPE_INT32: NM_CMP_DIRECT (*((const gint32 *) p_a), *((const gint32 *) p_b)); return 0; - case NM_VALUE_TYPE_INT: NM_CMP_DIRECT (*((const int *) p_a), *((const int *) p_b)); return 0; - case NM_VALUE_TYPE_STRING: return nm_strcmp0 (*((const char *const*) p_a), *((const char *const*) p_b)); - case NM_VALUE_TYPE_UNSPEC: - break; - } - nm_assert_not_reached (); - return 0; + switch (value_type) { + case NM_VALUE_TYPE_BOOL: + NM_CMP_DIRECT(*((const bool *) p_a), *((const bool *) p_b)); + return 0; + case NM_VALUE_TYPE_INT32: + NM_CMP_DIRECT(*((const gint32 *) p_a), *((const gint32 *) p_b)); + return 0; + case NM_VALUE_TYPE_INT: + NM_CMP_DIRECT(*((const int *) p_a), *((const int *) p_b)); + return 0; + case NM_VALUE_TYPE_STRING: + return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b)); + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached(); + return 0; } static inline gboolean -nm_value_type_equal (NMValueType value_type, - gconstpointer p_a, - gconstpointer p_b) +nm_value_type_equal(NMValueType value_type, gconstpointer p_a, gconstpointer p_b) { - return nm_value_type_cmp (value_type, p_a, p_b) == 0; + return nm_value_type_cmp(value_type, p_a, p_b) == 0; } static inline void -nm_value_type_copy (NMValueType value_type, - gpointer dst, - gconstpointer src) +nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src) { - switch (value_type) { - case NM_VALUE_TYPE_BOOL: (*((bool *) dst) = *((const bool *) src)); return; - case NM_VALUE_TYPE_INT32: (*((gint32 *) dst) = *((const gint32 *) src)); return; - case NM_VALUE_TYPE_INT: (*((int *) dst) = *((const int *) src)); return; - case NM_VALUE_TYPE_STRING: - /* self assignment safe! */ - if (*((char **) dst) != *((const char *const*) src)) { - g_free (*((char **) dst)); - *((char **) dst) = g_strdup (*((const char *const*) src)); - } - return; - case NM_VALUE_TYPE_UNSPEC: - break; - } - nm_assert_not_reached (); + switch (value_type) { + case NM_VALUE_TYPE_BOOL: + (*((bool *) dst) = *((const bool *) src)); + return; + case NM_VALUE_TYPE_INT32: + (*((gint32 *) dst) = *((const gint32 *) src)); + return; + case NM_VALUE_TYPE_INT: + (*((int *) dst) = *((const int *) src)); + return; + case NM_VALUE_TYPE_STRING: + /* self assignment safe! */ + if (*((char **) dst) != *((const char *const *) src)) { + g_free(*((char **) dst)); + *((char **) dst) = g_strdup(*((const char *const *) src)); + } + return; + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached(); } static inline void -nm_value_type_get_from_variant (NMValueType value_type, - gpointer dst, - GVariant *variant, - gboolean clone) +nm_value_type_get_from_variant(NMValueType value_type, + gpointer dst, + GVariant * variant, + gboolean clone) { - switch (value_type) { - case NM_VALUE_TYPE_BOOL: *((bool *) dst) = g_variant_get_boolean (variant); return; - case NM_VALUE_TYPE_INT32: *((gint32 *) dst) = g_variant_get_int32 (variant); return; - case NM_VALUE_TYPE_STRING: - if (clone) { - g_free (*((char **) dst)); - *((char **) dst) = g_variant_dup_string (variant, NULL); - } else { - /* we don't clone the string, nor free the previous value. */ - *((const char **) dst) = g_variant_get_string (variant, NULL); - } - return; - - case NM_VALUE_TYPE_INT: - /* "int" also does not have a define variant type, because it's not - * clear how many bits we would need. */ - - /* fall-through */ - case NM_VALUE_TYPE_UNSPEC: - break; - } - nm_assert_not_reached (); + switch (value_type) { + case NM_VALUE_TYPE_BOOL: + *((bool *) dst) = g_variant_get_boolean(variant); + return; + case NM_VALUE_TYPE_INT32: + *((gint32 *) dst) = g_variant_get_int32(variant); + return; + case NM_VALUE_TYPE_STRING: + if (clone) { + g_free(*((char **) dst)); + *((char **) dst) = g_variant_dup_string(variant, NULL); + } else { + /* we don't clone the string, nor free the previous value. */ + *((const char **) dst) = g_variant_get_string(variant, NULL); + } + return; + + case NM_VALUE_TYPE_INT: + /* "int" also does not have a define variant type, because it's not + * clear how many bits we would need. */ + + /* fall-through */ + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached(); } static inline GVariant * -nm_value_type_to_variant (NMValueType value_type, - gconstpointer src) +nm_value_type_to_variant(NMValueType value_type, gconstpointer src) { - const char *v_string; - - switch (value_type) { - case NM_VALUE_TYPE_BOOL: return g_variant_new_boolean (*((const bool *) src)); - case NM_VALUE_TYPE_INT32: return g_variant_new_int32 (*((const gint32 *) src));; - case NM_VALUE_TYPE_STRING: - v_string = *((const char *const*) src); - return v_string ? g_variant_new_string (v_string) : NULL; - - case NM_VALUE_TYPE_INT: - /* "int" also does not have a define variant type, because it's not - * clear how many bits we would need. */ - - /* fall-through */ - case NM_VALUE_TYPE_UNSPEC: - break; - } - nm_assert_not_reached (); - return NULL; + const char *v_string; + + switch (value_type) { + case NM_VALUE_TYPE_BOOL: + return g_variant_new_boolean(*((const bool *) src)); + case NM_VALUE_TYPE_INT32: + return g_variant_new_int32(*((const gint32 *) src)); + case NM_VALUE_TYPE_STRING: + v_string = *((const char *const *) src); + return v_string ? g_variant_new_string(v_string) : NULL; + + case NM_VALUE_TYPE_INT: + /* "int" also does not have a define variant type, because it's not + * clear how many bits we would need. */ + + /* fall-through */ + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached(); + return NULL; } static inline const GVariantType * -nm_value_type_get_variant_type (NMValueType value_type) +nm_value_type_get_variant_type(NMValueType value_type) { - switch (value_type) { - case NM_VALUE_TYPE_BOOL: return G_VARIANT_TYPE_BOOLEAN; - case NM_VALUE_TYPE_INT32: return G_VARIANT_TYPE_INT32; - case NM_VALUE_TYPE_STRING: return G_VARIANT_TYPE_STRING; - - case NM_VALUE_TYPE_INT: - /* "int" also does not have a define variant type, because it's not - * clear how many bits we would need. */ - - /* fall-through */ - case NM_VALUE_TYPE_UNSPEC: - break; - } - nm_assert_not_reached (); - return NULL; + switch (value_type) { + case NM_VALUE_TYPE_BOOL: + return G_VARIANT_TYPE_BOOLEAN; + case NM_VALUE_TYPE_INT32: + return G_VARIANT_TYPE_INT32; + case NM_VALUE_TYPE_STRING: + return G_VARIANT_TYPE_STRING; + + case NM_VALUE_TYPE_INT: + /* "int" also does not have a define variant type, because it's not + * clear how many bits we would need. */ + + /* fall-through */ + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached(); + return NULL; } -/*****************************************************************************/ + /*****************************************************************************/ #endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */ -#endif /* __NM_VALUE_TYPE_H__ */ +#endif /* __NM_VALUE_TYPE_H__ */ |