Utils: Use std::variant for environment changes

Change-Id: Ibdac141c5ef2dc2fa4c163e059f746dfb6f9625d
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2022-12-20 09:08:09 +01:00
parent 68eb983b5d
commit 7e1fb3aaaa
2 changed files with 33 additions and 31 deletions

View File

@@ -395,58 +395,58 @@ std::optional<EnvironmentProvider> EnvironmentProvider::provider(const QByteArra
void EnvironmentChange::addSetValue(const QString &key, const QString &value) void EnvironmentChange::addSetValue(const QString &key, const QString &value)
{ {
m_changeItems.append({Item::SetValue, QVariant::fromValue(QPair<QString, QString>(key, value))}); m_changeItems.append(Item{std::in_place_index_t<SetValue>(), QPair<QString, QString>{key, value}});
} }
void EnvironmentChange::addUnsetValue(const QString &key) void EnvironmentChange::addUnsetValue(const QString &key)
{ {
m_changeItems.append({Item::UnsetValue, key}); m_changeItems.append(Item{std::in_place_index_t<UnsetValue>(), key});
} }
void EnvironmentChange::addPrependToPath(const FilePaths &values) void EnvironmentChange::addPrependToPath(const FilePaths &values)
{ {
for (int i = values.size(); --i >= 0; ) { for (int i = values.size(); --i >= 0; ) {
const FilePath value = values.at(i); const FilePath value = values.at(i);
m_changeItems.append({Item::PrependToPath, value.toVariant()}); m_changeItems.append(Item{std::in_place_index_t<PrependToPath>(), value});
} }
} }
void EnvironmentChange::addAppendToPath(const FilePaths &values) void EnvironmentChange::addAppendToPath(const FilePaths &values)
{ {
for (const FilePath &value : values) for (const FilePath &value : values)
m_changeItems.append({Item::AppendToPath, value.toVariant()}); m_changeItems.append(Item{std::in_place_index_t<AppendToPath>(), value});
} }
EnvironmentChange EnvironmentChange::fromFixedEnvironment(const Environment &fixedEnv) EnvironmentChange EnvironmentChange::fromFixedEnvironment(const Environment &fixedEnv)
{ {
EnvironmentChange change; EnvironmentChange change;
change.m_changeItems.append({Item::SetFixedEnvironment, QVariant::fromValue(fixedEnv)}); change.m_changeItems.append(Item{std::in_place_index_t<SetFixedEnvironment>(), fixedEnv});
return change; return change;
} }
void EnvironmentChange::applyToEnvironment(Environment &env) const void EnvironmentChange::applyToEnvironment(Environment &env) const
{ {
for (const Item &item : m_changeItems) { for (const Item &item : m_changeItems) {
switch (item.type) { switch (item.index()) {
case Item::SetSystemEnvironment: case SetSystemEnvironment:
env = Environment::systemEnvironment(); env = Environment::systemEnvironment();
break; break;
case Item::SetFixedEnvironment: case SetFixedEnvironment:
env = item.data.value<Environment>(); env = std::get<SetFixedEnvironment>(item);
break; break;
case Item::SetValue: { case SetValue: {
auto data = item.data.value<QPair<QString, QString>>(); const QPair<QString, QString> data = std::get<SetValue>(item);
env.set(data.first, data.second); env.set(data.first, data.second);
break; break;
} }
case Item::UnsetValue: case UnsetValue:
env.unset(item.data.toString()); env.unset(std::get<UnsetValue>(item));
break; break;
case Item::PrependToPath: case PrependToPath:
env.prependOrSetPath(FilePath::fromVariant(item.data)); env.prependOrSetPath(std::get<PrependToPath>(item));
break; break;
case Item::AppendToPath: case AppendToPath:
env.appendOrSetPath(FilePath::fromVariant(item.data)); env.appendOrSetPath(std::get<AppendToPath>(item));
break; break;
} }
} }

View File

@@ -109,22 +109,24 @@ class QTCREATOR_UTILS_EXPORT EnvironmentChange final
public: public:
EnvironmentChange() = default; EnvironmentChange() = default;
class Item final enum Type {
{ SetSystemEnvironment,
public: SetFixedEnvironment,
enum Type { SetValue,
SetSystemEnvironment, UnsetValue,
SetFixedEnvironment, PrependToPath,
SetValue, AppendToPath,
UnsetValue,
PrependToPath,
AppendToPath,
};
Type type;
QVariant data;
}; };
using Item = std::variant<
std::monostate, // SetSystemEnvironment dummy
Environment, // SetFixedEnvironment
QPair<QString, QString>, // SetValue
QString, // UnsetValue
FilePath, // PrependToPath
FilePath // AppendToPath
>;
static EnvironmentChange fromFixedEnvironment(const Environment &fixedEnv); static EnvironmentChange fromFixedEnvironment(const Environment &fixedEnv);
void applyToEnvironment(Environment &) const; void applyToEnvironment(Environment &) const;