aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2021-04-23 03:43:55 +0300
committerIvan Komissarov <ABBAPOH@gmail.com>2021-08-16 10:05:48 +0000
commit4d85d558597f9405b9c9d20446156cd63d5b09c2 (patch)
treed70dd5a60a046d88c91759159deca651a88d9449
parent8b259164f2dbbfb1c87de20acbb1d3592e2a3b8c (diff)
Get rid of Set::to/from methods
... and replace them with the new template rangeTo method Also, add efficient Set(Iter, Iter) ctor. Change-Id: I5a2345ca84373692e3ba815e5a8f38cb4cfc4308 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/app/qbs-setup-qt/setupqt.cpp7
-rw-r--r--src/lib/corelib/api/project.cpp2
-rw-r--r--src/lib/corelib/buildgraph/artifactcleaner.cpp2
-rw-r--r--src/lib/corelib/buildgraph/buildgraph.cpp3
-rw-r--r--src/lib/corelib/buildgraph/depscanner.cpp2
-rw-r--r--src/lib/corelib/buildgraph/executor.cpp2
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.cpp2
-rw-r--r--src/lib/corelib/language/language.cpp4
-rw-r--r--src/lib/corelib/language/moduleloader.cpp2
-rw-r--r--src/lib/corelib/language/projectresolver.cpp14
-rw-r--r--src/lib/corelib/tools/set.h56
-rw-r--r--src/lib/corelib/tools/stlutils.h36
-rw-r--r--src/plugins/generator/visualstudio/msbuildfiltersproject.cpp5
-rw-r--r--tests/auto/api/tst_api.cpp11
14 files changed, 77 insertions, 71 deletions
diff --git a/src/app/qbs-setup-qt/setupqt.cpp b/src/app/qbs-setup-qt/setupqt.cpp
index 07e1a81b5..eb78ec36d 100644
--- a/src/app/qbs-setup-qt/setupqt.cpp
+++ b/src/app/qbs-setup-qt/setupqt.cpp
@@ -65,6 +65,7 @@ using Internal::none_of;
using Internal::contains;
using Internal::HostOsInfo;
using Internal::Tr;
+using Internal::rangeTo;
static QStringList qmakeExecutableNames()
{
@@ -195,7 +196,7 @@ QtEnvironment SetupQt::fetchEnvironment(const QString &qmakePath)
static bool isToolchainProfile(const Profile &profile)
{
- const auto actual = Internal::Set<QString>::fromList(
+ const auto actual = rangeTo<Internal::Set<QString>>(
profile.allKeys(Profile::KeySelectionRecursive));
Internal::Set<QString> expected{ QStringLiteral("qbs.toolchainType") };
if (HostOsInfo::isMacosHost())
@@ -237,8 +238,8 @@ static Match compatibility(const QtEnvironment &env, const Profile &toolchainPro
? canonicalToolchain(toolchainType)
: toolchainProfile.value(QStringLiteral("qbs.toolchain")).toStringList();
- const auto toolchainNames = Internal::Set<QString>::fromList(toolchain);
- const auto qtToolchainNames = Internal::Set<QString>::fromList(env.qbsToolchain);
+ const auto toolchainNames = rangeTo<Internal::Set<QString>>(toolchain);
+ const auto qtToolchainNames = rangeTo<Internal::Set<QString>>(env.qbsToolchain);
if (areProfilePropertiesIncompatible(toolchainNames, qtToolchainNames)) {
auto intersection = toolchainNames;
intersection.intersect(qtToolchainNames);
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp
index 23513564b..46c73dabd 100644
--- a/src/lib/corelib/api/project.cpp
+++ b/src/lib/corelib/api/project.cpp
@@ -958,7 +958,7 @@ QVariantMap Project::projectConfiguration() const
std::set<QString> Project::buildSystemFiles() const
{
QBS_ASSERT(isValid(), return {});
- return d->internalProject->buildSystemFiles.toStdSet();
+ return rangeTo<std::set<QString>>(d->internalProject->buildSystemFiles);
}
RuleCommandList Project::ruleCommands(const ProductData &product,
diff --git a/src/lib/corelib/buildgraph/artifactcleaner.cpp b/src/lib/corelib/buildgraph/artifactcleaner.cpp
index 03b327232..6239a138b 100644
--- a/src/lib/corelib/buildgraph/artifactcleaner.cpp
+++ b/src/lib/corelib/buildgraph/artifactcleaner.cpp
@@ -181,7 +181,7 @@ void ArtifactCleaner::cleanup(const TopLevelProjectPtr &project,
// Directories created during the build are not artifacts (TODO: should they be?),
// so we have to clean them up manually.
- QList<QString> dirList = directories.toList();
+ auto dirList = rangeTo<QStringList>(directories);
for (int i = 0; i < dirList.size(); ++i) {
const QString &dir = dirList.at(i);
if (!dir.startsWith(project->buildDirectory))
diff --git a/src/lib/corelib/buildgraph/buildgraph.cpp b/src/lib/corelib/buildgraph/buildgraph.cpp
index 0d5e8a1f0..82dae98b5 100644
--- a/src/lib/corelib/buildgraph/buildgraph.cpp
+++ b/src/lib/corelib/buildgraph/buildgraph.cpp
@@ -850,8 +850,7 @@ void doSanityChecks(const ResolvedProjectPtr &project, const Logger &logger)
if (qEnvironmentVariableIsEmpty("QBS_SANITY_CHECKS"))
return;
Set<QString> productNames;
- const Set<ResolvedProductPtr> allProducts
- = Set<ResolvedProductPtr>::fromStdVector(project->allProducts());
+ const auto allProducts = rangeTo<Set<ResolvedProductPtr>>(project->allProducts());
doSanityChecks(project, allProducts, productNames, logger);
}
diff --git a/src/lib/corelib/buildgraph/depscanner.cpp b/src/lib/corelib/buildgraph/depscanner.cpp
index 0bf644286..3f37841d9 100644
--- a/src/lib/corelib/buildgraph/depscanner.cpp
+++ b/src/lib/corelib/buildgraph/depscanner.cpp
@@ -127,7 +127,7 @@ QStringList PluginDependencyScanner::collectDependencies(Artifact *artifact, Fil
result += outFilePath;
}
m_plugin->close(scannerHandle);
- return result.toList();
+ return rangeTo<QStringList>(result);
}
bool PluginDependencyScanner::recursive() const
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp
index 377222d21..9ef51d95f 100644
--- a/src/lib/corelib/buildgraph/executor.cpp
+++ b/src/lib/corelib/buildgraph/executor.cpp
@@ -193,7 +193,7 @@ public:
allDependencies += dep;
}
const Set<ResolvedProductPtr> rootProducts
- = Set<ResolvedProductPtr>::fromStdVector(m_allProducts) - allDependencies;
+ = rangeTo<Set<ResolvedProductPtr>>(m_allProducts) - allDependencies;
m_priority = UINT_MAX;
m_seenProducts.clear();
for (const ResolvedProductPtr &rootProduct : rootProducts)
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp
index 0d36e1e21..f464734b8 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.cpp
+++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp
@@ -228,7 +228,7 @@ void RulesApplicator::doApply(const ArtifactSet &inputArtifacts, QScriptValue &p
}
}
- ArtifactSet newOutputs = ArtifactSet::fromList(outputArtifacts);
+ const auto newOutputs = rangeTo<ArtifactSet>(outputArtifacts);
const ArtifactSet oldOutputs = collectOldOutputArtifacts(inputArtifacts);
handleRemovedRuleOutputs(m_completeInputSet, oldOutputs - newOutputs, m_removedArtifacts,
m_logger);
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index 8c8b4a9a2..f0b6d3e27 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -895,8 +895,8 @@ bool operator==(const RuleArtifact &a1, const RuleArtifact &a2)
return a1.filePath == a2.filePath
&& a1.fileTags == a2.fileTags
&& a1.alwaysUpdated == a2.alwaysUpdated
- && Set<RuleArtifact::Binding>::fromStdVector(a1.bindings) ==
- Set<RuleArtifact::Binding>::fromStdVector(a2.bindings);
+ && rangeTo<Set<RuleArtifact::Binding>>(a1.bindings) ==
+ rangeTo<Set<RuleArtifact::Binding>>(a2.bindings);
}
bool operator==(const RuleArtifact::Binding &b1, const RuleArtifact::Binding &b2)
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 6e1d74a03..5c2c376f5 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -174,7 +174,7 @@ public:
}
}
const Set<ProductContext *> rootProducts
- = Set<ProductContext *>::fromList(allProducts) - allDependencies;
+ = rangeTo<Set<ProductContext *>>(allProducts) - allDependencies;
for (ProductContext * const rootProduct : rootProducts)
traverse(rootProduct);
if (m_sortedProducts.size() < allProducts.size()) {
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index d3b744892..83f42e4e2 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -635,13 +635,14 @@ SourceArtifactPtr ProjectResolver::createSourceArtifact(const ResolvedProductPtr
return artifact;
}
-static QualifiedIdSet propertiesToEvaluate(const QList<QualifiedId> &initialProps,
- const PropertyDependencies &deps)
+static QualifiedIdSet propertiesToEvaluate(std::deque<QualifiedId> initialProps,
+ const PropertyDependencies &deps)
{
- QList<QualifiedId> remainingProps = initialProps;
+ std::deque<QualifiedId> remainingProps = std::move(initialProps);
QualifiedIdSet allProperties;
while (!remainingProps.empty()) {
- const QualifiedId prop = remainingProps.takeFirst();
+ const QualifiedId prop = remainingProps.front();
+ remainingProps.pop_front();
const auto insertResult = allProperties.insert(prop);
if (!insertResult.second)
continue;
@@ -663,8 +664,9 @@ QVariantMap ProjectResolver::resolveAdditionalModuleProperties(const Item *group
const QualifiedIdSet &propsSetInGroup = it->second;
// Step 2: Gather all properties that depend on these properties.
- const QualifiedIdSet &propsToEval
- = propertiesToEvaluate(propsSetInGroup.toList(), m_evaluator->propertyDependencies());
+ const QualifiedIdSet &propsToEval = propertiesToEvaluate(
+ rangeTo<std::deque<QualifiedId>>(propsSetInGroup),
+ m_evaluator->propertyDependencies());
// Step 3: Evaluate all these properties and replace their values in the map
QVariantMap modulesMap = currentValues;
diff --git a/src/lib/corelib/tools/set.h b/src/lib/corelib/tools/set.h
index 463d3beb6..ddd38b6f3 100644
--- a/src/lib/corelib/tools/set.h
+++ b/src/lib/corelib/tools/set.h
@@ -42,6 +42,7 @@
#include <tools/dynamictypecheck.h>
#include <tools/persistence.h>
+#include <tools/stlutils.h>
#ifdef QT_CORE_LIB
#include <QtCore/qstringlist.h>
@@ -100,6 +101,8 @@ public:
Set() = default;
Set(const std::initializer_list<T> &list);
+ template<typename InputIterator>
+ Set(InputIterator first, InputIterator last);
Set &unite(const Set &other);
Set &operator+=(const Set &other) { return unite(other); }
@@ -143,15 +146,8 @@ public:
QStringList toStringList() const;
QString toString(const T& value) const { return value.toString(); }
QString toString() const;
-
- static Set<T> fromList(const QList<T> &list);
- QList<T> toList() const;
#endif
- static Set<T> fromStdVector(const std::vector<T> &vector);
- static Set<T> fromStdSet(const std::set<T> &set);
- std::set<T> toStdSet() const;
-
template<typename U> static Set<T> filtered(const Set<U> &s);
bool operator==(const Set &other) const { return m_data == other.m_data; }
@@ -177,6 +173,15 @@ template<typename T> Set<T>::Set(const std::initializer_list<T> &list) : m_data(
m_data.erase(last, m_data.end());
}
+template<typename T>
+template<typename InputIterator>
+Set<T>::Set(InputIterator first, InputIterator last)
+{
+ reserveIfForwardIterator(&m_data, first, last);
+ std::copy(first, last, std::back_inserter(m_data));
+ sort();
+}
+
template<typename T> Set<T> &Set<T>::intersect(const Set<T> &other)
{
auto it = begin();
@@ -301,45 +306,8 @@ template<typename T> QString Set<T>::toString() const
template<> inline QString Set<QString>::toString(const QString &value) const { return value; }
-template<typename T> Set<T> Set<T>::fromList(const QList<T> &list)
-{
- Set<T> s;
- std::copy(list.cbegin(), list.cend(), std::back_inserter(s.m_data));
- s.sort();
- return s;
-}
-
-template<typename T> QList<T> Set<T>::toList() const
-{
- QList<T> list;
- std::copy(m_data.cbegin(), m_data.cend(), std::back_inserter(list));
- return list;
-}
#endif
-template<typename T> Set<T> Set<T>::fromStdVector(const std::vector<T> &vector)
-{
- Set<T> s;
- std::copy(vector.cbegin(), vector.cend(), std::back_inserter(s.m_data));
- s.sort();
- return s;
-}
-
-template<typename T> Set<T> Set<T>::fromStdSet(const std::set<T> &set)
-{
- Set<T> s;
- std::copy(set.cbegin(), set.cend(), std::back_inserter(s.m_data));
- return s;
-}
-
-template<typename T> std::set<T> Set<T>::toStdSet() const
-{
- std::set<T> set;
- for (auto it = cbegin(); it != cend(); ++it)
- set.insert(*it);
- return set;
-}
-
template<typename T>
typename Set<T>::iterator Set<T>::asMutableIterator(typename Set<T>::const_iterator cit)
{
diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h
index e13fcdfe5..2a069cbe1 100644
--- a/src/lib/corelib/tools/stlutils.h
+++ b/src/lib/corelib/tools/stlutils.h
@@ -183,6 +183,42 @@ size_t hashRange(R &&range)
return hashRange(std::begin(range), std::end(range));
}
+// based on qcontainertools_impl.h
+template <typename Iterator>
+using IfIsForwardIterator_t = typename std::enable_if_t<
+ std::is_convertible_v<
+ typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>,
+ bool>;
+
+template <typename Iterator>
+using IfIsNotForwardIterator = typename std::enable_if_t<
+ !std::is_convertible_v<
+ typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>,
+ bool>;
+
+template <typename Container,
+ typename InputIterator,
+ IfIsNotForwardIterator<InputIterator> = true>
+void reserveIfForwardIterator(Container *, InputIterator, InputIterator)
+{
+}
+
+template <typename Container,
+ typename ForwardIterator,
+ IfIsForwardIterator_t<ForwardIterator> = true>
+void reserveIfForwardIterator(Container *c, ForwardIterator f, ForwardIterator l)
+{
+ c->reserve(static_cast<typename Container::size_type>(std::distance(f, l)));
+}
+
+// similar to ranges::to proposal
+// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1206r1.pdf
+template <class C, class R>
+C rangeTo(R &&r)
+{
+ return C(std::begin(r), std::end(r));
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp b/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
index a15e7fef3..039b1173e 100644
--- a/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
@@ -105,12 +105,13 @@ MSBuildFiltersProject::MSBuildFiltersProject(const GeneratableProductData &produ
filter->appendProperty(QStringLiteral("SourceControlFiles"), options->sourceControlFiles());
}
- Internal::Set<QString> allFiles;
+ using StringSet = Internal::Set<QString>;
+ StringSet allFiles;
const auto productDatas = product.data.values();
for (const auto &productData : productDatas) {
for (const auto &groupData : productData.groups())
if (groupData.isEnabled())
- allFiles.unite(Internal::Set<QString>::fromList(groupData.allFilePaths()));
+ allFiles.unite(Internal::rangeTo<StringSet>(groupData.allFilePaths()));
}
MSBuildItemGroup *headerFilesGroup = nullptr;
diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp
index ac37139a3..f2a9e4865 100644
--- a/tests/auto/api/tst_api.cpp
+++ b/tests/auto/api/tst_api.cpp
@@ -1615,12 +1615,11 @@ void TestApi::listBuildSystemFiles()
m_logSink, nullptr));
waitForFinished(job.get());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));
- const auto buildSystemFiles = qbs::Internal::Set<QString>::fromStdSet(
- job->project().buildSystemFiles());
- QVERIFY(buildSystemFiles.contains(setupParams.projectFilePath()));
- QVERIFY(buildSystemFiles.contains(setupParams.buildRoot() + "/subproject2/subproject2.qbs"));
- QVERIFY(buildSystemFiles.contains(setupParams.buildRoot()
- + "/subproject2/subproject3/subproject3.qbs"));
+ const auto buildSystemFiles = job->project().buildSystemFiles();
+ QVERIFY(buildSystemFiles.count(setupParams.projectFilePath()));
+ QVERIFY(buildSystemFiles.count(setupParams.buildRoot() + "/subproject2/subproject2.qbs"));
+ QVERIFY(buildSystemFiles.count(setupParams.buildRoot()
+ + "/subproject2/subproject3/subproject3.qbs"));
}
void TestApi::localProfiles()