diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2021-04-23 03:43:55 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2021-08-16 10:05:48 +0000 |
commit | 4d85d558597f9405b9c9d20446156cd63d5b09c2 (patch) | |
tree | d70dd5a60a046d88c91759159deca651a88d9449 | |
parent | 8b259164f2dbbfb1c87de20acbb1d3592e2a3b8c (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.cpp | 7 | ||||
-rw-r--r-- | src/lib/corelib/api/project.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/artifactcleaner.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraph.cpp | 3 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rulesapplicator.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 14 | ||||
-rw-r--r-- | src/lib/corelib/tools/set.h | 56 | ||||
-rw-r--r-- | src/lib/corelib/tools/stlutils.h | 36 | ||||
-rw-r--r-- | src/plugins/generator/visualstudio/msbuildfiltersproject.cpp | 5 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 11 |
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() |