> +     GPtrArray *ret;
> +
> +     sort_options.sort_attrs = NULL;
> +     /* tags_array isn not needed by tm_tag_compare(), but for 
> tm_search_cmp() */
> +     sort_options.tags_array = NULL;
> +     sort_options.first = TRUE;
> +
> +     foreach_ptr_array(s, i, q->names)
> +     {
> +             TMTag **ptag;
> +             sort_options.cmp_len = s->len;
> +             if (q->data_sources & TM_QUERY_SOURCE_GLOBAL_TAGS)
> +             {
> +                     tags = tm_tags_find(q->workspace->global_tags, s->str, 
> s->len, &ntags);
> +                     foreach_c_array(ptag, tags, ntags)
> +                             g_queue_insert_sorted(&res, *ptag, 
> tag_compare_ptr, &sort_options);

> since the insertion point can be found with bisection

It couldn't as lists don't allow random access.  The only way is basically to 
traverse the whole list up to the insertion point.  If you knew the data set 
you could imagine making a guess at whether it's "close to" the end/start and 
start there, but that's as good as it gets AFAIK.

Sorting is a different story, because you can sort several items at once if you 
find interesting properties on them, and can take clever paths in some cases, 
but that doesn't work with a single insertion.

> The array still has the slight disadvantage that it must be resized when 
> adding items exceeding the lenght, but this is not a problem here.

Yeah well, it's not so much worse than allocating the whole array at the end as 
`GPtrArray` is not so stupid and grows in chunks.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany/pull/1187/files/386006313a0b78c614bd1ac522ac121e093df58d#r75961565

Reply via email to