Blame src/libnm-glib-aux/nm-value-type.h

Packit Service dff8e4
/* SPDX-License-Identifier: LGPL-2.1-or-later */
Packit Service dff8e4
/*
Packit Service dff8e4
 * Copyright (C) 2019 Red Hat, Inc.
Packit Service dff8e4
 */
Packit Service dff8e4
Packit Service dff8e4
#ifndef __NM_VALUE_TYPE_H__
Packit Service dff8e4
#define __NM_VALUE_TYPE_H__
Packit Service dff8e4
Packit Bot c44df3
typedef enum _nm_packed {
Packit Service dff8e4
    NM_VALUE_TYPE_UNSPEC = 1,
Packit Service dff8e4
    NM_VALUE_TYPE_BOOL   = 2,
Packit Service dff8e4
    NM_VALUE_TYPE_INT32  = 3,
Packit Service dff8e4
    NM_VALUE_TYPE_INT    = 4,
Packit Bot c44df3
    NM_VALUE_TYPE_INT64  = 5,
Packit Bot c44df3
    NM_VALUE_TYPE_UINT64 = 6,
Packit Bot c44df3
    NM_VALUE_TYPE_STRING = 7,
Packit Service dff8e4
} NMValueType;
Packit Service dff8e4
Packit Service dff8e4
/*****************************************************************************/
Packit Service dff8e4
Packit Service dff8e4
#ifdef NM_VALUE_TYPE_DEFINE_FUNCTIONS
Packit Service dff8e4
Packit Service dff8e4
typedef union {
Packit Service dff8e4
    bool        v_bool;
Packit Service dff8e4
    gint32      v_int32;
Packit Bot c44df3
    gint64      v_int64;
Packit Bot c44df3
    guint64     v_uint64;
Packit Service dff8e4
    int         v_int;
Packit Service dff8e4
    const char *v_string;
Packit Service dff8e4
Packit Service dff8e4
    /* for convenience, also let the union contain other pointer types. These are
Packit Service dff8e4
     * for NM_VALUE_TYPE_UNSPEC. */
Packit Service dff8e4
    gconstpointer *  v_ptr;
Packit Service dff8e4
    const GPtrArray *v_ptrarray;
Packit Service dff8e4
Packit Service dff8e4
} NMValueTypUnion;
Packit Service dff8e4
Packit Service dff8e4
    /* Set the NMValueTypUnion. You can also assign the member directly.
Packit Service dff8e4
 * The only purpose of this is that it also returns a pointer to the
Packit Service dff8e4
 * union. So, you can do
Packit Service dff8e4
 *
Packit Service dff8e4
 *   ptr = NM_VALUE_TYP_UNION_SET (&value_typ_union_storage, v_bool, TRUE);
Packit Service dff8e4
 */
Packit Service dff8e4
    #define NM_VALUE_TYP_UNION_SET(_arg, _type, _val) \
Packit Service dff8e4
        ({                                            \
Packit Service dff8e4
            NMValueTypUnion *const _arg2 = (_arg);    \
Packit Service dff8e4
                                                      \
Packit Service dff8e4
            *_arg2 = (NMValueTypUnion){               \
Packit Service dff8e4
                ._type = (_val),                      \
Packit Service dff8e4
            };                                        \
Packit Service dff8e4
            _arg2;                                    \
Packit Service dff8e4
        })
Packit Service dff8e4
Packit Service dff8e4
typedef struct {
Packit Service dff8e4
    bool            has;
Packit Service dff8e4
    NMValueTypUnion val;
Packit Service dff8e4
} NMValueTypUnioMaybe;
Packit Service dff8e4
Packit Service dff8e4
    #define NM_VALUE_TYP_UNIO_MAYBE_SET(_arg, _type, _val) \
Packit Service dff8e4
        ({                                                 \
Packit Service dff8e4
            NMValueTypUnioMaybe *const _arg2 = (_arg);     \
Packit Service dff8e4
                                                           \
Packit Service dff8e4
            *_arg2 = (NMValueTypUnioMaybe){                \
Packit Service dff8e4
                .has       = TRUE,                         \
Packit Service dff8e4
                .val._type = (_val),                       \
Packit Service dff8e4
            };                                             \
Packit Service dff8e4
            _arg2;                                         \
Packit Service dff8e4
        })
