mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-03-17 13:40:33 +01:00
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:
parent
9c47e2ce30
commit
f77f74f273
2 changed files with 47 additions and 12 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue