From d3e44609fd28268b525d12853e90b53d9e3f2183 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Mon, 17 Jan 2022 22:17:58 +0300 Subject: Use std::transform where it is possible ... to unify and simplify a code. Change-Id: Ia493c5f428c1da4df3c8623e448be8ac72fd4f44 Reviewed-by: Christian Kandeler --- src/lib/corelib/api/projectdata.cpp | 14 ++++++-------- src/lib/corelib/buildgraph/buildgraphloader.cpp | 6 ++---- src/lib/corelib/buildgraph/executor.cpp | 6 ++---- .../corelib/buildgraph/inputartifactscanner.cpp | 11 ++++++----- src/lib/corelib/generators/generatorutils.cpp | 11 ++++++----- src/lib/corelib/jsextensions/binaryfile.cpp | 11 ++++------- src/lib/corelib/jsextensions/pkgconfigjs.cpp | 7 ++----- .../corelib/jsextensions/utilitiesextension.cpp | 7 +++---- src/lib/corelib/language/moduleproviderloader.cpp | 12 +++++------- src/lib/corelib/language/projectresolver.cpp | 16 +++++++++------- src/lib/corelib/language/scriptengine.cpp | 4 ++-- src/lib/corelib/language/value.cpp | 6 +++--- src/lib/corelib/tools/clangclinfo.cpp | 5 ++--- src/lib/corelib/tools/jsonhelper.h | 7 +++---- src/lib/corelib/tools/msvcinfo.cpp | 6 +++--- src/lib/corelib/tools/set.h | 6 +----- src/lib/corelib/tools/stlutils.h | 22 ++++++++++++++++++++++ 17 files changed, 81 insertions(+), 76 deletions(-) (limited to 'src/lib') diff --git a/src/lib/corelib/api/projectdata.cpp b/src/lib/corelib/api/projectdata.cpp index 289c14781..750186539 100644 --- a/src/lib/corelib/api/projectdata.cpp +++ b/src/lib/corelib/api/projectdata.cpp @@ -45,8 +45,9 @@ #include #include #include -#include #include +#include +#include #include #include @@ -62,9 +63,10 @@ using namespace Internal; template static QJsonArray toJsonArray(const QList &list, const QStringList &moduleProperties) { + // We can't use transformed from stlutils.h here as QJsonArray has not the reserve() method. QJsonArray jsonArray; - std::transform(list.begin(), list.end(), std::back_inserter(jsonArray), - [&moduleProperties](const T &v) { return v.toJson(moduleProperties);}); + transform(list, jsonArray, [&moduleProperties](const T &v) { + return v.toJson(moduleProperties);}); return jsonArray; } @@ -218,11 +220,7 @@ bool GroupData::isEnabled() const QStringList GroupData::allFilePaths() const { const QList &artifacts = allSourceArtifacts(); - QStringList paths; - paths.reserve(artifacts.size()); - std::transform(artifacts.cbegin(), artifacts.cend(), std::back_inserter(paths), - [](const ArtifactData &sa) { return sa.filePath(); }); - return paths; + return transformed(artifacts, [](const auto &sa) { return sa.filePath(); }); } bool operator!=(const GroupData &lhs, const GroupData &rhs) diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp index 3e5dab2ee..9d65f42e4 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.cpp +++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp @@ -971,10 +971,8 @@ void BuildGraphLoader::rescueOldBuildData(const ResolvedProductConstPtr &restore rad.children.emplace_back(child->product->name, child->product->multiplexConfigurationId, child->filePath(), childrenInfo.childrenAddedByScanner.contains(child)); - std::transform(oldArtifact->fileDependencies.cbegin(), - oldArtifact->fileDependencies.cend(), - std::back_inserter(rad.fileDependencies), - std::mem_fn(&FileDependency::filePath)); + transform(oldArtifact->fileDependencies, rad.fileDependencies, + std::mem_fn(&FileDependency::filePath)); } newlyResolvedProduct->buildData->addRescuableArtifactData(oldArtifact->filePath(), rad); } diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp index 3df2b3625..f0fe7d726 100644 --- a/src/lib/corelib/buildgraph/executor.cpp +++ b/src/lib/corelib/buildgraph/executor.cpp @@ -1107,10 +1107,8 @@ void Executor::checkForUnbuiltProducts() m_logger.qbsInfo() << Tr::tr("Build done%1.").arg(configString()); } else { m_error.append(Tr::tr("The following products could not be built%1:").arg(configString())); - QStringList productNames; - std::transform(unbuiltProducts.cbegin(), unbuiltProducts.cend(), - std::back_inserter(productNames), - [](const ResolvedProductConstPtr &p) { return p->fullDisplayName(); }); + auto productNames = transformed(unbuiltProducts, [](const auto &p) { + return p->fullDisplayName(); }); std::sort(productNames.begin(), productNames.end()); m_error.append(productNames.join(QLatin1String(", "))); } diff --git a/src/lib/corelib/buildgraph/inputartifactscanner.cpp b/src/lib/corelib/buildgraph/inputartifactscanner.cpp index ad674596a..05bbc0d4b 100644 --- a/src/lib/corelib/buildgraph/inputartifactscanner.cpp +++ b/src/lib/corelib/buildgraph/inputartifactscanner.cpp @@ -49,11 +49,12 @@ #include #include +#include #include -#include #include -#include #include +#include +#include #include #include @@ -212,9 +213,9 @@ Set InputArtifactScanner::scannersForArtifact(const Artifac InputArtifactScannerContext::DependencyScannerCacheItem &cache = scannerCache[fileTag]; if (!cache.valid) { cache.valid = true; - for (ScannerPlugin *scanner : ScannerPluginManager::scannersForFileTag(fileTag)) { - cache.scanners.push_back(std::make_shared(scanner)); - } + const auto scanners = ScannerPluginManager::scannersForFileTag(fileTag); + transform(scanners, cache.scanners, [](const auto &scanner) { + return std::make_shared(scanner); }); for (const ResolvedScannerConstPtr &scanner : product->scanners) { if (scanner->inputs.contains(fileTag)) { cache.scanners.push_back( diff --git a/src/lib/corelib/generators/generatorutils.cpp b/src/lib/corelib/generators/generatorutils.cpp index 8089592c9..c49e1fa75 100644 --- a/src/lib/corelib/generators/generatorutils.cpp +++ b/src/lib/corelib/generators/generatorutils.cpp @@ -30,6 +30,8 @@ #include "generatorutils.h" +#include + namespace qbs { namespace gen { namespace utils { @@ -189,11 +191,10 @@ QStringList cppStringModuleProperties(const PropertyMap &qbsProps, { QStringList properties; for (const auto &propertyName : propertyNames) { - const auto entries = qbsProps.getModuleProperty( - Internal::StringConstants::cppModule(), - propertyName).toStringList(); - for (const auto &entry : entries) - properties.push_back(entry.trimmed()); + const auto entries = qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), + propertyName).toStringList(); + Internal::transform(entries, properties, [](const auto &entry) { + return entry.trimmed(); }); } return properties; } diff --git a/src/lib/corelib/jsextensions/binaryfile.cpp b/src/lib/corelib/jsextensions/binaryfile.cpp index 88b3608de..3731c4da7 100644 --- a/src/lib/corelib/jsextensions/binaryfile.cpp +++ b/src/lib/corelib/jsextensions/binaryfile.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -214,10 +215,7 @@ QVariantList BinaryFile::read(qint64 size) .arg(m_file->fileName(), m_file->errorString())); } - QVariantList data; - std::for_each(bytes.constBegin(), bytes.constEnd(), [&data](const char &c) { - data.append(c); }); - return data; + return transformed(bytes, [](const char &c) { return c; }); } void BinaryFile::write(const QVariantList &data) @@ -225,9 +223,8 @@ void BinaryFile::write(const QVariantList &data) if (checkForClosed()) return; - QByteArray bytes; - std::for_each(data.constBegin(), data.constEnd(), [&bytes](const QVariant &v) { - bytes.append(char(v.toUInt() & 0xFF)); }); + const auto bytes = transformed(data, [](const QVariant &v) { + return char(v.toUInt() & 0xFF); }); const qint64 size = m_file->write(bytes); if (Q_UNLIKELY(size == -1)) { diff --git a/src/lib/corelib/jsextensions/pkgconfigjs.cpp b/src/lib/corelib/jsextensions/pkgconfigjs.cpp index 59aa3a970..76cc35084 100644 --- a/src/lib/corelib/jsextensions/pkgconfigjs.cpp +++ b/src/lib/corelib/jsextensions/pkgconfigjs.cpp @@ -180,11 +180,8 @@ PcPackage::VariablesMap variablesFromQVariantMap(const QVariantMap &map) std::vector stringListToStdVector(const QStringList &list) { - std::vector result; - result.reserve(list.size()); - for (const auto &string : list) - result.push_back(string.toStdString()); - return result; + return transformed>(list, [](const auto &s) { + return s.toStdString(); }); } } // namespace diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp index 53596bd1b..2d00b5991 100644 --- a/src/lib/corelib/jsextensions/utilitiesextension.cpp +++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp @@ -144,10 +144,9 @@ QScriptValue UtilitiesExtension::js_canonicalPlatform(QScriptContext *context, if (context->argumentCount() == 1 && value.isString()) { return engine->toScriptValue([&value] { - QStringList list; - for (const auto &s : HostOsInfo::canonicalOSIdentifiers(value.toString().toStdString())) - list.push_back(QString::fromStdString(s)); - return list; + const auto ids = HostOsInfo::canonicalOSIdentifiers(value.toString().toStdString()); + return transformed(ids, [](const auto &s) { + return QString::fromStdString(s); }); }()); } diff --git a/src/lib/corelib/language/moduleproviderloader.cpp b/src/lib/corelib/language/moduleproviderloader.cpp index 86246b0d6..309e01e2c 100644 --- a/src/lib/corelib/language/moduleproviderloader.cpp +++ b/src/lib/corelib/language/moduleproviderloader.cpp @@ -53,6 +53,7 @@ #include #include +#include #include #include @@ -79,8 +80,8 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr << "not found, checking for module providers"; const auto providerNames = getModuleProviders(productContext.item); if (providerNames) { - for (const auto &providerName : *providerNames) - providersToRun.push_back({providerName, ModuleProviderLookup::Named}); + providersToRun = transformed>(*providerNames, [](const auto &name) { + return Provider{name, ModuleProviderLookup::Named}; }); } else { for (QualifiedId providerName = moduleName; !providerName.empty(); providerName.pop_back()) { @@ -215,11 +216,8 @@ std::optional> ModuleProviderLoader::getModuleProviders const auto providers = m_evaluator->optionalStringListValue(item, StringConstants::qbsModuleProviders()); if (providers) { - std::vector result; - result.reserve(providers->size()); - for (const auto &provider : *providers) - result.push_back(QualifiedId::fromString(provider)); - return result; + return transformed>(*providers, [](const auto &provider) { + return QualifiedId::fromString(provider); }); } item = item->parent(); } diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 83f42e4e2..68430d175 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -646,8 +646,7 @@ static QualifiedIdSet propertiesToEvaluate(std::deque initialProps, const auto insertResult = allProperties.insert(prop); if (!insertResult.second) continue; - for (const QualifiedId &directDep : deps.value(prop)) - remainingProps.push_back(directDep); + transform(deps.value(prop), remainingProps, [](const QualifiedId &id) { return id; }); } return allProperties; } @@ -1103,8 +1102,11 @@ void ProjectResolver::resolveExport(Item *exportItem, ProjectContext *) return p1.fullName < p2.fullName; }; std::sort(exportedModule.m_properties.begin(), exportedModule.m_properties.end(), cmpFunc); - for (const Item * const child : exportItem->children()) - exportedModule.children.push_back(resolveExportChild(child, exportedModule)); + + transform(exportItem->children(), exportedModule.children, + [&exportedModule, this](const auto &child) { + return resolveExportChild(child, exportedModule); }); + for (const JsImport &jsImport : exportItem->file()->jsImports()) { if (usesImport(exportedModule, jsImport.scopeName)) { exportedModule.importStatements << getLineAtLocation(jsImport.location, @@ -1130,13 +1132,13 @@ std::unique_ptr ProjectResolver::resolveExportChild(const Item *it // the original type name. exportedItem->name = item->typeName(); - for (const Item * const child : item->children()) - exportedItem->children.push_back(resolveExportChild(child, module)); + transform(item->children(), exportedItem->children, [&module, this](const auto &child) { + return resolveExportChild(child, module); }); + setupExportedProperties(item, QString(), exportedItem->properties); return exportedItem; } - QString ProjectResolver::sourceCodeAsFunction(const JSSourceValueConstPtr &value, const PropertyDeclaration &decl) const { diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp index 8d2c6a2c5..0614f31f5 100644 --- a/src/lib/corelib/language/scriptengine.cpp +++ b/src/lib/corelib/language/scriptengine.cpp @@ -183,8 +183,8 @@ void ScriptEngine::import(const JsImport &jsImport, QScriptValue &targetObject) m_jsImportCache.insert(jsImport, jsImportValue); std::vector &filePathsForScriptValue = m_filePathsPerImport[jsImportValue.objectId()]; - for (const QString &fp : jsImport.filePaths) - filePathsForScriptValue.push_back(fp); + transform(jsImport.filePaths, filePathsForScriptValue, [](const auto &fp) { + return fp; }); } QScriptValue sv = newObject(); diff --git a/src/lib/corelib/language/value.cpp b/src/lib/corelib/language/value.cpp index 16326f521..5a4da2c8f 100644 --- a/src/lib/corelib/language/value.cpp +++ b/src/lib/corelib/language/value.cpp @@ -103,9 +103,9 @@ JSSourceValue::JSSourceValue(const JSSourceValue &other) : Value(other) m_baseValue = other.m_baseValue ? std::static_pointer_cast(other.m_baseValue->clone()) : JSSourceValuePtr(); - m_alternatives.reserve(other.m_alternatives.size()); - for (const Alternative &otherAlt : other.m_alternatives) - m_alternatives.push_back(otherAlt.clone()); + m_alternatives = transformed>( + other.m_alternatives, [](const auto &alternative) { + return alternative.clone(); }); } JSSourceValuePtr JSSourceValue::create(bool createdByPropertiesBlock) diff --git a/src/lib/corelib/tools/clangclinfo.cpp b/src/lib/corelib/tools/clangclinfo.cpp index 3aaee0786..a9a1cb449 100644 --- a/src/lib/corelib/tools/clangclinfo.cpp +++ b/src/lib/corelib/tools/clangclinfo.cpp @@ -147,9 +147,8 @@ std::vector ClangClInfo::installedCompilers( std::vector result; result.reserve(compilerPaths.size() + msvcs.size()); - - for (const auto &path: compilerPaths) - result.push_back({getToolchainInstallPath(QFileInfo(path)), vcvarsallPath}); + transform(compilerPaths, result, [&vcvarsallPath](const auto &path) { + return ClangClInfo{getToolchainInstallPath(QFileInfo(path)), vcvarsallPath}; }); // If we didn't find custom LLVM installation, try to find if it's installed with Visual Studio for (const auto &msvc : msvcs) { diff --git a/src/lib/corelib/tools/jsonhelper.h b/src/lib/corelib/tools/jsonhelper.h index e695bd465..cb911c45a 100644 --- a/src/lib/corelib/tools/jsonhelper.h +++ b/src/lib/corelib/tools/jsonhelper.h @@ -40,6 +40,8 @@ #ifndef QBS_JSON_HELPER_H #define QBS_JSON_HELPER_H +#include + #include #include #include @@ -60,10 +62,7 @@ template<> inline QString fromJson(const QJsonValue &v) { return v.toString(); } template<> inline QStringList fromJson(const QJsonValue &v) { const QJsonArray &jsonList = v.toArray(); - QStringList stringList; - std::transform(jsonList.begin(), jsonList.end(), std::back_inserter(stringList), - [](const auto &v) { return v.toString(); }); - return stringList; + return transformed(jsonList, [](const auto &v) { return v.toString(); }); } template<> inline QVariantMap fromJson(const QJsonValue &v) { return v.toObject().toVariantMap(); } template<> inline QProcessEnvironment fromJson(const QJsonValue &v) diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp index 58cd458c3..418a76ba1 100644 --- a/src/lib/corelib/tools/msvcinfo.cpp +++ b/src/lib/corelib/tools/msvcinfo.cpp @@ -669,12 +669,12 @@ std::vector MSVC::installedCompilers(Logger &logger) } const auto ais = findSupportedArchitectures(msvc); - for (const MSVCArchInfo &ai : ais) { + transform(ais, msvcs, [&msvc](const auto &ai) { MSVC specificMSVC = msvc; specificMSVC.architecture = ai.arch; specificMSVC.binPath = ai.binPath; - msvcs.push_back(specificMSVC); - } + return specificMSVC; + }); } return msvcs; } diff --git a/src/lib/corelib/tools/set.h b/src/lib/corelib/tools/set.h index ddd38b6f3..461175615 100644 --- a/src/lib/corelib/tools/set.h +++ b/src/lib/corelib/tools/set.h @@ -292,11 +292,7 @@ template void Set::store(PersistentPool &pool) const #ifdef QT_CORE_LIB template QStringList Set::toStringList() const { - QStringList sl; - sl.reserve(int(size())); - std::transform(cbegin(), cend(), std::back_inserter(sl), - [this](const T &e) { return toString(e); }); - return sl; + return transformed(*this, [this](const T &e) { return toString(e); }); } template QString Set::toString() const diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h index 0a19957b5..104f88aaf 100644 --- a/src/lib/corelib/tools/stlutils.h +++ b/src/lib/corelib/tools/stlutils.h @@ -54,6 +54,28 @@ C sorted(const C &container) return result; } +template +To transformed(const From &from, Op op) +{ + To to; + to.reserve(from.size()); + std::transform(std::cbegin(from), std::cend(from), std::back_inserter(to), std::move(op)); + return to; +} + +template +void transform(C &&container, Op op) +{ + std::transform(std::begin(container), std::end(container), std::begin(container), + std::move(op)); +} + +template +void transform(const From &from, To &&to, Op op) +{ + std::transform(std::cbegin(from), std::cend(from), std::back_inserter(to), std::move(op)); +} + template bool contains(const C &container, const T &v) { -- cgit v1.2.3