From 401031318048b55bd6c8df23fc0f820d35a40dce Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 3 Dec 2024 23:02:43 +0000 Subject: [PATCH] Codechange: String parameters can now be explicitly not initialised. As the visitor is now more complex this requires an unspecialised GetNextParameter() to avoid it being repeated for each return type. --- src/strings_internal.h | 4 +++- src/strings_type.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strings_internal.h b/src/strings_internal.h index 38f4cad5f0..976dd7524b 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -83,6 +83,7 @@ public: uint64_t GetNextParameter() { struct visitor { + uint64_t operator()(const std::monostate &) { throw std::out_of_range("Attempt to read uninitialised parameter as integer"); } uint64_t operator()(const uint64_t &arg) { return arg; } uint64_t operator()(const std::string &) { throw std::out_of_range("Attempt to read string parameter as integer"); } }; @@ -113,11 +114,12 @@ public: const char *GetNextParameterString() { struct visitor { + const char *operator()(const std::monostate &) { throw std::out_of_range("Attempt to read uninitialised parameter as string"); } const char *operator()(const uint64_t &) { throw std::out_of_range("Attempt to read integer parameter as string"); } const char *operator()(const std::string &arg) { return arg.c_str(); } }; - const auto ¶m = GetNextParameterReference(); + const auto ¶m = this->GetNextParameterReference(); return std::visit(visitor{}, param.data); } diff --git a/src/strings_type.h b/src/strings_type.h index 6446e4d653..d749ac7960 100644 --- a/src/strings_type.h +++ b/src/strings_type.h @@ -72,7 +72,7 @@ static constexpr StringID SPECSTR_SILLY_NAME = 0x70E5; ///< Special string for s static constexpr StringID SPECSTR_ANDCO_NAME = 0x70E6; ///< Special string for Surname & Co company names. static constexpr StringID SPECSTR_PRESIDENT_NAME = 0x70E7; ///< Special string for the president's name. -using StringParameterData = std::variant; +using StringParameterData = std::variant; /** The data required to format and validate a single parameter of a string. */ struct StringParameter { @@ -82,6 +82,7 @@ struct StringParameter { StringParameter() = default; inline StringParameter(StringParameterData &&data) : data(std::move(data)), type(0) {} + inline StringParameter(const std::monostate &data) : data(data), type(0) {} inline StringParameter(uint64_t data) : data(data), type(0) {} inline StringParameter(const char *data) : data(std::string{data}), type(0) {}