forked from qt-creator/qt-creator
Use Utils::setUnionMerge
And fix some details of the implementations. Change-Id: I8e77fee4b95658a69ef1656bb406811de091ce16 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -23,6 +23,8 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
#include "projectpartqueue.h"
|
||||
|
||||
namespace ClangBackEnd {
|
||||
@@ -32,41 +34,6 @@ ProjectPartQueue::ProjectPartQueue()
|
||||
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
template<class InputIt1,
|
||||
class InputIt2,
|
||||
class OutputIt,
|
||||
class Compare,
|
||||
class Merge>
|
||||
OutputIt set_union_merge(InputIt1 first1,
|
||||
InputIt1 last1,
|
||||
InputIt2 first2,
|
||||
InputIt2 last2,
|
||||
OutputIt d_first,
|
||||
Compare comp,
|
||||
Merge merge)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ProjectPartQueue::addProjectParts(V2::ProjectPartContainers &&projectParts)
|
||||
{
|
||||
auto compare = [](const V2::ProjectPartContainer &first, const V2::ProjectPartContainer &second) {
|
||||
@@ -98,17 +65,10 @@ void ProjectPartQueue::addProjectParts(V2::ProjectPartContainers &&projectParts)
|
||||
return first;
|
||||
};
|
||||
|
||||
V2::ProjectPartContainers mergedProjectParts;
|
||||
mergedProjectParts.reserve(m_projectParts.size() + projectParts.size());
|
||||
set_union_merge(std::make_move_iterator(m_projectParts.begin()),
|
||||
std::make_move_iterator(m_projectParts.end()),
|
||||
std::make_move_iterator(projectParts.begin()),
|
||||
std::make_move_iterator(projectParts.end()),
|
||||
std::back_inserter(mergedProjectParts),
|
||||
compare,
|
||||
merge);
|
||||
|
||||
m_projectParts = std::move(mergedProjectParts);
|
||||
m_projectParts = Utils::setUnionMerge<V2::ProjectPartContainers>(m_projectParts,
|
||||
projectParts,
|
||||
merge,
|
||||
compare);
|
||||
}
|
||||
|
||||
class CompareDifference
|
||||
|
||||
@@ -27,60 +27,19 @@
|
||||
|
||||
#include <symbolindexertaskschedulerinterface.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
namespace {
|
||||
|
||||
template<class InputIt1,
|
||||
class InputIt2,
|
||||
class OutputIt,
|
||||
class Merge>
|
||||
OutputIt set_union_merge(InputIt1 first1,
|
||||
InputIt1 last1,
|
||||
InputIt2 first2,
|
||||
InputIt2 last2,
|
||||
OutputIt d_first,
|
||||
Merge merge)
|
||||
{
|
||||
for (; first1 != last1; ++d_first) {
|
||||
if (first2 == last2)
|
||||
return std::copy(first1, last1, d_first);
|
||||
if (*first2 < *first1) {
|
||||
*d_first = *first2++;
|
||||
} else {
|
||||
if (*first1 < *first2) {
|
||||
*d_first = *first1;
|
||||
} else {
|
||||
*d_first = merge(*first1, *first2);
|
||||
++first2;
|
||||
}
|
||||
++first1;
|
||||
}
|
||||
}
|
||||
return std::copy(first2, last2, d_first);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SymbolIndexerTaskQueue::addOrUpdateTasks(std::vector<SymbolIndexerTask> &&tasks)
|
||||
{
|
||||
std::vector<SymbolIndexerTask> mergedTasks;
|
||||
mergedTasks.reserve(m_tasks.size() + tasks.size());
|
||||
|
||||
auto merge = [] (SymbolIndexerTask &&first, SymbolIndexerTask &&second) {
|
||||
first.callable = std::move(second.callable);
|
||||
|
||||
return std::move(first);
|
||||
};
|
||||
|
||||
set_union_merge(std::make_move_iterator(tasks.begin()),
|
||||
std::make_move_iterator(tasks.end()),
|
||||
std::make_move_iterator(m_tasks.begin()),
|
||||
std::make_move_iterator(m_tasks.end()),
|
||||
std::back_inserter(mergedTasks),
|
||||
merge);
|
||||
|
||||
m_tasks = std::move(mergedTasks);
|
||||
m_tasks = Utils::setUnionMerge<std::vector<SymbolIndexerTask>>(tasks, m_tasks, merge);
|
||||
}
|
||||
|
||||
void SymbolIndexerTaskQueue::removeTasks(const Utils::SmallStringVector &projectPartIds)
|
||||
|
||||
Reference in New Issue
Block a user