summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-02-19 12:16:01 +0100
committerThomas Haller <thaller@redhat.com>2020-02-19 15:35:07 +0100
commitf4d12f7b59b682dbc73af2602f3bb7f5e91417ce (patch)
treef204df2d814a9627a2f2b0b184cdd6ada0c55c98
parent14461e7217cc51dc4dd4c0f9ea97b93ccc5d1e5f (diff)
downloadNetworkManager-f4d12f7b59b682dbc73af2602f3bb7f5e91417ce.tar.gz
shared: add NM_UTILS_STRING_TABLE_LOOKUP_STRUCT_DEFINE() macro for lookup of structs
-rw-r--r--shared/nm-glib-aux/nm-shared-utils.h59
1 files changed, 41 insertions, 18 deletions
diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h
index 34c7db45d7..a58be69608 100644
--- a/shared/nm-glib-aux/nm-shared-utils.h
+++ b/shared/nm-glib-aux/nm-shared-utils.h
@@ -1536,35 +1536,32 @@ guint8 *nm_utils_hexstr2bin_alloc (const char *hexstr,
/*****************************************************************************/
-#define NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(fcn_name, \
- result_type, \
- entry_cmd, \
- unknown_val_cmd, \
- ...) \
-result_type \
+#define _NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(fcn_name, \
+ value_type, \
+ value_type_result, \
+ entry_cmd, \
+ unknown_val_cmd, \
+ get_operator, \
+ ...) \
+value_type_result \
fcn_name (const char *name) \
{ \
static const struct { \
const char *name; \
- result_type value; \
+ value_type value; \
} LIST[] = { \
__VA_ARGS__ \
}; \
\
{ entry_cmd; } \
\
- if (NM_MORE_ASSERTS > 5) { \
- static gboolean checked = FALSE; \
+ if (NM_MORE_ASSERT_ONCE (5)) { \
int i; \
\
- if (!checked) { \
- checked = TRUE; \
- \
- for (i = 0; i < G_N_ELEMENTS (LIST); i++) { \
- nm_assert (LIST[i].name); \
- if (i > 0) \
- nm_assert (strcmp (LIST[i - 1].name, LIST[i].name) < 0); \
- } \
+ for (i = 0; i < G_N_ELEMENTS (LIST); i++) { \
+ nm_assert (LIST[i].name); \
+ if (i > 0) \
+ nm_assert (strcmp (LIST[i - 1].name, LIST[i].name) < 0); \
} \
} \
\
@@ -1579,7 +1576,7 @@ fcn_name (const char *name) \
const int cmp = strcmp (LIST[imid].name, name); \
\
if (G_UNLIKELY (cmp == 0)) \
- return LIST[imid].value; \
+ return get_operator (LIST[imid].value); \
\
if (cmp < 0) \
imin = imid + 1u; \
@@ -1597,6 +1594,32 @@ fcn_name (const char *name) \
{ unknown_val_cmd; } \
}
+#define NM_UTILS_STRING_TABLE_LOOKUP_STRUCT_DEFINE(fcn_name, \
+ result_type, \
+ entry_cmd, \
+ unknown_val_cmd, \
+ ...) \
+ _NM_UTILS_STRING_TABLE_LOOKUP_DEFINE (fcn_name, \
+ result_type, \
+ const result_type *, \
+ entry_cmd, \
+ unknown_val_cmd, \
+ &, \
+ __VA_ARGS__)
+
+#define NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(fcn_name, \
+ result_type, \
+ entry_cmd, \
+ unknown_val_cmd, \
+ ...) \
+ _NM_UTILS_STRING_TABLE_LOOKUP_DEFINE (fcn_name, \
+ result_type, \
+ result_type, \
+ entry_cmd, \
+ unknown_val_cmd, \
+ , \
+ __VA_ARGS__)
+
/*****************************************************************************/
static inline GTask *