forked from qt-creator/qt-creator
Utils: Add setUnionMerge to algorithms
Utils::setUnionMerge is an extension of std::set_union. It is not assigning but merging equal matching values. For example two project part with the same id will be merged in one by the merge function. Change-Id: Ia244a7c1ff84dfdbd30f7101ed1ccbfb88393c7d Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -754,4 +754,62 @@ Q_REQUIRED_RESULT decltype(auto) take(C &container, R (S::*function)() const)
|
||||
return take(container, std::mem_fn(function));
|
||||
}
|
||||
|
||||
//////////////////
|
||||
// setUnionMerge: Works like std::set_union but provides a merge function for items that match
|
||||
// !(a > b) && !(b > a) which normally means that there is an "equal" match.
|
||||
// It uses iterators to support move_iterators.
|
||||
/////////////////
|
||||
|
||||
template<class InputIt1,
|
||||
class InputIt2,
|
||||
class OutputIt,
|
||||
class Merge,
|
||||
class Compare>
|
||||
OutputIt setUnionMerge(InputIt1 first1,
|
||||
InputIt1 last1,
|
||||
InputIt2 first2,
|
||||
InputIt2 last2,
|
||||
OutputIt d_first,
|
||||
Merge merge,
|
||||
Compare comp)
|
||||
{
|
||||
for (; first1 != last1; ++d_first) {
|
||||
if (first2 == last2)
|
||||
return std::copy(first1, last1, d_first);
|
||||
if (comp(*first2, *first1)) {
|
||||
*d_first = *first2++;
|
||||
} else {
|
||||
if (comp(*first1, *first2)) {
|
||||
*d_first = *first1;
|
||||
} else {
|
||||
*d_first = merge(*first1, *first2);
|
||||
++first2;
|
||||
}
|
||||
++first1;
|
||||
}
|
||||
}
|
||||
return std::copy(first2, last2, d_first);
|
||||
}
|
||||
|
||||
template<class InputIt1,
|
||||
class InputIt2,
|
||||
class OutputIt,
|
||||
class Merge>
|
||||
OutputIt setUnionMerge(InputIt1 first1,
|
||||
InputIt1 last1,
|
||||
InputIt2 first2,
|
||||
InputIt2 last2,
|
||||
OutputIt d_first,
|
||||
Merge merge)
|
||||
{
|
||||
return setUnionMerge(first1,
|
||||
last1,
|
||||
first2,
|
||||
last2,
|
||||
d_first,
|
||||
merge,
|
||||
std::less<decltype(*first1)>{});
|
||||
}
|
||||
|
||||
|
||||
} // namespace Utils
|
||||
|
Reference in New Issue
Block a user