diff options
author | Thomas Haller <thaller@redhat.com> | 2016-01-24 13:33:48 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-01-24 14:21:14 +0100 |
commit | b9df6009ffbe2dea39b91972c52e426899f94c44 (patch) | |
tree | df1e0296d1b0f57dbd85394ded8a6f555b58431d /src/NetworkManagerUtils.h | |
parent | 3ed2488d74bb18adb066487acaf2931d3bf703ee (diff) | |
download | NetworkManager-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.h | 13 |
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, ...) \ |