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:
@@ -42,6 +42,7 @@
|
|||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace Utils
|
namespace Utils
|
||||||
{
|
{
|
||||||
@@ -808,7 +809,7 @@ OutputIt setUnionMerge(InputIt1 first1,
|
|||||||
last2,
|
last2,
|
||||||
d_first,
|
d_first,
|
||||||
merge,
|
merge,
|
||||||
std::less<decltype(*first1)>{});
|
std::less<std::decay_t<decltype(*first1)>>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class OutputContainer,
|
template<class OutputContainer,
|
||||||
@@ -843,9 +844,9 @@ OutputContainer setUnionMerge(InputContainer1 &&input1,
|
|||||||
InputContainer2 &&input2,
|
InputContainer2 &&input2,
|
||||||
Merge merge)
|
Merge merge)
|
||||||
{
|
{
|
||||||
return setUnionMerge(std::forward<InputContainer1>(input1),
|
return setUnionMerge<OutputContainer>(std::forward<InputContainer1>(input1),
|
||||||
std::forward<InputContainer2>(input2),
|
std::forward<InputContainer2>(input2),
|
||||||
merge,
|
merge,
|
||||||
std::less<decltype(*std::begin(input1))>{});
|
std::less<std::decay_t<decltype(*std::begin(input1))>>{});
|
||||||
}
|
}
|
||||||
} // namespace Utils
|
} // namespace Utils
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
#include "projectpartqueue.h"
|
#include "projectpartqueue.h"
|
||||||
|
|
||||||
namespace ClangBackEnd {
|
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)
|
void ProjectPartQueue::addProjectParts(V2::ProjectPartContainers &&projectParts)
|
||||||
{
|
{
|
||||||
auto compare = [](const V2::ProjectPartContainer &first, const V2::ProjectPartContainer &second) {
|
auto compare = [](const V2::ProjectPartContainer &first, const V2::ProjectPartContainer &second) {
|
||||||
@@ -98,17 +65,10 @@ void ProjectPartQueue::addProjectParts(V2::ProjectPartContainers &&projectParts)
|
|||||||
return first;
|
return first;
|
||||||
};
|
};
|
||||||
|
|
||||||
V2::ProjectPartContainers mergedProjectParts;
|
m_projectParts = Utils::setUnionMerge<V2::ProjectPartContainers>(m_projectParts,
|
||||||
mergedProjectParts.reserve(m_projectParts.size() + projectParts.size());
|
projectParts,
|
||||||
set_union_merge(std::make_move_iterator(m_projectParts.begin()),
|
merge,
|
||||||
std::make_move_iterator(m_projectParts.end()),
|
compare);
|
||||||
std::make_move_iterator(projectParts.begin()),
|
|
||||||
std::make_move_iterator(projectParts.end()),
|
|
||||||
std::back_inserter(mergedProjectParts),
|
|
||||||
compare,
|
|
||||||
merge);
|
|
||||||
|
|
||||||
m_projectParts = std::move(mergedProjectParts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CompareDifference
|
class CompareDifference
|
||||||
|
|||||||
@@ -27,60 +27,19 @@
|
|||||||
|
|
||||||
#include <symbolindexertaskschedulerinterface.h>
|
#include <symbolindexertaskschedulerinterface.h>
|
||||||
|
|
||||||
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
namespace ClangBackEnd {
|
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)
|
void SymbolIndexerTaskQueue::addOrUpdateTasks(std::vector<SymbolIndexerTask> &&tasks)
|
||||||
{
|
{
|
||||||
std::vector<SymbolIndexerTask> mergedTasks;
|
|
||||||
mergedTasks.reserve(m_tasks.size() + tasks.size());
|
|
||||||
|
|
||||||
auto merge = [] (SymbolIndexerTask &&first, SymbolIndexerTask &&second) {
|
auto merge = [] (SymbolIndexerTask &&first, SymbolIndexerTask &&second) {
|
||||||
first.callable = std::move(second.callable);
|
first.callable = std::move(second.callable);
|
||||||
|
|
||||||
return std::move(first);
|
return std::move(first);
|
||||||
};
|
};
|
||||||
|
|
||||||
set_union_merge(std::make_move_iterator(tasks.begin()),
|
m_tasks = Utils::setUnionMerge<std::vector<SymbolIndexerTask>>(tasks, m_tasks, merge);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymbolIndexerTaskQueue::removeTasks(const Utils::SmallStringVector &projectPartIds)
|
void SymbolIndexerTaskQueue::removeTasks(const Utils::SmallStringVector &projectPartIds)
|
||||||
|
|||||||
Reference in New Issue
Block a user