If both strings are numbers, compare them as such
This commit is contained in:
@@ -98,7 +98,7 @@ bool MoveToAlbum(NC::Menu<AlbumEntry> &albums, const std::string &primary_tag, c
|
|||||||
struct SortSongs {
|
struct SortSongs {
|
||||||
typedef NC::Menu<MPD::Song>::Item SongItem;
|
typedef NC::Menu<MPD::Song>::Item SongItem;
|
||||||
|
|
||||||
static const std::array<MPD::Song::GetFunction, 3> GetFuns;
|
static const std::array<MPD::Song::GetFunction, 4> GetFuns;
|
||||||
|
|
||||||
LocaleStringComparison m_cmp;
|
LocaleStringComparison m_cmp;
|
||||||
|
|
||||||
@@ -117,26 +117,16 @@ public:
|
|||||||
return ret < 0;
|
return ret < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort by track numbers.
|
|
||||||
try {
|
|
||||||
ret = boost::lexical_cast<int>(a.getTags(&MPD::Song::getTrackNumber))
|
|
||||||
- boost::lexical_cast<int>(b.getTags(&MPD::Song::getTrackNumber));
|
|
||||||
} catch (boost::bad_lexical_cast &) {
|
|
||||||
ret = a.getTrackNumber().compare(b.getTrackNumber());
|
|
||||||
}
|
|
||||||
if (ret != 0)
|
|
||||||
return ret < 0;
|
|
||||||
|
|
||||||
// If track numbers are equal, sort by the display format.
|
|
||||||
return Format::stringify<char>(Config.song_library_format, &a)
|
return Format::stringify<char>(Config.song_library_format, &a)
|
||||||
< Format::stringify<char>(Config.song_library_format, &b);
|
< Format::stringify<char>(Config.song_library_format, &b);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::array<MPD::Song::GetFunction, 3> SortSongs::GetFuns = {{
|
const std::array<MPD::Song::GetFunction, 4> SortSongs::GetFuns = {{
|
||||||
&MPD::Song::getDate,
|
&MPD::Song::getDate,
|
||||||
&MPD::Song::getAlbum,
|
&MPD::Song::getAlbum,
|
||||||
&MPD::Song::getDisc
|
&MPD::Song::getDisc,
|
||||||
|
&MPD::Song::getTrackNumber,
|
||||||
}};
|
}};
|
||||||
|
|
||||||
class SortAlbumEntries {
|
class SortAlbumEntries {
|
||||||
|
|||||||
@@ -34,10 +34,22 @@ bool hasTheWord(const std::string &s)
|
|||||||
&& (s[3] == ' ');
|
&& (s[3] == ' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long long strToLL(const char *s, size_t len)
|
||||||
|
{
|
||||||
|
long long n = 0;
|
||||||
|
while (len--)
|
||||||
|
n = 10*n + *s++ - '0';
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int LocaleStringComparison::compare(const char *a, size_t a_len, const char *b, size_t b_len) const
|
int LocaleStringComparison::compare(const char *a, size_t a_len, const char *b, size_t b_len) const
|
||||||
{
|
{
|
||||||
|
// If both strings are numbers, compare them as such.
|
||||||
|
if (std::all_of(a, a + a_len, isdigit) && std::all_of(b, b + b_len, isdigit))
|
||||||
|
return strToLL(a, a_len) - strToLL(b, b_len);
|
||||||
|
|
||||||
size_t ac_off = 0, bc_off = 0;
|
size_t ac_off = 0, bc_off = 0;
|
||||||
if (m_ignore_the)
|
if (m_ignore_the)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user