mirror of
https://github.com/jezhiggins/arabica
synced 2025-02-06 20:46:18 +01:00
refactored numeric sort
This commit is contained in:
parent
4d2ecb80c0
commit
95c8185828
1 changed files with 21 additions and 21 deletions
|
@ -74,23 +74,25 @@ private:
|
||||||
typedef bool(Sort::*sortFn)(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const;
|
typedef bool(Sort::*sortFn)(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const;
|
||||||
bool numberAscending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
bool numberAscending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
||||||
{
|
{
|
||||||
double v1 = grabAsNumber(n1);
|
return numberSort(n1, n2, nanAscending, std::less<double>());
|
||||||
double v2 = grabAsNumber(n2);
|
|
||||||
|
|
||||||
bool nan1 = Arabica::XPath::isNaN(v1);
|
|
||||||
bool nan2 = Arabica::XPath::isNaN(v2);
|
|
||||||
|
|
||||||
if(((nan1 && nan2) || (v1 == v2)) && (sub_sort_))
|
|
||||||
return (*sub_sort_)(n1, n2);
|
|
||||||
|
|
||||||
if(nan2)
|
|
||||||
return false;
|
|
||||||
if(nan1)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return v1 < v2;
|
|
||||||
} // numberAscending
|
} // numberAscending
|
||||||
bool numberDescending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
bool numberDescending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
||||||
|
{
|
||||||
|
return numberSort(n1, n2, nanDescending, std::greater<double>());
|
||||||
|
} // numberDescending
|
||||||
|
static bool nanAscending(bool nan1, bool nan2)
|
||||||
|
{
|
||||||
|
return !nan2;
|
||||||
|
} // nanAscending
|
||||||
|
static bool nanDescending(bool nan1, bool nan2)
|
||||||
|
{
|
||||||
|
return !nan1;
|
||||||
|
} // nanDescending
|
||||||
|
template<class NanCompare, class NumberCompare>
|
||||||
|
bool numberSort(const DOM::Node<std::string>& n1,
|
||||||
|
const DOM::Node<std::string>& n2,
|
||||||
|
NanCompare nanCompare,
|
||||||
|
NumberCompare compare) const
|
||||||
{
|
{
|
||||||
double v1 = grabAsNumber(n1);
|
double v1 = grabAsNumber(n1);
|
||||||
double v2 = grabAsNumber(n2);
|
double v2 = grabAsNumber(n2);
|
||||||
|
@ -101,13 +103,11 @@ private:
|
||||||
if(((nan1 && nan2) || (v1 == v2)) && (sub_sort_))
|
if(((nan1 && nan2) || (v1 == v2)) && (sub_sort_))
|
||||||
return (*sub_sort_)(n1, n2);
|
return (*sub_sort_)(n1, n2);
|
||||||
|
|
||||||
if(nan1)
|
if(nan1 || nan2)
|
||||||
return false;
|
return nanCompare(nan1, nan2);
|
||||||
if(nan2)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return v1 > v2;
|
return compare(v1, v2);
|
||||||
} // numberDescending
|
} // numberSort
|
||||||
bool stringAscending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
bool stringAscending(const DOM::Node<std::string>& n1, const DOM::Node<std::string>& n2) const
|
||||||
{
|
{
|
||||||
std::string v1 = grabAsString(n1);
|
std::string v1 = grabAsString(n1);
|
||||||
|
|
Loading…
Add table
Reference in a new issue