mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-06 13:10:29 +01:00
glib-aux: merge branch 'th/fix-hash-combine-bool'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/903
This commit is contained in:
commit
3aad301003
4 changed files with 37 additions and 16 deletions
|
|
@ -508,6 +508,8 @@ test_nm_hash(void)
|
|||
g_assert(((typeof(x)) -1) > 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
NM_STATIC_ASSERT_EXPR_VOID(NM_HASH_COMBINE_BOOLS(int, 1, 0, 1) == 5);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -122,18 +122,12 @@ nm_hash_update_bool(NMHashState *state, bool val)
|
|||
nm_hash_update(state, &val, sizeof(val));
|
||||
}
|
||||
|
||||
#define _NM_HASH_COMBINE_BOOLS_OP(x, n) \
|
||||
((x) ? ((_nm_hash_combine_bools_type) NM_BIT((n))) : ((_nm_hash_combine_bools_type) 0))
|
||||
#define _NM_HASH_COMBINE_BOOLS_OP(x, n) ((x) ? NM_BIT((n)) : 0u)
|
||||
|
||||
#define NM_HASH_COMBINE_BOOLS(type, ...) \
|
||||
({ \
|
||||
typedef type _nm_hash_combine_bools_type; \
|
||||
\
|
||||
G_STATIC_ASSERT(NM_NARG(__VA_ARGS__) <= 8 * sizeof(_nm_hash_combine_bools_type)); \
|
||||
\
|
||||
(_nm_hash_combine_bools_type)( \
|
||||
NM_VA_ARGS_FOREACH(, , |, _NM_HASH_COMBINE_BOOLS_OP, __VA_ARGS__)); \
|
||||
})
|
||||
#define NM_HASH_COMBINE_BOOLS(type, ...) \
|
||||
((type) (NM_STATIC_ASSERT_EXPR_1(NM_NARG(__VA_ARGS__) <= 8 * sizeof(type)) \
|
||||
? (NM_VA_ARGS_FOREACH(, , |, _NM_HASH_COMBINE_BOOLS_OP, __VA_ARGS__)) \
|
||||
: 0))
|
||||
|
||||
#define nm_hash_update_bools(state, ...) \
|
||||
nm_hash_update_val(state, NM_HASH_COMBINE_BOOLS(guint8, __VA_ARGS__))
|
||||
|
|
|
|||
|
|
@ -30,6 +30,31 @@ G_STATIC_ASSERT(4 == _nm_alignof(NMIPAddr));
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
test_nm_static_assert(void)
|
||||
{
|
||||
int v1[NM_STATIC_ASSERT_EXPR_1(1)];
|
||||
typeof(NM_STATIC_ASSERT_EXPR_1(1)) v_int;
|
||||
int * p_int;
|
||||
|
||||
G_STATIC_ASSERT(sizeof(v1) == sizeof(int));
|
||||
G_STATIC_ASSERT(NM_STATIC_ASSERT_EXPR_1(1) == 1);
|
||||
G_STATIC_ASSERT(NM_STATIC_ASSERT_EXPR_1(NM_STATIC_ASSERT_EXPR_1(1)) == 1);
|
||||
G_STATIC_ASSERT(NM_STATIC_ASSERT_EXPR_1(NM_STATIC_ASSERT_EXPR_1(NM_STATIC_ASSERT_EXPR_1(1)))
|
||||
== 1);
|
||||
|
||||
g_assert(NM_STATIC_ASSERT_EXPR_1(2) == 1);
|
||||
|
||||
p_int = &v_int;
|
||||
g_assert(&v_int == p_int);
|
||||
|
||||
(void) NM_STATIC_ASSERT_EXPR_1(2 > 1);
|
||||
|
||||
NM_STATIC_ASSERT_EXPR_VOID(2 > 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
test_gpid(void)
|
||||
{
|
||||
|
|
@ -1352,6 +1377,7 @@ main(int argc, char **argv)
|
|||
{
|
||||
nmtst_init(&argc, &argv, TRUE);
|
||||
|
||||
g_test_add_func("/general/test_nm_static_assert", test_nm_static_assert);
|
||||
g_test_add_func("/general/test_gpid", test_gpid);
|
||||
g_test_add_func("/general/test_monotonic_timestamp", test_monotonic_timestamp);
|
||||
g_test_add_func("/general/test_nmhash", test_nmhash);
|
||||
|
|
|
|||
|
|
@ -182,11 +182,10 @@ typedef uint64_t _nm_bitwise nm_be64_t;
|
|||
})
|
||||
|
||||
#define NM_STATIC_ASSERT(cond) static_assert(cond, "")
|
||||
#define NM_STATIC_ASSERT_EXPR(cond) \
|
||||
({ \
|
||||
NM_STATIC_ASSERT(cond); \
|
||||
1; \
|
||||
})
|
||||
#define NM_STATIC_ASSERT_EXPR_1(cond) \
|
||||
(sizeof(struct { char __static_assert_expr_1[(cond) ? 1 : -1]; }) == 1)
|
||||
#define NM_STATIC_ASSERT_EXPR_VOID(cond) \
|
||||
((void) (sizeof(struct { char __static_assert_expr_void[(cond) ? 1 : -1]; }) == 1))
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue