diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index fa3ebabe5dbf79ce3a533d9c5b1fad039e142e9d..ba3b4f4aad8018ebc53fb381c06ee5e5aa432d83 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -35,6 +35,8 @@ #include #include +#include + #include namespace Utils @@ -359,6 +361,39 @@ C filtered(const C &container, R (S::*predicate)() const) return out; } +////////////////// +// partition +///////////////// + +// Recommended usage: +// C hit; +// C miss; +// std::tie(hit, miss) = Utils::partition(container, predicate); + +template +Q_REQUIRED_RESULT +std::tuple partition(const C &container, F predicate) +{ + C hit; + C miss; + auto hitIns = inserter(hit); + auto missIns = inserter(miss); + foreach (auto i, container) { + if (predicate(i)) + hitIns = i; + else + missIns = i; + } + return std::make_tuple(hit, miss); +} + +template +Q_REQUIRED_RESULT +std::tuple partition(const C &container, R (S::*predicate)() const) +{ + return partition(container, std::mem_fn(predicate)); +} + ////////////////// // sort /////////////////