diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index 22daddeaa86..48826a6e6e0 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -90,12 +90,6 @@ QVariantMap VersionUpgrader::renameKeys(const QList &changes, QVariantMa class SettingsAccessorPrivate { public: - ~SettingsAccessorPrivate() - { - qDeleteAll(m_upgraders); - delete m_writer; - } - // The relevant data from the settings currently in use. class Settings { @@ -106,20 +100,21 @@ public: FileName path; }; - int firstVersion() const { return m_upgraders.isEmpty() ? -1 : m_upgraders.first()->version(); } - int lastVersion() const { return m_upgraders.isEmpty() ? -1 : m_upgraders.last()->version(); } + int firstVersion() const { return m_upgraders.size() == 0 ? -1 : m_upgraders.front()->version(); } + int lastVersion() const { return m_upgraders.size() == 0 ? -1 : m_upgraders.back()->version(); } int currentVersion() const { return lastVersion() + 1; } VersionUpgrader *upgrader(const int version) const { - int pos = version - firstVersion(); - if (pos >= 0 && pos < m_upgraders.count()) - return m_upgraders.at(pos); - return 0; + QTC_ASSERT(version >= 0 && firstVersion() >= 0, return nullptr); + const int pos = version - firstVersion(); + if (pos >= 0 && pos < static_cast(m_upgraders.size())) + return m_upgraders[static_cast(pos)].get(); + return nullptr; } Settings bestSettings(const SettingsAccessor *accessor, const FileNameList &pathList); - QList m_upgraders; - PersistentSettingsWriter *m_writer = nullptr; + std::vector> m_upgraders; + std::unique_ptr m_writer; QByteArray m_settingsId; QString m_displayName; @@ -573,27 +568,21 @@ bool SettingsAccessor::saveSettings(const QVariantMap &map, QWidget *parent) con QVariantMap data = prepareToSaveSettings(map); FileName path = FileName::fromString(defaultFileName(d->m_userSuffix)); - if (!d->m_writer || d->m_writer->fileName() != path) { - delete d->m_writer; - d->m_writer = new PersistentSettingsWriter(path, QLatin1String("QtCreatorProject")); - } + if (!d->m_writer || d->m_writer->fileName() != path) + d->m_writer = std::make_unique(path, "QtCreatorProject"); return d->m_writer->save(data, parent); } -bool SettingsAccessor::addVersionUpgrader(VersionUpgrader *upgrader) +bool SettingsAccessor::addVersionUpgrader(std::unique_ptr upgrader) { - QTC_ASSERT(upgrader, return false); - int version = upgrader->version(); + QTC_ASSERT(upgrader.get(), return false); + const int version = upgrader->version(); QTC_ASSERT(version >= 0, return false); - if (d->m_upgraders.isEmpty() || d->currentVersion() == version) - d->m_upgraders.append(upgrader); - else if (d->firstVersion() - 1 == version) - d->m_upgraders.prepend(upgrader); - else - QTC_ASSERT(false, return false); // Upgrader was added out of sequence or twice - + const bool haveUpgraders = d->m_upgraders.size() != 0; + QTC_ASSERT(!haveUpgraders || d->currentVersion() == version, return false); + d->m_upgraders.push_back(std::move(upgrader)); return true; } diff --git a/src/plugins/projectexplorer/settingsaccessor.h b/src/plugins/projectexplorer/settingsaccessor.h index 395044744b9..65652c27a02 100644 --- a/src/plugins/projectexplorer/settingsaccessor.h +++ b/src/plugins/projectexplorer/settingsaccessor.h @@ -71,7 +71,7 @@ public: int currentVersion() const; int firstSupportedVersion() const; - bool addVersionUpgrader(VersionUpgrader *upgrader); // takes ownership of upgrader + bool addVersionUpgrader(std::unique_ptr upgrader); enum ProceedInfo { Continue, DiscardAndContinue }; typedef QHash ButtonMap; diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 3f70e9a2953..36ae760ce31 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -366,23 +366,23 @@ UserFileAccessor::UserFileAccessor(Project *project) : setDisplayName(project->displayName()); // Register Upgraders: - addVersionUpgrader(new UserFileVersion1Upgrader(this)); - addVersionUpgrader(new UserFileVersion2Upgrader); - addVersionUpgrader(new UserFileVersion3Upgrader); - addVersionUpgrader(new UserFileVersion4Upgrader); - addVersionUpgrader(new UserFileVersion5Upgrader); - addVersionUpgrader(new UserFileVersion6Upgrader); - addVersionUpgrader(new UserFileVersion7Upgrader); - addVersionUpgrader(new UserFileVersion8Upgrader); - addVersionUpgrader(new UserFileVersion9Upgrader); - addVersionUpgrader(new UserFileVersion10Upgrader); - addVersionUpgrader(new UserFileVersion11Upgrader(this)); - addVersionUpgrader(new UserFileVersion12Upgrader); - addVersionUpgrader(new UserFileVersion13Upgrader); - addVersionUpgrader(new UserFileVersion14Upgrader); - addVersionUpgrader(new UserFileVersion15Upgrader); - addVersionUpgrader(new UserFileVersion16Upgrader); - addVersionUpgrader(new UserFileVersion17Upgrader); + addVersionUpgrader(std::make_unique(this)); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique(this)); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); } Project *UserFileAccessor::project() const