From 793452de89fc075ff8c211d1683ce2edabb43b20 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Tue, 27 Jan 2026 21:40:56 +0800 Subject: [PATCH] refactor: fix most compiler and clazy warnings These changes also provide a slight performance boost (about 6%). Signed-off-by: ComixHe --- apps/app-identifier/src/main.cpp | 2 +- apps/app-launch-helper/src/main.cpp | 85 +++++++++++-------------- apps/dde-autostart/main.cpp | 4 +- src/compatibilitymanager.cpp | 16 +++-- src/dbus/applicationmanager1service.cpp | 33 +++++----- src/dbus/applicationservice.cpp | 47 +++++++------- src/dbus/jobmanager1service.h | 21 +++--- src/dbus/mimemanager1service.cpp | 2 +- src/dbus/prelaunchsplashhelper.cpp | 2 +- src/desktopentry.cpp | 2 +- src/desktopfileparser.cpp | 32 +++++----- src/global.h | 29 ++++++--- src/iniParser.h | 18 +++--- src/launchoptions.cpp | 4 +- 14 files changed, 151 insertions(+), 146 deletions(-) diff --git a/apps/app-identifier/src/main.cpp b/apps/app-identifier/src/main.cpp index 737004be..7e228263 100644 --- a/apps/app-identifier/src/main.cpp +++ b/apps/app-identifier/src/main.cpp @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) return; } - auto appID = reply.arguments().first().toString(); + auto appID = reply.arguments().constFirst().toString(); if (!appID.isEmpty()) { qInfo() << "The capacity of process" << pid << "is:" << appID; return; diff --git a/apps/app-launch-helper/src/main.cpp b/apps/app-launch-helper/src/main.cpp index 1f739c49..34451334 100644 --- a/apps/app-launch-helper/src/main.cpp +++ b/apps/app-launch-helper/src/main.cpp @@ -2,32 +2,26 @@ // // SPDX-License-Identifier: LGPL-3.0-or-later -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "constant.h" #include "types.h" #include "variantValue.h" +#include +#include +#include +#include +#include +#include +#include namespace { -ExitCode fromString(const std::string &str) +ExitCode fromString(std::string_view str) { if (str == "done") { return ExitCode::Done; } - if (str == "canceled" or str == "timeout" or str == "failed" or str == "dependency" or str == "skipped") { + if (str == "canceled" || str == "timeout" || str == "failed" || str == "dependency" || str == "skipped") { return ExitCode::SystemdError; } @@ -44,10 +38,10 @@ ExitCode fromString(const std::string &str) ExitCode fromString(const char *str) { - if (!str) { + if (str == nullptr) { return ExitCode::Waiting; } - std::string tmp{str}; + const std::string tmp{str}; return fromString(tmp); } @@ -62,7 +56,7 @@ ExitCode fromString(const char *str) int processExecStart(msg_ptr &msg, const std::deque &execArgs) { - int ret; + int ret{0}; if (ret = sd_bus_message_open_container(msg, SD_BUS_TYPE_STRUCT, "sv"); ret < 0) { sd_journal_perror("open struct of ExecStart failed."); @@ -99,7 +93,7 @@ int processExecStart(msg_ptr &msg, const std::deque &execArgs) return ret; } - for (auto execArg : execArgs) { + for (const auto &execArg : execArgs) { if (ret = sd_bus_message_append(msg, "s", execArg.data()); ret < 0) { sd_journal_perror("append args of execStart failed."); return ret; @@ -147,16 +141,16 @@ DBusValueType getPropType(std::string_view key) {"WorkingDirectory", DBusValueType::String}, {"ExecSearchPath", DBusValueType::ArrayOfString}}; - if (auto it = map.find(key); it != map.cend()) { + if (const auto it = map.find(key); it != map.cend()) { return it->second; } return DBusValueType::String; // fallback to string } -int appendPropValue(msg_ptr &msg, DBusValueType type, const std::list &value) +int appendPropValue(msg_ptr &msg, DBusValueType type, const std::vector &value) { - int ret; + int ret{0}; auto handler = creatValueHandler(msg, type); if (handler == nullptr) { @@ -184,47 +178,42 @@ int appendPropValue(msg_ptr &msg, DBusValueType type, const std::list> &props) +int processKVPair(msg_ptr &msg, std::unordered_map> &props) { - int ret; + int ret{0}; if (!props.empty()) { - for (auto [key, value] : props) { - const std::list *valuePtr = &value; - std::list normalizedValue; - std::vector normalizedStorage; - + for (auto &[key, value] : props) { if (key == "ExecSearchPath") { + std::vector normalizedValue; for (const auto &v : value) { - std::filesystem::path p{std::string{v}}; + const std::filesystem::path p{std::string{v}}; if (!p.is_absolute()) { sd_journal_print(LOG_INFO, "ExecSearchPath ignoring relative path: %s", std::string{v}.c_str()); continue; } - normalizedStorage.emplace_back(p.lexically_normal().string()); + normalizedValue.emplace_back(p.lexically_normal().string()); } - normalizedValue.assign(normalizedStorage.begin(), normalizedStorage.end()); - if (normalizedValue.empty()) { sd_journal_print(LOG_WARNING, "ExecSearchPath normalized to empty, skipping property"); continue; } - valuePtr = &normalizedValue; + value = std::move(normalizedValue); } - std::string keyStr{key}; + const std::string keyStr{key}; if (ret = sd_bus_message_open_container(msg, SD_BUS_TYPE_STRUCT, "sv"); ret < 0) { sd_journal_perror("open struct of properties failed."); return ret; } - if (ret = sd_bus_message_append(msg, "s", keyStr.data()); ret < 0) { + if (ret = sd_bus_message_append(msg, "s", keyStr.c_str()); ret < 0) { sd_journal_perror("append key of property failed."); return ret; } - if (ret = appendPropValue(msg, getPropType(key), *valuePtr); ret < 0) { + if (ret = appendPropValue(msg, getPropType(key), value); ret < 0) { sd_journal_perror("append value of property failed."); return ret; } @@ -241,7 +230,7 @@ int processKVPair(msg_ptr &msg, const std::map cmdLines) { std::string serviceName{"internalError"}; - std::map> props; + std::unordered_map> props; while (!cmdLines.empty()) { // NOTE: avoid stl exception auto str = cmdLines.front(); @@ -280,7 +269,7 @@ std::string cmdParse(msg_ptr &msg, std::deque cmdLines) continue; } - props[key].push_back(kvStr.substr(splitIndex + 1)); + props[key].emplace_back(kvStr.substr(splitIndex + 1)); cmdLines.pop_front(); continue; } @@ -290,7 +279,7 @@ std::string cmdParse(msg_ptr &msg, std::deque cmdLines) } // Processing of the binary file and its parameters that am want to launch - auto &execArgs = cmdLines; + const auto &execArgs = cmdLines; if (execArgs.empty()) { sd_journal_print(LOG_ERR, "param exec is empty."); serviceName = "invalidInput"; @@ -302,8 +291,8 @@ std::string cmdParse(msg_ptr &msg, std::deque cmdLines) return serviceName; } - int ret; - if (ret = sd_bus_message_append(msg, "s", props["unitName"].front().data()); ret < 0) { // unitName + int ret{0}; + if (ret = sd_bus_message_append(msg, "s", props["unitName"].front().c_str()); ret < 0) { // unitName sd_journal_perror("append unitName failed."); return serviceName; } @@ -368,7 +357,7 @@ std::string cmdParse(msg_ptr &msg, std::deque cmdLines) int jobRemovedReceiver(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { - int ret; + int ret{0}; if (ret = sd_bus_error_is_set(ret_error); ret != 0) { sd_journal_print(LOG_ERR, "JobRemoved error: [%s,%s]", ret_error->name, ret_error->message); } else { @@ -385,7 +374,7 @@ int jobRemovedReceiver(sd_bus_message *m, void *userdata, sd_bus_error *ret_erro } } - if (ret_error and ret_error->_need_free) { + if (ret_error != nullptr && ret_error->_need_free != 0) { sd_bus_error_free(ret_error); } @@ -394,7 +383,7 @@ int jobRemovedReceiver(sd_bus_message *m, void *userdata, sd_bus_error *ret_erro int process_dbus_message(sd_bus *bus) { - int ret; + int ret{0}; ret = sd_bus_process(bus, nullptr); if (ret < 0) { sd_journal_print(LOG_ERR, "event loop error."); @@ -422,7 +411,7 @@ int main(int argc, const char *argv[]) sd_bus_message *msg{nullptr}; sd_bus *bus{nullptr}; std::string serviceId; - int ret; + int ret{0}; if (ret = sd_bus_open_user(&bus); ret < 0) { sd_journal_perror("Failed to connect to user bus."); @@ -476,12 +465,12 @@ int main(int argc, const char *argv[]) sd_bus_message_unref(reply); while (true) { // wait for jobRemoved - int ret = process_dbus_message(bus); + const auto ret = process_dbus_message(bus); if (ret < 0) { releaseRes(error, msg, bus, ExitCode::InternalError); } - if (resultData.removedFlag) { + if (resultData.removedFlag != 0) { break; } } diff --git a/apps/dde-autostart/main.cpp b/apps/dde-autostart/main.cpp index 2e609391..b06cb058 100644 --- a/apps/dde-autostart/main.cpp +++ b/apps/dde-autostart/main.cpp @@ -110,7 +110,7 @@ int main(int argc, char *argv[]) auto reply = QDBusConnection::sessionBus().call(msg); if (reply.type() == QDBusMessage::ReplyMessage) { - if (reply.arguments().first().toBool()) { + if (reply.arguments().constFirst().toBool()) { launchSlot(); return 0; } @@ -119,6 +119,6 @@ int main(int argc, char *argv[]) } // Wait for signal - return app.exec(); + return QCoreApplication::exec(); } } diff --git a/src/compatibilitymanager.cpp b/src/compatibilitymanager.cpp index d2bb4fe9..fa4a04bb 100644 --- a/src/compatibilitymanager.cpp +++ b/src/compatibilitymanager.cpp @@ -124,17 +124,19 @@ ParserError CompatibilityManager::parse(QFile &file) noexcept{ } auto obj = json.object(); - for (const QString &desktopId : obj.keys()) { - auto existDesktopId = m_compatibilityConfig.find(desktopId); - if(existDesktopId != m_compatibilityConfig.end()){ - qWarning() << "the desktop id : "<(ret.arguments().first().value().variant())); + envToPath(qdbus_cast(ret.arguments().constFirst().value().variant())); auto sysBus = QDBusConnection::systemBus(); if (!sysBus.connect("org.desktopspec.ApplicationUpdateNotifier1", @@ -232,8 +232,6 @@ void ApplicationManager1Service::removeInstanceFromApplication(const QString &un { auto info = processUnitName(unitName); auto appId = std::move(info.applicationID); - auto launcher = std::move(info.Launcher); - auto instanceId = std::move(info.instanceID); if (appId.isEmpty()) { return; @@ -325,10 +323,10 @@ void ApplicationManager1Service::scanInstances() noexcept return; } - auto v = result.arguments().first(); + auto v = result.arguments().constFirst(); QList units; v.value() >> units; - for (const auto &unit : units) { + for (const auto &unit : std::as_const(units)) { this->addInstanceToApplication(unit.name, unit.objectPath); } } @@ -460,8 +458,8 @@ void ApplicationManager1Service::loadHooks() noexcept QList ApplicationManager1Service::list() const { QList paths; - for (const auto &appId : m_applicationList.keys()) - paths << QDBusObjectPath{getObjectPathFromAppId(appId)}; + for (auto it = m_applicationList.constBegin(); it != m_applicationList.constEnd(); ++it) + paths << QDBusObjectPath{getObjectPathFromAppId(it.key())}; return paths; } @@ -502,7 +500,7 @@ QSharedPointer ApplicationManager1Service::addApplication(De void ApplicationManager1Service::removeOneApplication(const QString &appId) noexcept { auto objectPath = QDBusObjectPath{getObjectPathFromAppId(appId)}; - if (auto it = m_applicationList.find(appId); it != m_applicationList.cend()) { + if (auto it = m_applicationList.constFind(appId); it != m_applicationList.cend()) { emit InterfacesRemoved(objectPath, getChildInterfacesFromObject(it->data())); if (auto ptr = m_storage.lock(); ptr) { if (!ptr->deleteApplication(appId)) { @@ -519,8 +517,8 @@ void ApplicationManager1Service::removeOneApplication(const QString &appId) noex void ApplicationManager1Service::removeAllApplication() noexcept { - for (const auto &appId : m_applicationList.keys()) { - removeOneApplication(appId); + for (auto it = m_applicationList.constBegin(); it != m_applicationList.constEnd(); ++it) { + removeOneApplication(it.key()); } } @@ -642,7 +640,7 @@ void ApplicationManager1Service::doReloadApplications() {"*.desktop"}, QDir::Name | QDir::DirsLast); - for (const auto &appId : appIds) { + for (const auto &appId : std::as_const(appIds)) { removeOneApplication(appId); } @@ -843,7 +841,7 @@ QDBusObjectPath ApplicationManager1Service::executeCommand(const QString &progra QString randomComponent = QUuid::createUuid().toString(QUuid::Id128).mid(1, 8); // Construct systemd unit name according to specification - QString unitName = QString{"app-DDE-tmp.%1.%2@%3.service"}.arg(type).arg(actualRunId).arg(randomComponent); + QString unitName = QString{"app-DDE-tmp.%1.%2@%3.service"}.arg(type, actualRunId, randomComponent); // Prepare the command line QStringList commandLine; @@ -853,11 +851,12 @@ QDBusObjectPath ApplicationManager1Service::executeCommand(const QString &progra // Add system environment variables QStringList environment; QProcessEnvironment systemEnv = QProcessEnvironment::systemEnvironment(); - for (const QString &key : systemEnv.keys()) { - environment << QString{"%1=%2"}.arg(key).arg(systemEnv.value(key)); + const auto &keys = systemEnv.keys(); + for (const QString &key : std::as_const(keys)) { + environment << QString{"%1=%2"}.arg(key, systemEnv.value(key)); } for (auto it = envVars.constBegin(); it != envVars.constEnd(); ++it) { - environment << QString{"%1=%2"}.arg(it.key()).arg(it.value()); + environment << QString{"%1=%2"}.arg(it.key(), it.value()); } QList properties; @@ -870,7 +869,7 @@ QDBusObjectPath ApplicationManager1Service::executeCommand(const QString &progra execCmd.path = program; // 二进制路径 execCmd.args = commandLine; // 完整参数列表 (argv) execCmd.unclean = false; // 是否忽略非零返回值 - + QList execStartList; execStartList << execCmd; properties.append({ "ExecStart", QDBusVariant(QVariant::fromValue(execStartList)) }); diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 81341173..b615b46f 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -56,11 +56,11 @@ void ApplicationService::appendExtraEnvironments(QVariantMap &runtimeOptions) co if (!env.isEmpty()) envs.append(env); - if (auto it = runtimeOptions.find("env"); it != runtimeOptions.cend()) { + if (auto it = runtimeOptions.find("env"); it != runtimeOptions.end()) { appendEnvs(*it, envs); } - if (auto it = runtimeOptions.find("unsetEnv"); it != runtimeOptions.cend()) { + if (auto it = runtimeOptions.find("unsetEnv"); it != runtimeOptions.end()) { appendEnvs(*it, unsetEnvs); } @@ -86,10 +86,9 @@ void ApplicationService::appendExtraEnvironments(QVariantMap &runtimeOptions) co void ApplicationService::processCompatibility(const QString &action, QVariantMap &options, QString &execStr) { - QString tempExecStr = execStr; auto compatibilityManager = parent()->getCompatibilityManager(); - auto getExec = [action, compatibilityManager](QString desktopID) -> QString { + auto getExec = [action, compatibilityManager](const QString& desktopID) -> QString { std::optional execValue; if (!action.isEmpty()) { const auto &actionHeader = QString{"%1%2"}.arg(DesktopFileActionKey, action); @@ -99,7 +98,7 @@ void ApplicationService::processCompatibility(const QString &action, QVariantMap } if (!execValue.has_value() || execValue->isEmpty()) { - return QString(); + return {}; } return execValue.value(); }; @@ -107,7 +106,7 @@ void ApplicationService::processCompatibility(const QString &action, QVariantMap auto addEnv = [this, &options, compatibilityManager]() { auto envValue = compatibilityManager->getEnv(m_desktopSource.desktopId(), DesktopFileEntryKey); if (!envValue.isEmpty()) { - if (auto it = options.find("env"); it != options.cend()) { + if (auto it = options.find("env"); it != options.end()) { auto value = it->toStringList(); value.append(envValue); options.insert("env", value); @@ -123,8 +122,6 @@ void ApplicationService::processCompatibility(const QString &action, QVariantMap addEnv(); qInfo() << "get compatibility : " << m_desktopSource.desktopId() << " Exec : " << execStr; } - - return; } ApplicationService::ApplicationService(DesktopFile source, @@ -575,7 +572,7 @@ PropMap ApplicationService::actionName() const noexcept const auto &actionList = actions(); for (const auto &action : actionList) { - auto rawActionKey = DesktopFileActionKey % action; + const QString rawActionKey = DesktopFileActionKey % action; auto value = m_entry->value(rawActionKey, "Name"); if (!value.has_value()) { continue; @@ -617,8 +614,8 @@ QStringMap ApplicationService::genericName() const noexcept QStringMap ApplicationService::icons() const noexcept { QStringMap ret; - auto actionList = actions(); - for (const auto &action : actionList) { + const auto &actionList = actions(); + for (const auto &action : std::as_const(actionList)) { auto actionKey = QString{action}.prepend(DesktopFileActionKey); auto value = m_entry->value(actionKey, "Icon"); if (!value.has_value()) { @@ -676,8 +673,8 @@ QStringMap ApplicationService::execs() const noexcept ret.insert(DesktopFileEntryKey, mainExec->value()); } - auto actionList = actions(); - for (const auto &action : actionList) { + const auto &actionList = actions(); + for (const auto &action : std::as_const(actionList)) { auto actionKey = QString{action}.prepend(DesktopFileActionKey); auto value = m_entry->value(actionKey, "Exec"); if (!value.has_value()) { @@ -827,7 +824,7 @@ void ApplicationService::setAutoStart(bool autostart) noexcept return; } - QDir startDir(getAutoStartDirs().first()); + const QDir startDir(getAutoStartDirs().constFirst()); if (!startDir.exists() && !startDir.mkpath(startDir.path())) { qWarning() << "mkpath " << startDir.path() << "failed"; safe_sendErrorReply(QDBusError::InternalError); @@ -903,7 +900,7 @@ QStringList ApplicationService::mimeTypes() const noexcept tmp.added.removeDuplicates(); tmp.removed.removeDuplicates(); - for (const auto &it : tmp.removed) { + for (const auto &it : std::as_const(tmp.removed)) { tmp.added.removeOne(it); } @@ -935,10 +932,10 @@ void ApplicationService::setMimeTypes(const QStringList &value) noexcept const auto &list = userInfo->appsList().rbegin(); const auto &appId = id(); - for (const auto &add : newAdds) { + for (const auto &add : std::as_const(newAdds)) { list->addAssociation(add, appId); } - for (const auto &remove : newRemoved) { + for (const auto &remove :std::as_const(newRemoved)) { list->removeAssociation(remove, appId); } @@ -984,7 +981,7 @@ bool ApplicationService::addOneInstance(const QString &instanceId, void ApplicationService::removeOneInstance(const QDBusObjectPath &instance) noexcept { - if (auto it = m_Instances.find(instance); it != m_Instances.cend()) { + if (auto it = m_Instances.constFind(instance); it != m_Instances.cend()) { emit InterfacesRemoved(instance, getChildInterfacesFromObject(it->data())); unregisterObjectFromDBus(instance.path()); m_Instances.remove(instance); @@ -993,14 +990,15 @@ void ApplicationService::removeOneInstance(const QDBusObjectPath &instance) noex void ApplicationService::removeAllInstance() noexcept { - for (const auto &instance : m_Instances.keys()) { - removeOneInstance(instance); + for (auto it = m_Instances.constBegin(); it != m_Instances.constEnd(); ++it) { + removeOneInstance(it.key()); } } void ApplicationService::detachAllInstance() noexcept { - for (auto &instance : m_Instances.values()) { + for (auto it = m_Instances.constBegin(); it != m_Instances.constEnd(); ++it) { + const auto& instance = it.value(); orphanedInstances.append(instance); instance->setProperty("Orphaned", true); } @@ -1276,12 +1274,13 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, QStringList fiel void ApplicationService::unescapeEens(QVariantMap &options) noexcept { - if (options.find("env") == options.end()) { + if (options.constFind("env") == options.cend()) { return; } QStringList result; - auto envs = options["env"]; - for (const QString &var : envs.toStringList()) { + const auto &envsVar = options["env"]; + auto envs = envsVar.toStringList(); + for (const auto &var : std::as_const(envs)) { if (var.startsWith(u"DSG_APP_ID="_s)) { result << var; continue; diff --git a/src/dbus/jobmanager1service.h b/src/dbus/jobmanager1service.h index 0a7051a0..ee24e972 100644 --- a/src/dbus/jobmanager1service.h +++ b/src/dbus/jobmanager1service.h @@ -5,18 +5,18 @@ #ifndef JOBMANAGER1SERVICE_H #define JOBMANAGER1SERVICE_H -#include -#include +#include "global.h" +#include "dbus/jobadaptor.h" +#include #include -#include +#include +#include #include #include -#include -#include -#include +#include +#include #include -#include "global.h" -#include "dbus/jobadaptor.h" +#include class ApplicationManager1Service; @@ -90,13 +90,14 @@ class JobManager1Service final : public QObject } QString result{job->status()}; - for (const auto &val : future.result()) { + const auto &vals = future.result(); + for (const auto &val : vals) { if (val.metaType().id() == QMetaType::fromType().id()) { result = "failed"; } break; } - emit JobRemoved(path, result, future.result()); + emit JobRemoved(path, result, vals); return value; }; diff --git a/src/dbus/mimemanager1service.cpp b/src/dbus/mimemanager1service.cpp index 78358e6a..6afc8767 100644 --- a/src/dbus/mimemanager1service.cpp +++ b/src/dbus/mimemanager1service.cpp @@ -97,7 +97,7 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB qWarning() << "default application has been found:" << defaultAppId << " but we can't find corresponding application in ApplicationManagerService."; } else { - application = apps.keys().first(); + application = apps.constBegin().key(); } return type; diff --git a/src/dbus/prelaunchsplashhelper.cpp b/src/dbus/prelaunchsplashhelper.cpp index e44969e6..629c7b76 100644 --- a/src/dbus/prelaunchsplashhelper.cpp +++ b/src/dbus/prelaunchsplashhelper.cpp @@ -72,7 +72,7 @@ wl_buffer *PrelaunchSplashHelper::buildIconBuffer(const QIcon &icon) QSize iconSize(0, 0); // Pick the size closest to 128x128, prefer larger sizes - for (const QSize &size : sizes) { + for (const QSize &size : std::as_const(sizes)) { if (size.width() == 128) { iconSize = size; break; diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp index 953d70b8..cb6b293e 100644 --- a/src/desktopentry.cpp +++ b/src/desktopentry.cpp @@ -157,7 +157,7 @@ std::optional DesktopFile::searchDesktopFileById(const QString &app auto XDGDataDirs = getDesktopFileDirs(); constexpr auto desktopSuffix = u8".desktop"; - for (const auto &dir : XDGDataDirs) { + for (const auto &dir : std::as_const(XDGDataDirs)) { auto app = QFileInfo{dir + QDir::separator() + appId + desktopSuffix}; while (!app.exists()) { auto filePath = app.absoluteFilePath(); diff --git a/src/desktopfileparser.cpp b/src/desktopfileparser.cpp index d131fa31..4c076ab5 100644 --- a/src/desktopfileparser.cpp +++ b/src/desktopfileparser.cpp @@ -15,18 +15,18 @@ Q_LOGGING_CATEGORY(logDesktopFileParser, "am.desktopfileparser") namespace { bool isInvalidLocaleString(const QString &str) noexcept { - constexpr auto Language = R"((?:[a-z]+))"; // language of locale postfix. eg.(en, zh) - constexpr auto Country = R"((?:_[A-Z]+))"; // country of locale postfix. eg.(US, CN) - constexpr auto Encoding = R"((?:\.[0-9A-Z-]+))"; // encoding of locale postfix. eg.(UFT-8) - constexpr auto Modifier = R"((?:@[a-zA-Z=;]+))"; // modifier of locale postfix. eg.(euro;collation=traditional) - const static auto validKey = QString(R"(^%1%2?%3?%4?$)").arg(Language, Country, Encoding, Modifier); // example: https://regex101.com/r/hylOay/2 - static const QRegularExpression _re = []() -> QRegularExpression { - QRegularExpression tmp{validKey}; + static const auto _re = [] { + constexpr auto Language = R"((?:[a-z]+))"; // language of locale postfix. eg.(en, zh) + constexpr auto Country = R"((?:_[A-Z]+))"; // country of locale postfix. eg.(US, CN) + constexpr auto Encoding = R"((?:\.[0-9A-Z-]+))"; // encoding of locale postfix. eg.(UFT-8) + constexpr auto Modifier = R"((?:@[a-zA-Z=;]+))"; // modifier of locale postfix. eg.(euro;collation=traditional) + + QRegularExpression tmp{QStringLiteral(R"(^%1%2?%3?%4?$)").arg(Language, Country, Encoding, Modifier)}; tmp.optimize(); return tmp; }(); - thread_local const auto re = _re; + const auto re = _re; return re.match(str).hasMatch(); } @@ -52,10 +52,11 @@ ParserError DesktopFileParser::parse(Groups &ret) noexcept continue; } - if (groups.keys().first() != DesktopFileEntryKey) { + + if (groups.cbegin().key() != DesktopFileEntryKey) { qCWarning(logDesktopFileParser) << "There should be nothing preceding " - "'Desktop Entry' group in the desktop entry file " - "but possibly one or more comments."; + "'Desktop Entry' group in the desktop entry file " + "but possibly one or more comments."; return ParserError::InvalidFormat; } } @@ -139,13 +140,13 @@ ParserError DesktopFileParser::addEntry(typename Groups::iterator &group) noexce localeStr = keyStr.sliced(localeBegin + 1, localeEnd - localeBegin - 1); // strip '[' and ']' } - static const QRegularExpression _re = []() { - QRegularExpression tmp{"R([^A-Za-z0-9-])"}; + static const auto _re = [] { + QRegularExpression tmp{QStringLiteral(R"([^A-Za-z0-9-])")}; tmp.optimize(); return tmp; }(); // NOTE: https://stackoverflow.com/a/25583104 - thread_local const QRegularExpression re = _re; + const auto re = _re; if (re.match(key).hasMatch()) { qCDebug(logDesktopFileParser) << "invalid key name:" << key << ", skip this line:" << line; return ParserError::NoError; @@ -220,7 +221,8 @@ QString toString(const DesktopFileParser::Groups &map) }; groupToString(DesktopFileEntryKey); - for (const auto &groupName : map.keys()) { + for (auto it = map.cbegin(); it != map.cend(); ++it) { + const auto& groupName = it.key(); if (groupName == DesktopFileEntryKey) { continue; } diff --git a/src/global.h b/src/global.h index dfdbc166..bde95d9a 100644 --- a/src/global.h +++ b/src/global.h @@ -384,14 +384,20 @@ inline QString escapeToObjectPath(const QString &str) if (str.isEmpty()) { return "_"; } - auto ret = str; - QRegularExpression re{R"([^a-zA-Z0-9])"}; + + const static auto _re = [] { + QRegularExpression tmp{QStringLiteral(R"([^a-zA-Z0-9])")}; + tmp.optimize(); + return tmp; + }(); + const auto re = _re; + auto matcher = re.globalMatch(ret); while (matcher.hasNext()) { auto replaceList = matcher.next().capturedTexts(); replaceList.removeDuplicates(); - for (const auto &c : replaceList) { + for (const auto &c : std::as_const(replaceList)) { auto hexStr = QString::number(static_cast(c.front().toLatin1()), 16); ret.replace(c, QString{R"(_%1)"}.arg(hexStr)); } @@ -419,14 +425,21 @@ inline QString escapeApplicationId(const QString &id) } auto ret = id; - QRegularExpression re{R"([^a-zA-Z0-9])"}; + + static const auto _re = [] { + QRegularExpression tmp{QStringLiteral(R"([^a-zA-Z0-9])")}; + tmp.optimize(); + return tmp; + }(); + const auto re = _re; + auto matcher = re.globalMatch(ret); while (matcher.hasNext()) { auto replaceList = matcher.next().capturedTexts(); replaceList.removeDuplicates(); - for (const auto &c : replaceList) { + for (const auto &c : std::as_const(replaceList)) { auto hexStr = QString::number(static_cast(c.front().toLatin1()), 16); - ret.replace(c, QString{R"(\x%1)"}.arg(hexStr)); + ret.replace(c, QStringLiteral(R"(\x%1)").arg(hexStr)); } } return ret; @@ -438,7 +451,7 @@ inline QString unescapeApplicationId(const QString &id) for (qsizetype i = 0; i < id.size(); ++i) { if (id[i] == '\\' and i + 3 < id.size()) { auto hexStr = id.sliced(i + 2, 2); - ret.replace(QString{R"(\x%1)"}.arg(hexStr), QChar::fromLatin1(hexStr.toUInt(nullptr, 16))); + ret.replace(QStringLiteral(R"(\x%1)").arg(hexStr), QChar::fromLatin1(hexStr.toUInt(nullptr, 16))); i += 3; } } @@ -672,7 +685,7 @@ inline QByteArray getCurrentSessionId() return {}; } - auto id = ret.arguments().first(); + const auto &id = ret.arguments().constFirst(); return id.value().variant().toByteArray(); } diff --git a/src/iniParser.h b/src/iniParser.h index 846c93f1..a011f94d 100644 --- a/src/iniParser.h +++ b/src/iniParser.h @@ -5,10 +5,10 @@ #ifndef INIPARSER_H #define INIPARSER_H -#include -#include #include #include +#include +#include enum class ParserError { NoError, @@ -53,19 +53,19 @@ class Parser inline bool hasNonAsciiAndControlCharacters(const QString &str) noexcept { - static const QRegularExpression _matchControlChars = []() { - QRegularExpression tmp{R"(\p{Cc})"}; + static const auto matchControlChars = [] { + QRegularExpression tmp{QStringLiteral(R"(\p{Cc})")}; tmp.optimize(); return tmp; }(); - thread_local const auto matchControlChars = _matchControlChars; - static const QRegularExpression _matchNonAsciiChars = []() { - QRegularExpression tmp{R"([^\x00-\x7f])"}; + + static const auto matchNonAsciiChars = [] { + QRegularExpression tmp{QStringLiteral(R"([^\x00-\x7f])")}; tmp.optimize(); return tmp; }(); - thread_local const auto matchNonAsciiChars = _matchNonAsciiChars; - return str.contains(matchControlChars) and str.contains(matchNonAsciiChars); + + return str.contains(matchControlChars) && str.contains(matchNonAsciiChars); } inline QDebug operator<<(QDebug debug, const ParserError &v) diff --git a/src/launchoptions.cpp b/src/launchoptions.cpp index 52b85caf..5496c558 100644 --- a/src/launchoptions.cpp +++ b/src/launchoptions.cpp @@ -121,8 +121,8 @@ QStringList StringListLaunchOption::generateCommandLine() const noexcept QStringList ret; const QString ok = optionKey(); - for (const auto &ov : list) { - ret << QString{"%1=%2"}.arg(ok).arg(ov); + for (const auto &ov : std::as_const(list)) { + ret << QString{"%1=%2"}.arg(ok, ov); } return ret;