diff --git a/src/libs/clangsupport/generatedfiles.cpp b/src/libs/clangsupport/generatedfiles.cpp index f4863baba5d..644137886ba 100644 --- a/src/libs/clangsupport/generatedfiles.cpp +++ b/src/libs/clangsupport/generatedfiles.cpp @@ -25,6 +25,8 @@ #include "generatedfiles.h" +#include + namespace ClangBackEnd { void GeneratedFiles::update(V2::FileContainers &&fileContainers) @@ -32,16 +34,16 @@ void GeneratedFiles::update(V2::FileContainers &&fileContainers) V2::FileContainers unionFileContainers; unionFileContainers.reserve(m_fileContainers.size() + fileContainers.size()); - auto compare = [] (const V2::FileContainer &first, const V2::FileContainer &second) { + auto compare = [](const V2::FileContainer &first, const V2::FileContainer &second) { return first.filePath < second.filePath; }; - std::set_union(std::make_move_iterator(fileContainers.begin()), - std::make_move_iterator(fileContainers.end()), - std::make_move_iterator(m_fileContainers.begin()), - std::make_move_iterator(m_fileContainers.end()), - std::back_inserter(unionFileContainers), - compare); + Utils::set_union(std::make_move_iterator(fileContainers.begin()), + std::make_move_iterator(fileContainers.end()), + std::make_move_iterator(m_fileContainers.begin()), + std::make_move_iterator(m_fileContainers.end()), + std::back_inserter(unionFileContainers), + compare); m_fileContainers = std::move(unionFileContainers); } @@ -55,12 +57,12 @@ void GeneratedFiles::update(const V2::FileContainers &fileContainers) return first.filePath < second.filePath; }; - std::set_union(fileContainers.begin(), - fileContainers.end(), - std::make_move_iterator(m_fileContainers.begin()), - std::make_move_iterator(m_fileContainers.end()), - std::back_inserter(unionFileContainers), - compare); + Utils::set_union(fileContainers.begin(), + fileContainers.end(), + std::make_move_iterator(m_fileContainers.begin()), + std::make_move_iterator(m_fileContainers.end()), + std::back_inserter(unionFileContainers), + compare); m_fileContainers = std::move(unionFileContainers); } diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index bae78aacdac..766f9419b84 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -862,4 +862,70 @@ std::make_signed_t ssize(Container container) { return static_cast>(container.size()); } + +template +struct CompareIter +{ + Compare compare; + + explicit constexpr CompareIter(Compare compare) + : compare(std::move(compare)) + {} + + template + constexpr bool operator()(Iterator1 it1, Iterator2 it2) + { + return bool(compare(*it1, *it2)); + } +}; + +template +OutputIterator set_union_impl(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + InputIterator2 last2, + OutputIterator result, + Compare comp) +{ + auto compare = CompareIter(comp); + + while (first1 != last1 && first2 != last2) { + if (compare(first1, first2)) { + *result = *first1; + ++first1; + } else if (compare(first2, first1)) { + *result = *first2; + ++first2; + } else { + *result = *first1; + ++first1; + ++first2; + } + ++result; + } + + return std::copy(first2, last2, std::copy(first1, last1, result)); +} + +template +OutputIterator set_union(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + InputIterator2 last2, + OutputIterator result, + Compare comp) +{ + return Utils::set_union_impl(first1, last1, first2, last2, result, comp); +} + +template +OutputIterator set_union(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + InputIterator2 last2, + OutputIterator result) +{ + return Utils::set_union_impl( + first1, last1, first2, last2, result, std::less{}); +} } // namespace Utils diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp index 2abe3fa3946..1bf21712fd8 100644 --- a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp @@ -30,6 +30,8 @@ #include #include +#include + namespace ClangBackEnd { void PchTaskQueue::addPchTasks(PchTasks &&newPchTasks, PchTasks &destination) @@ -42,12 +44,12 @@ void PchTaskQueue::addPchTasks(PchTasks &&newPchTasks, PchTasks &destination) PchTasks mergedPchTasks; mergedPchTasks.reserve(destination.size() + newPchTasks.size()); - std::set_union(std::make_move_iterator(newPchTasks.begin()), - std::make_move_iterator(newPchTasks.end()), - std::make_move_iterator(destination.begin()), - std::make_move_iterator(destination.end()), - std::back_inserter(mergedPchTasks), - compare); + Utils::set_union(std::make_move_iterator(newPchTasks.begin()), + std::make_move_iterator(newPchTasks.end()), + std::make_move_iterator(destination.begin()), + std::make_move_iterator(destination.end()), + std::back_inserter(mergedPchTasks), + compare); destination = std::move(mergedPchTasks); diff --git a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp index 7e850b8947e..68a8e4a6427 100644 --- a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp @@ -27,6 +27,8 @@ #include "pchtaskqueueinterface.h" +#include + namespace ClangBackEnd { void PchTasksMerger::mergeTasks(PchTaskSets &&taskSets, @@ -48,11 +50,11 @@ Result merge(Container &&first, Container &&second) Result result; result.reserve(first.size() + second.size()); - std::set_union(std::make_move_iterator(first.begin()), - std::make_move_iterator(first.end()), - std::make_move_iterator(second.begin()), - std::make_move_iterator(second.end()), - std::back_inserter(result)); + Utils::set_union(std::make_move_iterator(first.begin()), + std::make_move_iterator(first.end()), + std::make_move_iterator(second.begin()), + std::make_move_iterator(second.end()), + std::back_inserter(result)); return result; } diff --git a/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h b/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h index ed5ab3b1fd1..d4d8a6479fb 100644 --- a/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h +++ b/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h @@ -27,6 +27,8 @@ #include +#include + #include namespace ClangBackEnd { @@ -48,11 +50,11 @@ struct ArgumentsEntry ProjectPartIds mergedIds; mergedIds.reserve(ids.size() + newIds.size()); - std::set_union(std::make_move_iterator(ids.begin()), - std::make_move_iterator(ids.end()), - std::make_move_iterator(newIds.begin()), - std::make_move_iterator(newIds.end()), - std::back_inserter(mergedIds)); + Utils::set_union(std::make_move_iterator(ids.begin()), + std::make_move_iterator(ids.end()), + std::make_move_iterator(newIds.begin()), + std::make_move_iterator(newIds.end()), + std::back_inserter(mergedIds)); ids = std::move(mergedIds); }