Packit Service dff8e4
Packit Service dff8e4
/*****************************************************************************/
Packit Service dff8e4
Packit Service dff8e4
static inline int
Packit Service dff8e4
nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
Packit Service dff8e4
{
Packit Service dff8e4
    switch (value_type) {
Packit Service dff8e4
    case NM_VALUE_TYPE_BOOL:
Packit Service dff8e4
        NM_CMP_DIRECT(*((const bool *) p_a), *((const bool *) p_b));
Packit Service dff8e4
        return 0;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT32:
Packit Service dff8e4
        NM_CMP_DIRECT(*((const gint32 *) p_a), *((const gint32 *) p_b));
Packit Service dff8e4
        return 0;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT:
Packit Service dff8e4
        NM_CMP_DIRECT(*((const int *) p_a), *((const int *) p_b));
Packit Service dff8e4
        return 0;
Packit Bot c44df3
    case NM_VALUE_TYPE_INT64:
Packit Bot c44df3
        NM_CMP_DIRECT(*((const gint64 *) p_a), *((const gint64 *) p_b));
Packit Bot c44df3
        return 0;
Packit Bot c44df3
    case NM_VALUE_TYPE_UINT64:
Packit Bot c44df3
        NM_CMP_DIRECT(*((const guint64 *) p_a), *((const guint64 *) p_b));
Packit Bot c44df3
        return 0;
Packit Service dff8e4
    case NM_VALUE_TYPE_STRING:
Packit Service dff8e4
        return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b));
Packit Service dff8e4
    case NM_VALUE_TYPE_UNSPEC:
Packit Service dff8e4
        break;
Packit Service dff8e4
    }
Packit Service dff8e4
    nm_assert_not_reached();
