mirror of
https://github.com/weechat/weechat.git
synced 2026-07-07 02:03:13 +02:00
core: add hashtable to quickly find buffers by id
This commit is contained in:
+20
-12
@@ -76,7 +76,8 @@ int gui_buffers_visited_count = 0; /* number of visited buffers*/
|
||||
int gui_buffers_visited_frozen = 0; /* 1 to forbid list updates */
|
||||
struct t_gui_buffer *gui_buffer_last_displayed = NULL; /* last b. displayed */
|
||||
|
||||
long long gui_buffer_last_id_assigned = -1; /* last id assigned */
|
||||
struct t_hashtable *gui_buffer_by_id = NULL; /* buffers by id */
|
||||
long long gui_buffer_last_id_assigned = -1; /* last id assigned */
|
||||
|
||||
char *gui_buffer_reserved_names[] =
|
||||
{ GUI_BUFFER_MAIN, SECURE_BUFFER_NAME, GUI_COLOR_BUFFER_NAME,
|
||||
@@ -833,6 +834,16 @@ gui_buffer_new_props_with_id (long long id,
|
||||
if (!new_buffer)
|
||||
return NULL;
|
||||
|
||||
if (!gui_buffer_by_id)
|
||||
{
|
||||
gui_buffer_by_id = hashtable_new (
|
||||
64,
|
||||
WEECHAT_HASHTABLE_LONGLONG,
|
||||
WEECHAT_HASHTABLE_POINTER,
|
||||
NULL, NULL);
|
||||
}
|
||||
hashtable_set (gui_buffer_by_id, &id, new_buffer);
|
||||
|
||||
/* init buffer */
|
||||
new_buffer->id = id;
|
||||
if (new_buffer->id > gui_buffer_last_id_assigned)
|
||||
@@ -2979,17 +2990,8 @@ gui_buffer_search_main ()
|
||||
struct t_gui_buffer *
|
||||
gui_buffer_search_by_id (long long id)
|
||||
{
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
{
|
||||
if (ptr_buffer->id == id)
|
||||
return ptr_buffer;
|
||||
}
|
||||
|
||||
/* buffer not found */
|
||||
return NULL;
|
||||
return (gui_buffer_by_id) ?
|
||||
hashtable_get (gui_buffer_by_id, &id) : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3849,6 +3851,12 @@ gui_buffer_close (struct t_gui_buffer *buffer)
|
||||
gui_buffers = buffer->next_buffer;
|
||||
if (last_gui_buffer == buffer)
|
||||
last_gui_buffer = buffer->prev_buffer;
|
||||
hashtable_remove (gui_buffer_by_id, &buffer->id);
|
||||
if (gui_buffer_by_id->items_count == 0)
|
||||
{
|
||||
free (gui_buffer_by_id);
|
||||
gui_buffer_by_id = NULL;
|
||||
}
|
||||
|
||||
for (ptr_window = gui_windows; ptr_window;
|
||||
ptr_window = ptr_window->next_window)
|
||||
|
||||
@@ -1403,6 +1403,7 @@ TEST(GuiBuffer, SearchMain)
|
||||
TEST(GuiBuffer, SearchById)
|
||||
{
|
||||
struct t_gui_buffer *buffer;
|
||||
long long id;
|
||||
|
||||
buffer = gui_buffer_new (NULL, TEST_BUFFER_NAME,
|
||||
NULL, NULL, NULL,
|
||||
@@ -1415,7 +1416,9 @@ TEST(GuiBuffer, SearchById)
|
||||
POINTERS_EQUAL(gui_buffers, gui_buffer_search_by_id (gui_buffers->id));
|
||||
POINTERS_EQUAL(buffer, gui_buffer_search_by_id (buffer->id));
|
||||
|
||||
id = buffer->id;
|
||||
gui_buffer_close (buffer);
|
||||
POINTERS_EQUAL(NULL, gui_buffer_search_by_id (id));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user