1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Use variant instead of any

This commit is contained in:
Ted John
2020-10-12 21:57:43 +01:00
parent 644f7f07b3
commit eebababa90
2 changed files with 19 additions and 18 deletions

View File

@@ -515,19 +515,19 @@ namespace OpenRCT2
return stringLen;
}
void FormatArgumentAny(std::stringstream& ss, FormatToken token, const std::any& value)
void FormatArgumentAny(std::stringstream& ss, FormatToken token, const FormatArg_t& value)
{
if (value.type() == typeid(uint16_t))
if (std::holds_alternative<uint16_t>(value))
{
FormatArgument(ss, token, std::any_cast<uint16_t>(value));
FormatArgument(ss, token, std::get<uint16_t>(value));
}
else if (value.type() == typeid(int32_t))
else if (std::holds_alternative<int32_t>(value))
{
FormatArgument(ss, token, std::any_cast<int32_t>(value));
FormatArgument(ss, token, std::get<int32_t>(value));
}
else if (value.type() == typeid(const char*))
else if (std::holds_alternative<const char*>(value))
{
FormatArgument(ss, token, std::any_cast<const char*>(value));
FormatArgument(ss, token, std::get<const char*>(value));
}
else
{
@@ -536,7 +536,7 @@ namespace OpenRCT2
}
static void FormatStringAny(
std::stringstream& ss, const FmtString& fmt, const std::vector<std::any>& args, size_t& argIndex)
std::stringstream& ss, const FmtString& fmt, const std::vector<FormatArg_t>& args, size_t& argIndex)
{
for (const auto& token : fmt)
{
@@ -544,10 +544,10 @@ namespace OpenRCT2
{
if (argIndex < args.size())
{
auto arg = args[argIndex++];
if (arg.type() == typeid(rct_string_id))
const auto& arg = args[argIndex++];
if (auto stringid = std::get_if<uint16_t>(&arg))
{
auto subfmt = GetFmtStringById(std::any_cast<rct_string_id>(arg));
auto subfmt = GetFmtStringById(*stringid);
FormatStringAny(ss, subfmt, args, argIndex);
}
}
@@ -571,7 +571,7 @@ namespace OpenRCT2
}
}
std::string FormatStringAny(const FmtString& fmt, const std::vector<std::any>& args)
std::string FormatStringAny(const FmtString& fmt, const std::vector<FormatArg_t>& args)
{
auto& ss = GetThreadFormatStream();
size_t argIndex = 0;
@@ -579,7 +579,7 @@ namespace OpenRCT2
return ss.str();
}
size_t FormatStringAny(char* buffer, size_t bufferLen, const FmtString& fmt, const std::vector<std::any>& args)
size_t FormatStringAny(char* buffer, size_t bufferLen, const FmtString& fmt, const std::vector<FormatArg_t>& args)
{
auto& ss = GetThreadFormatStream();
size_t argIndex = 0;
@@ -595,7 +595,7 @@ namespace OpenRCT2
return value;
}
static void BuildAnyArgListFromLegacyArgBuffer(const FmtString& fmt, std::vector<std::any>& anyArgs, const void* args)
static void BuildAnyArgListFromLegacyArgBuffer(const FmtString& fmt, std::vector<FormatArg_t>& anyArgs, const void* args)
{
for (const auto& t : fmt)
{
@@ -645,7 +645,7 @@ namespace OpenRCT2
size_t FormatStringLegacy(char* buffer, size_t bufferLen, rct_string_id id, const void* args)
{
std::vector<std::any> anyArgs;
std::vector<FormatArg_t> anyArgs;
auto fmt = GetFmtStringById(id);
BuildAnyArgListFromLegacyArgBuffer(fmt, anyArgs, args);
return FormatStringAny(buffer, bufferLen, fmt, anyArgs);

View File

@@ -13,17 +13,18 @@
#include "FormatCodes.h"
#include "Language.h"
#include <any>
#include <sstream>
#include <stack>
#include <string>
#include <string_view>
#include <utility>
#include <variant>
#include <vector>
namespace OpenRCT2
{
using FormatToken = uint32_t;
using FormatArg_t = std::variant<uint16_t, int32_t, const char*>;
class FmtString
{
@@ -163,7 +164,7 @@ namespace OpenRCT2
return CopyStringStreamToBuffer(buffer, bufferLen, ss);
}
std::string FormatStringAny(const FmtString& fmt, const std::vector<std::any>& args);
size_t FormatStringAny(char* buffer, size_t bufferLen, const FmtString& fmt, const std::vector<std::any>& args);
std::string FormatStringAny(const FmtString& fmt, const std::vector<FormatArg_t>& args);
size_t FormatStringAny(char* buffer, size_t bufferLen, const FmtString& fmt, const std::vector<FormatArg_t>& args);
size_t FormatStringLegacy(char* buffer, size_t bufferLen, rct_string_id id, const void* args);
} // namespace OpenRCT2