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:
Marco Bubke
2018-08-30 14:13:23 +02:00
parent a86867eb8a
commit be9537667f
3 changed files with 15 additions and 95 deletions

View File

@@ -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

View File

@@ -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)