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.
This commit is contained in:
Peter Nelson 2024-12-03 23:02:43 +00:00 committed by Peter Nelson
parent 0c0e7606d9
commit 4010313180
2 changed files with 5 additions and 2 deletions

View File

@ -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 &param = GetNextParameterReference();
const auto &param = this->GetNextParameterReference();
return std::visit(visitor{}, param.data);
}

View File

@ -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<uint64_t, std::string>;
using StringParameterData = std::variant<std::monostate, uint64_t, std::string>;
/** 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) {}