1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-29 04:45:57 -04:00

speed up nicklist by using hash

This commit is contained in:
Ailin Nemui 2014-06-08 02:17:50 +02:00
parent a4c62a3fee
commit a8c52d8c16

View File

@ -281,40 +281,26 @@ GSList *nicklist_getnicks(CHANNEL_REC *channel)
return list; return list;
} }
typedef struct {
CHANNEL_REC *channel;
const char *nick;
GSList *list;
} NICKLIST_GET_SAME_REC;
static void get_nicks_same_hash(gpointer key, NICK_REC *nick,
NICKLIST_GET_SAME_REC *rec)
{
while (nick != NULL) {
if (g_ascii_strcasecmp(nick->nick, rec->nick) == 0) {
rec->list = g_slist_append(rec->list, rec->channel);
rec->list = g_slist_append(rec->list, nick);
}
nick = nick->next;
}
}
GSList *nicklist_get_same(SERVER_REC *server, const char *nick) GSList *nicklist_get_same(SERVER_REC *server, const char *nick)
{ {
NICKLIST_GET_SAME_REC rec;
GSList *tmp; GSList *tmp;
GSList *list = NULL;
g_return_val_if_fail(IS_SERVER(server), NULL); g_return_val_if_fail(IS_SERVER(server), NULL);
rec.nick = nick;
rec.list = NULL;
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
rec.channel = tmp->data; NICK_REC *nick_rec;
g_hash_table_foreach(rec.channel->nicks, CHANNEL_REC *channel = tmp->data;
(GHFunc) get_nicks_same_hash, &rec);
for (nick_rec = g_hash_table_lookup(channel->nicks, nick);
nick_rec != NULL;
nick_rec = nick_rec->next) {
list = g_slist_append(list, channel);
list = g_slist_append(list, nick_rec);
}
} }
return rec.list;
return list;
} }
typedef struct { typedef struct {