From 4baf2fcf593673f1aaece6b9b3d319df4776b091 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 3 Jan 2024 22:50:57 +0000 Subject: [PATCH] Use std::variant for struct StringParameter --- src/strings_internal.h | 48 +++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/strings_internal.h b/src/strings_internal.h index 08c164c8f1..4933447e12 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -16,12 +16,13 @@ #include "core/strong_typedef_type.hpp" #include +#include + +struct StringParameter; /** The data required to format and validate a single parameter of a string. */ struct StringParameter { - uint64_t data; ///< The data of the parameter. - const char *string_view; ///< The string value, if it has any. - std::unique_ptr string; ///< Copied string value, if it has any. + std::variant> data; ///< The data of the parameter, non-owning string value, or owned string value. char32_t type; ///< The #StringControlCode to interpret this data with when it's the first parameter, otherwise '\0'. }; @@ -98,7 +99,7 @@ public: T GetNextParameter() { auto ptr = GetNextParameterPointer(); - return static_cast(ptr == nullptr ? 0 : ptr->data); + return static_cast(ptr != nullptr && std::holds_alternative(ptr->data) ? std::get(ptr->data) : 0); } /** @@ -111,7 +112,14 @@ public: { auto ptr = GetNextParameterPointer(); if (ptr == nullptr) return nullptr; - return ptr->string != nullptr ? ptr->string->c_str() : ptr->string_view; + + if (std::holds_alternative(ptr->data)) { + return std::get(ptr->data); + } else if (std::holds_alternative>(ptr->data)) { + return std::get>(ptr->data)->c_str(); + } else { + return nullptr; + } } /** @@ -156,8 +164,6 @@ public: { assert(n < this->parameters.size()); this->parameters[n].data = v; - this->parameters[n].string.reset(); - this->parameters[n].string_view = nullptr; } template ::value, int> = 0> @@ -169,24 +175,26 @@ public: void SetParam(size_t n, const char *str) { assert(n < this->parameters.size()); - this->parameters[n].data = 0; - this->parameters[n].string.reset(); - this->parameters[n].string_view = str; + this->parameters[n].data = str; } void SetParam(size_t n, std::string str) { assert(n < this->parameters.size()); - this->parameters[n].data = 0; - this->parameters[n].string = std::make_unique(std::move(str)); - this->parameters[n].string_view = nullptr; + this->parameters[n].data = std::make_unique(std::move(str)); + } + + void SetParam(size_t n, span params) + { + assert(n < this->parameters.size()); + this->parameters[n].data = params; } uint64_t GetParam(size_t n) const { assert(n < this->parameters.size()); - assert(this->parameters[n].string_view == nullptr && this->parameters[n].string == nullptr); - return this->parameters[n].data; + assert(std::holds_alternative(this->parameters[n].data)); + return std::get(this->parameters[n].data); } /** @@ -197,8 +205,14 @@ public: const char *GetParamStr(size_t n) const { assert(n < this->parameters.size()); - auto ¶m = this->parameters[n]; - return param.string != nullptr ? param.string->c_str() : param.string_view; + + if (std::holds_alternative(this->parameters[n].data)) { + return std::get(this->parameters[n].data); + } else if (std::holds_alternative>(this->parameters[n].data)) { + return std::get>(this->parameters[n].data)->c_str(); + } else { + return nullptr; + } } };