From 6d9ff690c7eaabd9b27931ea38934b97466a43c2 Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@theqtcompany.com>
Date: Tue, 27 Oct 2015 12:01:18 +0100
Subject: [PATCH] ToolChainManager: Use partition in ToolChainManager

Change-Id: I4a1376f1ed4ffea83bbd693b3bc1e8fd284771a7
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
---
 .../projectexplorer/toolchainmanager.cpp      | 36 +++++++++----------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp
index e581617f131..bb8502a3738 100644
--- a/src/plugins/projectexplorer/toolchainmanager.cpp
+++ b/src/plugins/projectexplorer/toolchainmanager.cpp
@@ -46,6 +46,8 @@
 #include <QDir>
 #include <QSettings>
 
+#include <tuple>
+
 static const char TOOLCHAIN_DATA_KEY[] = "ToolChain.";
 static const char TOOLCHAIN_COUNT_KEY[] = "ToolChain.Count";
 static const char TOOLCHAIN_FILE_VERSION_KEY[] = "Version";
@@ -196,11 +198,9 @@ static QList<ToolChain *> subtractById(const QList<ToolChain *> &a, const QList<
                               });
 }
 
-static QList<ToolChain *> intersectByEqual(const QList<ToolChain *> &a, const QList<ToolChain *> &b)
+static bool containsByEqual(const QList<ToolChain *> &a, const ToolChain *atc)
 {
-    return Utils::filtered(a, [&b](ToolChain *atc) {
-                                  return Utils::anyOf(b, [atc](ToolChain *btc) { return *atc == *btc; });
-                              });
+    return Utils::anyOf(a, [atc](ToolChain *btc) { return *atc == *btc; });
 }
 
 static QList<ToolChain *> makeUnique(const QList<ToolChain *> &a)
@@ -223,22 +223,20 @@ static ToolChainOperations mergeToolChainLists(const QList<ToolChain *> &systemF
                                                const QList<ToolChain *> &userFileTcs,
                                                const QList<ToolChain *> &autodetectedTcs)
 {
-    const QList<ToolChain *> manualUserTcs
-            = Utils::filtered(userFileTcs, [](ToolChain *t) { return !t->isAutoDetected(); });
-
-    // Remove systemFileTcs from autodetectedUserTcs based on id-matches:
-    const QList<ToolChain *> autodetectedUserFileTcs
-            = Utils::filtered(userFileTcs, &ToolChain::isAutoDetected);
+    // Remove systemFileTcs from autodetectedUserFileTcs based on id-matches:
+    QList<ToolChain *> manualUserFileTcs;
+    QList<ToolChain *> autodetectedUserFileTcs;
+    std::tie(autodetectedUserFileTcs, manualUserFileTcs)
+            = Utils::partition(userFileTcs, &ToolChain::isAutoDetected);
     const QList<ToolChain *> autodetectedUserTcs = subtractById(autodetectedUserFileTcs, systemFileTcs);
 
     // Calculate a set of Tcs that were detected before (and saved to userFile) and that
     // got re-detected again. Take the userTcs (to keep Ids) over the same in autodetectedTcs.
-    const QList<ToolChain *> redetectedUserTcs
-            = intersectByEqual(autodetectedUserTcs, autodetectedTcs);
-
-    // Remove redetected tcs from autodetectedUserTcs:
-    const QList<ToolChain *> notRedetectedUserTcs
-            = subtractByPointerEqual(autodetectedUserTcs, redetectedUserTcs);
+    QList<ToolChain *> redetectedUserTcs;
+    QList<ToolChain *> notRedetectedUserTcs;
+    std::tie(redetectedUserTcs, notRedetectedUserTcs)
+            = Utils::partition(autodetectedUserTcs,
+                               [&autodetectedTcs](ToolChain *tc) { return containsByEqual(autodetectedTcs, tc); });
 
     // Remove redetected tcs from autodetectedTcs:
     const QList<ToolChain *> newlyAutodetectedTcs
@@ -248,12 +246,12 @@ static ToolChainOperations mergeToolChainLists(const QList<ToolChain *> &systemF
             = Utils::filtered(notRedetectedUserTcs, &ToolChain::isValid);
 
     const QList<ToolChain *> validManualUserTcs
-            = Utils::filtered(manualUserTcs, &ToolChain::isValid);
+            = Utils::filtered(manualUserFileTcs, &ToolChain::isValid);
 
     ToolChainOperations result;
     result.toDemote = notRedetectedButValidUserTcs;
-    result.toRegister = result.toDemote + systemFileTcs + redetectedUserTcs + newlyAutodetectedTcs
-            + validManualUserTcs;
+    result.toRegister = systemFileTcs + validManualUserTcs + result.toDemote // manual TCs
+            + redetectedUserTcs + newlyAutodetectedTcs; // auto TCs
 
     result.toDelete = makeUnique(subtractByPointerEqual(systemFileTcs + userFileTcs + autodetectedTcs,
                                                         result.toRegister));
-- 
GitLab