Packit Service dff8e4
    return 0;
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
static inline gboolean
Packit Service dff8e4
nm_value_type_equal(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
Packit Service dff8e4
{
Packit Service dff8e4
    return nm_value_type_cmp(value_type, p_a, p_b) == 0;
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
static inline void
Packit Service dff8e4
nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src)
Packit Service dff8e4
{
Packit Service dff8e4
    switch (value_type) {
Packit Service dff8e4
    case NM_VALUE_TYPE_BOOL:
Packit Service dff8e4
        (*((bool *) dst) = *((const bool *) src));
Packit Service dff8e4
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT32:
Packit Service dff8e4
        (*((gint32 *) dst) = *((const gint32 *) src));
Packit Service dff8e4
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT:
Packit Service dff8e4
        (*((int *) dst) = *((const int *) src));
Packit Service dff8e4
        return;
Packit Bot c44df3
    case NM_VALUE_TYPE_INT64:
Packit Bot c44df3
        (*((gint64 *) dst) = *((const gint64 *) src));
Packit Bot c44df3
        return;
Packit Bot c44df3
    case NM_VALUE_TYPE_UINT64:
Packit Bot c44df3
        (*((guint64 *) dst) = *((const guint64 *) src));
Packit Bot c44df3
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_STRING:
Packit Service dff8e4
        /* self assignment safe! */
Packit Service dff8e4
        if (*((char **) dst) != *((const char *const *) src)) {
Packit Service dff8e4
            g_free(*((char **) dst));
Packit Service dff8e4
            *((char **) dst) = g_strdup(*((const char *const *) src));
Packit Service dff8e4
        }
Packit Service dff8e4
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_UNSPEC:
Packit Service dff8e4
        break;
Packit Service dff8e4
    }
Packit Service dff8e4
    nm_assert_not_reached();
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
static inline void
Packit Service dff8e4
nm_value_type_get_from_variant(NMValueType value_type,
Packit Service dff8e4
                               gpointer    dst,
Packit Service dff8e4
                               GVariant *  variant,
Packit Service dff8e4
                               gboolean    clone)
Packit Service dff8e4
{
Packit Service dff8e4
    switch (value_type) {
Packit Service dff8e4
    case NM_VALUE_TYPE_BOOL:
Packit Service dff8e4
        *((bool *) dst) = g_variant_get_boolean(variant);
Packit Service dff8e4
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT32:
Packit Service dff8e4
        *((gint32 *) dst) = g_variant_get_int32(variant);
Packit Service dff8e4
        return;
Packit Bot c44df3
    case NM_VALUE_TYPE_INT64:
Packit Bot c44df3
        *((gint64 *) dst) = g_variant_get_int64(variant);
Packit Bot c44df3
        return;
Packit Bot c44df3
    case NM_VALUE_TYPE_UINT64:
Packit Bot c44df3
        *((guint64 *) dst) = g_variant_get_uint64(variant);
Packit Bot c44df3
        return;
Packit Service dff8e4
    case NM_VALUE_TYPE_STRING:
Packit Service dff8e4
        if (clone) {
Packit Service dff8e4
            g_free(*((char **) dst));
Packit Service dff8e4
            *((char **) dst) = g_variant_dup_string(variant, NULL);
Packit Service dff8e4
        } else {
Packit Service dff8e4
            /* we don't clone the string, nor free the previous value. */
Packit Service dff8e4
            *((const char **) dst) = g_variant_get_string(variant, NULL);
Packit Service dff8e4
        }
Packit Service dff8e4
        return;
Packit Service dff8e4
Packit Service dff8e4
    case NM_VALUE_TYPE_INT:
Packit Service dff8e4
        /* "int" also does not have a define variant type, because it's not
Packit Service dff8e4
         * clear how many bits we would need. */
Packit Service dff8e4
Packit Service dff8e4
        /* fall-through */
Packit Service dff8e4
    case NM_VALUE_TYPE_UNSPEC:
Packit Service dff8e4
        break;
Packit Service dff8e4
    }
Packit Service dff8e4
    nm_assert_not_reached();
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
static inline GVariant *
Packit Service dff8e4
nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
Packit Service dff8e4
{
Packit Service dff8e4
    const char *v_string;
Packit Service dff8e4
Packit Service dff8e4
    switch (value_type) {
Packit Service dff8e4
    case NM_VALUE_TYPE_BOOL:
Packit Service dff8e4
        return g_variant_new_boolean(*((const bool *) src));
Packit Service dff8e4
    case NM_VALUE_TYPE_INT32:
Packit Service dff8e4
        return g_variant_new_int32(*((const gint32 *) src));
Packit Bot c44df3
    case NM_VALUE_TYPE_INT64:
Packit Bot c44df3
        return g_variant_new_int64(*((const gint64 *) src));
Packit Bot c44df3
    case NM_VALUE_TYPE_UINT64:
Packit Bot c44df3
        return g_variant_new_uint64(*((const guint64 *) src));
Packit Service dff8e4
    case NM_VALUE_TYPE_STRING:
Packit Service dff8e4
        v_string = *((const char *const *) src);
Packit Service dff8e4
        return v_string ? g_variant_new_string(v_string) : NULL;
Packit Service dff8e4
Packit Service dff8e4
    case NM_VALUE_TYPE_INT:
Packit Service dff8e4
        /* "int" also does not have a define variant type, because it's not
Packit Service dff8e4
         * clear how many bits we would need. */
Packit Service dff8e4
Packit Service dff8e4
        /* fall-through */
Packit Service dff8e4
    case NM_VALUE_TYPE_UNSPEC:
Packit Service dff8e4
        break;
Packit Service dff8e4
    }
Packit Service dff8e4
    nm_assert_not_reached();
Packit Service dff8e4
    return NULL;
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
static inline const GVariantType *
Packit Service dff8e4
nm_value_type_get_variant_type(NMValueType value_type)
Packit Service dff8e4
{
Packit Service dff8e4
    switch (value_type) {
Packit Service dff8e4
    case NM_VALUE_TYPE_BOOL:
Packit Service dff8e4
        return G_VARIANT_TYPE_BOOLEAN;
Packit Service dff8e4
    case NM_VALUE_TYPE_INT32:
Packit Service dff8e4
        return G_VARIANT_TYPE_INT32;
Packit Bot c44df3
    case NM_VALUE_TYPE_INT64:
Packit Bot c44df3
        return G_VARIANT_TYPE_INT64;
Packit Bot c44df3
    case NM_VALUE_TYPE_UINT64:
Packit Bot c44df3
        return G_VARIANT_TYPE_UINT64;
Packit Service dff8e4
    case NM_VALUE_TYPE_STRING:
Packit Service dff8e4
        return G_VARIANT_TYPE_STRING;
Packit Service dff8e4
Packit Service dff8e4
    case NM_VALUE_TYPE_INT:
Packit Service dff8e4
        /* "int" also does not have a define variant type, because it's not
Packit Service dff8e4
         * clear how many bits we would need. */
Packit Service dff8e4
Packit Service dff8e4
        /* fall-through */
Packit Service dff8e4
    case NM_VALUE_TYPE_UNSPEC:
Packit Service dff8e4
        break;
Packit Service dff8e4
    }
Packit Service dff8e4
    nm_assert_not_reached();
Packit Service dff8e4
    return NULL;
Packit Service dff8e4
}
Packit Service dff8e4
Packit Service dff8e4
    /*****************************************************************************/
Packit Service dff8e4
Packit Service dff8e4
#endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */
Packit Service dff8e4
Packit Service dff8e4
#endif /* __NM_VALUE_TYPE_H__ */