add missing pipeable algorithms and suffix funcs that use comparators

master
Daniel Kolesa 2016-04-29 17:30:32 +01:00
parent ab22ba910a
commit 62fdbc74ad
1 changed files with 45 additions and 13 deletions

View File

@ -144,7 +144,7 @@ inline const T &min(const T &a, const T &b) {
return (a < b) ? a : b; return (a < b) ? a : b;
} }
template<typename T, typename C> template<typename T, typename C>
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; 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; return (a < b) ? b : a;
} }
template<typename T, typename C> template<typename T, typename C>
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; return compare(a, b) ? b : a;
} }
@ -166,13 +166,19 @@ inline R min_element(R range) {
return r; return r;
} }
template<typename R, typename C> template<typename R, typename C>
inline R min_element(R range, C compare) { inline R min_element_cmp(R range, C compare) {
R r = range; R r = range;
for (; !range.empty(); range.pop_front()) 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; r = range;
return r; return r;
} }
inline auto min_element() {
return [](auto &obj) { return min_element(obj); };
}
template<typename C> inline auto min_element_cmp(C compare) {
return [&compare](auto &obj) { return min_element_cmp(obj, move(compare)); };
}
template<typename R> template<typename R>
inline R max_element(R range) { inline R max_element(R range) {
@ -183,21 +189,27 @@ inline R max_element(R range) {
return r; return r;
} }
template<typename R, typename C> template<typename R, typename C>
inline R max_element(R range, C compare) { inline R max_element_cmp(R range, C compare) {
R r = range; R r = range;
for (; !range.empty(); range.pop_front()) 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; r = range;
return r; return r;
} }
inline auto max_element() {
return [](auto &obj) { return max_element(obj); };
}
template<typename C> inline auto max_element_cmp(C compare) {
return [&compare](auto &obj) { return max_element_cmp(obj, move(compare)); };
}
template<typename T> template<typename T>
inline T min(std::initializer_list<T> il) { inline T min(std::initializer_list<T> il) {
return ostd::min_element(ostd::iter(il)).front(); return ostd::min_element(ostd::iter(il)).front();
} }
template<typename T, typename C> template<typename T, typename C>
inline T min(std::initializer_list<T> il, C compare) { inline T min_cmp(std::initializer_list<T> il, C compare) {
return ostd::min_element(ostd::iter(il), compare).front(); return ostd::min_element_cmp(ostd::iter(il), compare).front();
} }
template<typename T> template<typename T>
@ -206,8 +218,8 @@ inline T max(std::initializer_list<T> il) {
} }
template<typename T, typename C> template<typename T, typename C>
inline T max(std::initializer_list<T> il, C compare) { inline T max_cmp(std::initializer_list<T> il, C compare) {
return ostd::max_element(ostd::iter(il), compare).front(); return ostd::max_element_cmp(ostd::iter(il), compare).front();
} }
/* clamp */ /* clamp */
@ -219,7 +231,7 @@ inline T clamp(const T &v, const U &lo, const U &hi) {
template<typename T, typename U, typename C> template<typename T, typename U, typename C>
inline T clamp(const T &v, const U &lo, const U &hi, C compare) { 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 */ /* lexicographical compare */
@ -234,9 +246,12 @@ inline bool lexicographical_compare(R1 range1, R2 range2) {
} }
return (range1.empty() && !range2.empty()); return (range1.empty() && !range2.empty());
} }
template<typename R> inline auto lexicographical_compare(R range) {
return [&range](auto &obj) { return lexicographical_compare(obj, move(range)); };
}
template<typename R1, typename R2, typename C> template<typename R1, typename R2, typename C>
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()) { while (!range1.empty() && !range2.empty()) {
if (compare(range1.front(), range2.front())) return true; if (compare(range1.front(), range2.front())) return true;
if (compare(range2.front(), range1.front())) return false; 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()); return (range1.empty() && !range2.empty());
} }
template<typename R, typename C>
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 */ /* algos that don't change the range */
@ -351,13 +372,19 @@ template<typename F> inline auto find_if_not(F func) {
} }
template<typename R1, typename R2, typename C> template<typename R1, typename R2, typename C>
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 (; !range.empty(); range.pop_front())
for (R2 rv = values; !rv.empty(); rv.pop_front()) for (R2 rv = values; !rv.empty(); rv.pop_front())
if (compare(range.front(), rv.front())) if (compare(range.front(), rv.front()))
return range; return range;
return range; return range;
} }
template<typename R, typename C>
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<typename R1, typename R2> template<typename R1, typename R2>
inline R1 find_one_of(R1 range, R2 values) { 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;
return range; return range;
} }
template<typename R> inline auto find_one_of(R values) {
return [&values](auto &obj) {
return find_one_of(obj, move(values));
};
}
template<typename R, typename T> template<typename R, typename T>
inline RangeSize<R> count(R range, const T &v) { inline RangeSize<R> count(R range, const T &v) {