summaryrefslogtreecommitdiff
path: root/src/NetworkManagerUtils.h
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-01-24 13:33:48 +0100
committerThomas Haller <thaller@redhat.com>2016-01-24 14:21:14 +0100
commitb9df6009ffbe2dea39b91972c52e426899f94c44 (patch)
treedf1e0296d1b0f57dbd85394ded8a6f555b58431d /src/NetworkManagerUtils.h
parent3ed2488d74bb18adb066487acaf2931d3bf703ee (diff)
downloadNetworkManager-b9df6009ffbe2dea39b91972c52e426899f94c44.tar.gz
utils: implement NM_UTILS_STRING_LOOKUP_TABLE_DEFINE() as switch() statement
The compiler will likely optimize a switch() statement also to a table lookup, but it also works for negative values and values with large gaps.
Diffstat (limited to 'src/NetworkManagerUtils.h')
-rw-r--r--src/NetworkManagerUtils.h13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index d6676481ee..09bbf42083 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -260,19 +260,20 @@ const char *nm_utils_enum2str (const NMUtilsEnum2StrDesc *descs,
/*****************************************************************************/
-#define NM_UTILS_STRING_LOOKUP_TABLE_ITEM(v, n) [v] = n
+#define NM_UTILS_STRING_LOOKUP_TABLE_ITEM(v, n) (void) 0; case v: return (n); (void) 0
#define NM_UTILS_STRING_LOOKUP_TABLE_ITEM_S(v, n) NM_UTILS_STRING_LOOKUP_TABLE_ITEM(v, ""n"")
#define _NM_UTILS_STRING_LOOKUP_TABLE_DEFINE(scope, fcn_name, lookup_type, unknown_val, ...) \
scope const char * \
-fcn_name (lookup_type idx) \
+fcn_name (lookup_type val) \
{ \
- static const char *const descs[] = { \
+ switch (val) { \
+ default: \
+ return (unknown_val); \
+ (void) 0, \
__VA_ARGS__ \
+ (void) 0; \
}; \
- if ((gsize) idx < G_N_ELEMENTS (descs)) \
- return descs[idx]; \
- return unknown_val; \
}
#define NM_UTILS_STRING_LOOKUP_TABLE_DEFINE(fcn_name, lookup_type, unknown_val, ...) \