ClangPchManager: Fix merge in ProjectPartsManager

We relied on the reserve function but this is a little bit brittle. So we
create now two container and merge them later. This can be sometimes
slower or even faster but anyway I think it does not matter.

Change-Id: I78dca39c84cc82de17c1efe0b202b6662734d56d
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2019-08-26 16:38:21 +02:00
parent 99e841d140
commit a46da29125

View File

@@ -132,7 +132,7 @@ ProjectPartsManager::UpToDataProjectParts ProjectPartsManager::update(ProjectPar
} }
ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDependeciesAndTime( ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDependeciesAndTime(
ProjectPartContainers &&upToDateProjectParts, ProjectPartContainers &&updateSystemProjectParts) ProjectPartContainers &&upToDateProjectParts, ProjectPartContainers &&orignalUpdateSystemProjectParts)
{ {
ProjectPartContainerReferences changeProjectParts; ProjectPartContainerReferences changeProjectParts;
changeProjectParts.reserve(upToDateProjectParts.size()); changeProjectParts.reserve(upToDateProjectParts.size());
@@ -140,9 +140,8 @@ ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDep
ProjectPartContainers updateProjectProjectParts; ProjectPartContainers updateProjectProjectParts;
updateProjectProjectParts.reserve(upToDateProjectParts.size()); updateProjectProjectParts.reserve(upToDateProjectParts.size());
updateSystemProjectParts.reserve(updateProjectProjectParts.size() + upToDateProjectParts.size()); ProjectPartContainers addedUpToDateSystemProjectParts;
addedUpToDateSystemProjectParts.reserve(upToDateProjectParts.size());
auto systemSplit = updateSystemProjectParts.end();
FilePathIds generatedFiles = m_generatedFiles.filePathIds(); FilePathIds generatedFiles = m_generatedFiles.filePathIds();
@@ -178,7 +177,7 @@ ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDep
projectPart.projectPartId = -1; projectPart.projectPartId = -1;
break; break;
case Change::System: case Change::System:
updateSystemProjectParts.emplace_back(std::move(projectPart)); addedUpToDateSystemProjectParts.emplace_back(std::move(projectPart));
projectPart.projectPartId = -1; projectPart.projectPartId = -1;
break; break;
case Change::No: case Change::No:
@@ -205,7 +204,7 @@ ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDep
projectPart.projectPartId = -1; projectPart.projectPartId = -1;
break; break;
case Change::System: case Change::System:
updateSystemProjectParts.emplace_back(std::move(projectPart)); addedUpToDateSystemProjectParts.emplace_back(std::move(projectPart));
projectPart.projectPartId = -1; projectPart.projectPartId = -1;
break; break;
case Change::No: case Change::No:
@@ -234,7 +233,15 @@ ProjectPartsManagerInterface::UpToDataProjectParts ProjectPartsManager::checkDep
if (watchedIdPaths.size()) if (watchedIdPaths.size())
m_clangPathwatcher.updateIdPaths(watchedIdPaths); m_clangPathwatcher.updateIdPaths(watchedIdPaths);
std::inplace_merge(updateSystemProjectParts.begin(), systemSplit, updateSystemProjectParts.end()); ProjectPartContainers updateSystemProjectParts;
updateSystemProjectParts.reserve(orignalUpdateSystemProjectParts.size() + addedUpToDateSystemProjectParts.size());
std::merge(std::make_move_iterator(orignalUpdateSystemProjectParts.begin()),
std::make_move_iterator(orignalUpdateSystemProjectParts.end()),
std::make_move_iterator(addedUpToDateSystemProjectParts.begin()),
std::make_move_iterator(addedUpToDateSystemProjectParts.end()),
std::back_inserter(updateSystemProjectParts));
upToDateProjectParts.erase(std::remove_if(upToDateProjectParts.begin(), upToDateProjectParts.erase(std::remove_if(upToDateProjectParts.begin(),
upToDateProjectParts.end(), upToDateProjectParts.end(),
[](const ProjectPartContainer &projectPart) { [](const ProjectPartContainer &projectPart) {