make sure to include boost posix_time where needed
[ncmpcpp.git] / src / utility / comparators.cpp
blob9dd90fa321efebab22949bd6162436827be2e74f
1 /***************************************************************************
2 * Copyright (C) 2008-2014 by Andrzej Rybczak *
3 * electricityispower@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include <locale>
22 #include "comparators.h"
23 #include "utility/string.h"
25 namespace {//
27 bool hasTheWord(const std::string &s)
29 return s.length() >= 4
30 && (s[0] == 't' || s[0] == 'T')
31 && (s[1] == 'h' || s[1] == 'H')
32 && (s[2] == 'e' || s[2] == 'E')
33 && (s[3] == ' ');
38 int LocaleStringComparison::operator()(const std::string &a, const std::string &b) const
40 const char *ac = a.c_str();
41 const char *bc = b.c_str();
42 size_t ac_off = 0, bc_off = 0;
43 if (m_ignore_the)
45 if (hasTheWord(a))
46 ac_off += 4;
47 if (hasTheWord(b))
48 bc_off += 4;
50 return std::use_facet<std::collate<char>>(m_locale).compare(
51 ac+ac_off, ac+a.length(), bc+bc_off, bc+b.length()
55 bool LocaleBasedItemSorting::operator()(const MPD::Item &a, const MPD::Item &b) const
57 bool result = false;
58 if (a.type == b.type)
60 switch (a.type)
62 case MPD::itDirectory:
63 result = m_cmp(getBasename(a.name), getBasename(b.name));
64 break;
65 case MPD::itPlaylist:
66 result = m_cmp(a.name, b.name);
67 break;
68 case MPD::itSong:
69 switch (m_sort_mode)
71 case SortMode::Name:
72 result = m_cmp(*a.song, *b.song);
73 break;
74 case SortMode::ModificationTime:
75 result = a.song->getMTime() > b.song->getMTime();
76 break;
77 case SortMode::CustomFormat:
78 result = m_cmp(a.song->toString(Config.browser_sort_format, Config.tags_separator),
79 b.song->toString(Config.browser_sort_format, Config.tags_separator));
80 break;
81 case SortMode::NoOp:
82 throw std::logic_error("can't sort with NoOp sorting mode");
84 break;
87 else
88 result = a.type < b.type;
89 return result;