From 62fdbc74ad3e8ef3a15951f3f84698a2b541c24c Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 29 Apr 2016 17:30:32 +0100 Subject: [PATCH] add missing pipeable algorithms and suffix funcs that use comparators --- ostd/algorithm.hh | 58 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/ostd/algorithm.hh b/ostd/algorithm.hh index 9b518ad..2e53c8f 100644 --- a/ostd/algorithm.hh +++ b/ostd/algorithm.hh @@ -144,7 +144,7 @@ inline const T &min(const T &a, const T &b) { return (a < b) ? a : b; } template -inline const T &min(const T &a, const T &b, C compare) { +inline const T &min_cmp(const T &a, const T &b, C compare) { return compare(a, b) ? a : b; } @@ -153,7 +153,7 @@ inline const T &max(const T &a, const T &b) { return (a < b) ? b : a; } template -inline const T &max(const T &a, const T &b, C compare) { +inline const T &max_cmp(const T &a, const T &b, C compare) { return compare(a, b) ? b : a; } @@ -166,13 +166,19 @@ inline R min_element(R range) { return r; } template -inline R min_element(R range, C compare) { +inline R min_element_cmp(R range, C compare) { R r = range; for (; !range.empty(); range.pop_front()) - if (ostd::min(r.front(), range.front(), compare) == range.front()) + if (ostd::min_cmp(r.front(), range.front(), compare) == range.front()) r = range; return r; } +inline auto min_element() { + return [](auto &obj) { return min_element(obj); }; +} +template inline auto min_element_cmp(C compare) { + return [&compare](auto &obj) { return min_element_cmp(obj, move(compare)); }; +} template inline R max_element(R range) { @@ -183,21 +189,27 @@ inline R max_element(R range) { return r; } template -inline R max_element(R range, C compare) { +inline R max_element_cmp(R range, C compare) { R r = range; for (; !range.empty(); range.pop_front()) - if (ostd::max(r.front(), range.front(), compare) == range.front()) + if (ostd::max_cmp(r.front(), range.front(), compare) == range.front()) r = range; return r; } +inline auto max_element() { + return [](auto &obj) { return max_element(obj); }; +} +template inline auto max_element_cmp(C compare) { + return [&compare](auto &obj) { return max_element_cmp(obj, move(compare)); }; +} template inline T min(std::initializer_list il) { return ostd::min_element(ostd::iter(il)).front(); } template -inline T min(std::initializer_list il, C compare) { - return ostd::min_element(ostd::iter(il), compare).front(); +inline T min_cmp(std::initializer_list il, C compare) { + return ostd::min_element_cmp(ostd::iter(il), compare).front(); } template @@ -206,8 +218,8 @@ inline T max(std::initializer_list il) { } template -inline T max(std::initializer_list il, C compare) { - return ostd::max_element(ostd::iter(il), compare).front(); +inline T max_cmp(std::initializer_list il, C compare) { + return ostd::max_element_cmp(ostd::iter(il), compare).front(); } /* clamp */ @@ -219,7 +231,7 @@ inline T clamp(const T &v, const U &lo, const U &hi) { template inline T clamp(const T &v, const U &lo, const U &hi, C compare) { - return ostd::max(T(lo), ostd::min(v, T(hi), compare), compare); + return ostd::max_cmp(T(lo), ostd::min_cmp(v, T(hi), compare), compare); } /* lexicographical compare */ @@ -234,9 +246,12 @@ inline bool lexicographical_compare(R1 range1, R2 range2) { } return (range1.empty() && !range2.empty()); } +template inline auto lexicographical_compare(R range) { + return [&range](auto &obj) { return lexicographical_compare(obj, move(range)); }; +} template -inline bool lexicographical_compare(R1 range1, R2 range2, C compare) { +inline bool lexicographical_compare_cmp(R1 range1, R2 range2, C compare) { while (!range1.empty() && !range2.empty()) { if (compare(range1.front(), range2.front())) return true; if (compare(range2.front(), range1.front())) return false; @@ -245,6 +260,12 @@ inline bool lexicographical_compare(R1 range1, R2 range2, C compare) { } return (range1.empty() && !range2.empty()); } +template +inline auto lexicographical_compare_cmp(R range, C compare) { + return [&range, &compare](auto &obj) { + return lexicographical_compare_cmp(obj, move(range), move(compare)); + }; +} /* algos that don't change the range */ @@ -351,13 +372,19 @@ template inline auto find_if_not(F func) { } template -inline R1 find_one_of(R1 range, R2 values, C compare) { +inline R1 find_one_of_cmp(R1 range, R2 values, C compare) { for (; !range.empty(); range.pop_front()) for (R2 rv = values; !rv.empty(); rv.pop_front()) if (compare(range.front(), rv.front())) return range; return range; } +template +inline auto find_one_of_cmp(R values, C compare) { + return [&values, &compare](auto &obj) { + return find_one_of_cmp(obj, move(values), move(compare)); + }; +} template inline R1 find_one_of(R1 range, R2 values) { @@ -367,6 +394,11 @@ inline R1 find_one_of(R1 range, R2 values) { return range; return range; } +template inline auto find_one_of(R values) { + return [&values](auto &obj) { + return find_one_of(obj, move(values)); + }; +} template inline RangeSize count(R range, const T &v) {