Loading...
Searching...
No Matches
NaturalSort.hpp
1#pragma once
2#include <QString>
3#include <QStringList>
4
5#include <algorithm>
6
7namespace score
8{
14inline bool naturalLess(const QString& a, const QString& b) noexcept
15{
16 const auto digit = [](QChar c) noexcept { return c >= u'0' && c <= u'9'; };
17 qsizetype i = 0, j = 0;
18 while(i < a.size() && j < b.size())
19 {
20 if(digit(a[i]) && digit(b[j]))
21 {
22 qsizetype i2 = i, j2 = j;
23 while(i2 < a.size() && a[i2] == '0')
24 i2++;
25 while(j2 < b.size() && b[j2] == '0')
26 j2++;
27 qsizetype ie = i2, je = j2;
28 while(ie < a.size() && digit(a[ie]))
29 ie++;
30 while(je < b.size() && digit(b[je]))
31 je++;
32 // More significant digits: larger
33 if(ie - i2 != je - j2)
34 return ie - i2 < je - j2;
35 for(qsizetype k = 0; k < ie - i2; k++)
36 if(a[i2 + k] != b[j2 + k])
37 return a[i2 + k] < b[j2 + k];
38 i = ie;
39 j = je;
40 continue;
41 }
42 const auto ca = a[i].toCaseFolded(), cb = b[j].toCaseFolded();
43 if(ca != cb)
44 return ca < cb;
45 i++;
46 j++;
47 }
48 if((a.size() - i) != (b.size() - j))
49 return (a.size() - i) < (b.size() - j);
50 // Equal but for case or leading zeros: still a strict order
51 return a < b;
52}
53
54inline void sortNaturally(QStringList& list)
55{
56 std::sort(list.begin(), list.end(), naturalLess);
57}
58}
Base toolkit upon which the software is built.
Definition Application.cpp:83
bool naturalLess(const QString &a, const QString &b) noexcept
Definition NaturalSort.hpp:14