<p>In <a href="https://github.com/geany/geany/pull/1187#discussion_r75961565">src/tagmanager/tm_query.c</a>:</p>
<pre style='color:#555'>> +    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);
</pre>
<blockquote>
<p>since the insertion point can be found with bisection</p>
</blockquote>

<p>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.</p>

<p>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.</p>

<blockquote>
<p>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.</p>
</blockquote>

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

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/geany/geany/pull/1187/files/386006313a0b78c614bd1ac522ac121e093df58d#r75961565">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/ABDrJ6BKsQ7-PMoTc4jBdrW2pTH6bVpwks5qi3CGgaJpZM4JqVBL">mute the thread</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/ABDrJ1OUuoeACw9_oN9FDpRU8l7JdJ8wks5qi3CGgaJpZM4JqVBL.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
  <link itemprop="url" href="https://github.com/geany/geany/pull/1187/files/386006313a0b78c614bd1ac522ac121e093df58d#r75961565"></link>
  <meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>

<script type="application/json" data-scope="inboxmarkup">{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/geany/geany","title":"geany/geany","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/geany/geany"}},"updates":{"snippets":[{"icon":"PERSON","message":"@b4n in #1187: \u003e since the insertion point can be found with bisection\r\n\r\nIt 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.\r\n\r\nSorting 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.\r\n\r\n\u003e 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.\r\n\r\nYeah 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."}],"action":{"name":"View Pull Request","url":"https://github.com/geany/geany/pull/1187/files/386006313a0b78c614bd1ac522ac121e093df58d#r75961565"}}}</script>