shared: use binary search in nm_meta_setting_infos_by_name()

nm_meta_setting_infos_by_name() did a naive search by name by
iterating over all 42 setting types.

Reorder nm_meta_setting_infos array, and use binary search instead.
This commit is contained in:
Thomas Haller 2018-07-28 12:56:57 +02:00
parent 9c47e2ce30
commit f77f74f273
2 changed files with 47 additions and 12 deletions

View file

@ -408,15 +408,44 @@ const NMMetaSettingInfo nm_meta_setting_infos[] = {
const NMMetaSettingInfo *
nm_meta_setting_infos_by_name (const char *name)
{
int i;
gssize idx;
#if NM_MORE_ASSERTS > 10
{
guint i, j;
if (name) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_streq (nm_meta_setting_infos[i].setting_name, name))
return &nm_meta_setting_infos[i];
const NMMetaSettingInfo *setting_info = &nm_meta_setting_infos[i];
nm_assert (setting_info->meta_type == (NMMetaSettingType) i);
nm_assert (setting_info->setting_name);
nm_assert (setting_info->setting_name[0]);
nm_assert (setting_info->get_setting_gtype);
nm_assert (setting_info->setting_priority != NM_SETTING_PRIORITY_INVALID);
if ( i > 0
&& strcmp (nm_meta_setting_infos[i - 1].setting_name, setting_info->setting_name) >= 0) {
g_error ("nm_meta_setting_infos[%u, \"%s\"] is wrongly sorted before nm_meta_setting_infos[%u, \"%s\"]. Rearange NMMetaSettingType enum",
i - 1, nm_meta_setting_infos[i - 1].setting_name,
i, setting_info->setting_name);
}
for (j = 0; j < i; j++) {
const NMMetaSettingInfo *s = &nm_meta_setting_infos[j];
nm_assert (setting_info->get_setting_gtype != s->get_setting_gtype);
}
}
}
return NULL;
#endif
G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (NMMetaSettingInfo, setting_name) == 0);
idx = nm_utils_array_find_binary_search (nm_meta_setting_infos,
sizeof (NMMetaSettingInfo),
_NM_META_SETTING_TYPE_NUM,
&name,
nm_strcmp_p_with_data,
NULL);
return idx >= 0 ? &nm_meta_setting_infos[idx] : NULL;
}
const NMMetaSettingInfo *

View file

@ -97,8 +97,18 @@ extern const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[_NM_SETTI
/*****************************************************************************/
typedef enum {
/* the enum (and their numeric values) are internal API. Do not assign
* any meaning the numeric values, because they already have one:
*
* they are sorted in a way, that corresponds to the asciibetical sort
* order of the corresponding setting-name. */
NM_META_SETTING_TYPE_6LOWPAN,
NM_META_SETTING_TYPE_OLPC_MESH,
NM_META_SETTING_TYPE_WIRELESS,
NM_META_SETTING_TYPE_WIRELESS_SECURITY,
NM_META_SETTING_TYPE_802_1X,
NM_META_SETTING_TYPE_WIRED,
NM_META_SETTING_TYPE_ADSL,
NM_META_SETTING_TYPE_BLUETOOTH,
NM_META_SETTING_TYPE_BOND,
@ -111,12 +121,11 @@ typedef enum {
NM_META_SETTING_TYPE_GENERIC,
NM_META_SETTING_TYPE_GSM,
NM_META_SETTING_TYPE_INFINIBAND,
NM_META_SETTING_TYPE_IP_TUNNEL,
NM_META_SETTING_TYPE_IP4_CONFIG,
NM_META_SETTING_TYPE_IP6_CONFIG,
NM_META_SETTING_TYPE_IP_TUNNEL,
NM_META_SETTING_TYPE_MACSEC,
NM_META_SETTING_TYPE_MACVLAN,
NM_META_SETTING_TYPE_OLPC_MESH,
NM_META_SETTING_TYPE_OVS_BRIDGE,
NM_META_SETTING_TYPE_OVS_INTERFACE,
NM_META_SETTING_TYPE_OVS_PATCH,
@ -135,9 +144,6 @@ typedef enum {
NM_META_SETTING_TYPE_VPN,
NM_META_SETTING_TYPE_VXLAN,
NM_META_SETTING_TYPE_WIMAX,
NM_META_SETTING_TYPE_WIRED,
NM_META_SETTING_TYPE_WIRELESS,
NM_META_SETTING_TYPE_WIRELESS_SECURITY,
NM_META_SETTING_TYPE_WPAN,
NM_META_SETTING_TYPE_UNKNOWN,
@ -163,10 +169,10 @@ typedef enum {
#define _NMMetaSettingInfoXX _NMMetaSettingInfoCli
#endif
struct _NMMetaSettingInfoXX {
NMMetaSettingType meta_type;
NMSettingPriority setting_priority;
const char *setting_name;
GType (*get_setting_gtype) (void);
NMMetaSettingType meta_type;
NMSettingPriority setting_priority;
};
typedef struct _NMMetaSettingInfoXX NMMetaSettingInfo;