diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index ba3b4f4aad8018ebc53fb381c06ee5e5aa432d83..b80d2aa33b3466304222107bf5c4a11a3ea2badb 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -394,6 +394,31 @@ std::tuple<C, C> partition(const C &container, R (S::*predicate)() const) return partition(container, std::mem_fn(predicate)); } +////////////////// +// filteredUnique +///////////////// + +template<typename C> +Q_REQUIRED_RESULT +C filteredUnique(const C &container) +{ + C result; + auto ins = inserter(result); + + QSet<typename C::value_type> seen; + int setSize = 0; + + auto endIt = container.end(); + for (auto it = container.begin(); it != endIt; ++it) { + seen.insert(*it); + if (setSize == seen.size()) // unchanged size => was already seen + continue; + ++setSize; + ins = *it; + } + return result; +} + ////////////////// // sort /////////////////