From 7e1fb3aaaa8c10e02bc4c92fc4d74a77770c9a41 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 20 Dec 2022 09:08:09 +0100 Subject: [PATCH] Utils: Use std::variant for environment changes Change-Id: Ibdac141c5ef2dc2fa4c163e059f746dfb6f9625d Reviewed-by: Eike Ziller --- src/libs/utils/environment.cpp | 34 +++++++++++++++++----------------- src/libs/utils/environment.h | 30 ++++++++++++++++-------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 15b1271d30b..35b3333b4ce 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -395,58 +395,58 @@ std::optional EnvironmentProvider::provider(const QByteArra void EnvironmentChange::addSetValue(const QString &key, const QString &value) { - m_changeItems.append({Item::SetValue, QVariant::fromValue(QPair(key, value))}); + m_changeItems.append(Item{std::in_place_index_t(), QPair{key, value}}); } void EnvironmentChange::addUnsetValue(const QString &key) { - m_changeItems.append({Item::UnsetValue, key}); + m_changeItems.append(Item{std::in_place_index_t(), key}); } void EnvironmentChange::addPrependToPath(const FilePaths &values) { for (int i = values.size(); --i >= 0; ) { const FilePath value = values.at(i); - m_changeItems.append({Item::PrependToPath, value.toVariant()}); + m_changeItems.append(Item{std::in_place_index_t(), value}); } } void EnvironmentChange::addAppendToPath(const FilePaths &values) { for (const FilePath &value : values) - m_changeItems.append({Item::AppendToPath, value.toVariant()}); + m_changeItems.append(Item{std::in_place_index_t(), value}); } EnvironmentChange EnvironmentChange::fromFixedEnvironment(const Environment &fixedEnv) { EnvironmentChange change; - change.m_changeItems.append({Item::SetFixedEnvironment, QVariant::fromValue(fixedEnv)}); + change.m_changeItems.append(Item{std::in_place_index_t(), fixedEnv}); return change; } void EnvironmentChange::applyToEnvironment(Environment &env) const { for (const Item &item : m_changeItems) { - switch (item.type) { - case Item::SetSystemEnvironment: + switch (item.index()) { + case SetSystemEnvironment: env = Environment::systemEnvironment(); break; - case Item::SetFixedEnvironment: - env = item.data.value(); + case SetFixedEnvironment: + env = std::get(item); break; - case Item::SetValue: { - auto data = item.data.value>(); + case SetValue: { + const QPair data = std::get(item); env.set(data.first, data.second); break; } - case Item::UnsetValue: - env.unset(item.data.toString()); + case UnsetValue: + env.unset(std::get(item)); break; - case Item::PrependToPath: - env.prependOrSetPath(FilePath::fromVariant(item.data)); + case PrependToPath: + env.prependOrSetPath(std::get(item)); break; - case Item::AppendToPath: - env.appendOrSetPath(FilePath::fromVariant(item.data)); + case AppendToPath: + env.appendOrSetPath(std::get(item)); break; } } diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 65ecc8dbbeb..f86a32691f2 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -109,22 +109,24 @@ class QTCREATOR_UTILS_EXPORT EnvironmentChange final public: EnvironmentChange() = default; - class Item final - { - public: - enum Type { - SetSystemEnvironment, - SetFixedEnvironment, - SetValue, - UnsetValue, - PrependToPath, - AppendToPath, - }; - - Type type; - QVariant data; + enum Type { + SetSystemEnvironment, + SetFixedEnvironment, + SetValue, + UnsetValue, + PrependToPath, + AppendToPath, }; + using Item = std::variant< + std::monostate, // SetSystemEnvironment dummy + Environment, // SetFixedEnvironment + QPair, // SetValue + QString, // UnsetValue + FilePath, // PrependToPath + FilePath // AppendToPath + >; + static EnvironmentChange fromFixedEnvironment(const Environment &fixedEnv); void applyToEnvironment(Environment &) const;