> + 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