1
0
Fork 0

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.
pull/13528/head
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) {}