Skip to content

Commit d196894

Browse files
committed
GLUI: LinuxFileDialog: avoid repeated sort key computations (performance)
Signed-off-by: Stefan Westerfeld <stefan@space.twc.de>
1 parent ab1e4d2 commit d196894

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

glui/smlinuxfiledialog.cc

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class FileDialogWindow : public Window
5353
struct Item
5454
{
5555
string filename;
56+
string sort_key;
5657
bool is_dir;
5758
};
5859
vector<Item> items;
@@ -351,27 +352,24 @@ class FileDialogWindow : public Window
351352
items.push_back (parent_item);
352353
}
353354

355+
for (auto& item : items)
356+
{
357+
char *utf8_valid_name = g_utf8_make_valid (item.filename.c_str(), -1);
358+
char *name_nocase = g_utf8_casefold (utf8_valid_name, -1);
359+
char *sort_key = g_utf8_collate_key_for_filename (name_nocase, -1);
360+
item.sort_key = sort_key;
361+
g_free (sort_key);
362+
g_free (name_nocase);
363+
g_free (utf8_valid_name);
364+
}
365+
354366
std::sort (items.begin(), items.end(), [](Item& i1, Item& i2) {
355367
int d1 = i1.is_dir;
356368
int d2 = i2.is_dir;
357369
if (d1 != d2)
358370
return d1 > d2; // directories first
359371

360-
auto sort_key = [] (const string& filename)
361-
{
362-
char *utf8_valid_name = g_utf8_make_valid (filename.c_str(), -1);
363-
char *name_nocase = g_utf8_casefold (utf8_valid_name, -1);
364-
char *key = g_utf8_collate_key_for_filename (name_nocase, -1);
365-
string ks = key;
366-
g_free (key);
367-
g_free (name_nocase);
368-
g_free (utf8_valid_name);
369-
370-
return ks;
371-
};
372-
string ks1 = sort_key (i1.filename);
373-
string ks2 = sort_key (i2.filename);
374-
return ks1 < ks2;
372+
return i1.sort_key < i2.sort_key;
375373
});
376374
for (auto item : items)
377375
{

0 commit comments

Comments
 (0)