From e1c08defc87f4efd5019e66f30fd5a5b54dbf3cf Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 20 Apr 2020 23:30:37 +0100 Subject: [PATCH] Remove use of std::variant --- src/openrct2-ui/windows/RideConstruction.cpp | 2 +- src/openrct2-ui/windows/TopToolbar.cpp | 4 +- src/openrct2/actions/GameAction.cpp | 8 +-- src/openrct2/actions/GameAction.h | 58 ++++++++++++++++++- src/openrct2/actions/GameActionCompat.cpp | 4 +- src/openrct2/actions/LandSmoothAction.hpp | 2 +- src/openrct2/actions/MazePlaceTrackAction.hpp | 6 +- src/openrct2/actions/MazeSetTrackAction.hpp | 2 +- src/openrct2/world/Map.cpp | 4 +- 9 files changed, 70 insertions(+), 20 deletions(-) diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index f875773cc6..8eba60739c 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -1824,7 +1824,7 @@ static void window_ride_construction_construct(rct_window* w) // Used by some functions if (res->Error != GA_ERROR::OK) { - if (auto error = std::get_if(&res->ErrorMessage)) + if (auto error = res->ErrorMessage.AsStringId()) gGameCommandErrorText = *error; else gGameCommandErrorText = STR_NONE; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index dc04ebfb0b..e67a515a7c 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1947,7 +1947,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo break; } - if (auto message = std::get_if(&res->ErrorMessage)) + if (auto message = res->ErrorMessage.AsStringId()) { if (*message == STR_NOT_ENOUGH_CASH_REQUIRES || *message == STR_CAN_ONLY_BUILD_THIS_ON_WATER) { @@ -2000,7 +2000,7 @@ static void window_top_toolbar_scenery_tool_down(int16_t x, int16_t y, rct_windo break; } - if (auto message = std::get_if(&res->ErrorMessage)) + if (auto message = res->ErrorMessage.AsStringId()) { if (*message == STR_NOT_ENOUGH_CASH_REQUIRES || *message == STR_CAN_ONLY_BUILD_THIS_ON_WATER) { diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 00ce2751a4..b24c48de82 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -53,13 +53,13 @@ GameActionResult::GameActionResult(GA_ERROR error, rct_string_id title, rct_stri std::string GameActionResult::GetErrorTitle() const { std::string titlez; - if (auto title = std::get_if(&ErrorTitle)) + if (auto title = ErrorTitle.AsString()) { titlez = *title; } else { - titlez = format_string(std::get(ErrorTitle), nullptr); + titlez = format_string(ErrorTitle.GetStringId(), nullptr); } return titlez; } @@ -67,13 +67,13 @@ std::string GameActionResult::GetErrorTitle() const std::string GameActionResult::GetErrorMessage() const { std::string messagez; - if (auto message = std::get_if(&ErrorMessage)) + if (auto message = ErrorMessage.AsString()) { messagez = *message; } else { - messagez = format_string(std::get(ErrorMessage), ErrorMessageArgs.data()); + messagez = format_string(ErrorMessage.GetStringId(), ErrorMessageArgs.data()); } return messagez; } diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index 474dddc6a0..79ef489294 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -20,7 +20,6 @@ #include #include #include -#include /** * Common error codes for game actions. @@ -61,6 +60,59 @@ namespace GA_FLAGS # pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif +class StringVariant +{ +private: + rct_string_id StringId = STR_NONE; + std::string String; + +public: + StringVariant() = default; + + StringVariant(rct_string_id stringId) + : StringId(stringId) + { + } + + StringVariant(const std::string& s) + : String(s) + { + } + + StringVariant(std::string&& s) + : String(s) + { + } + + StringVariant(const char* s) + : String(s) + { + } + + const std::string* AsString() const + { + if (!String.empty()) + { + return &String; + } + return {}; + } + + const rct_string_id* AsStringId() const + { + if (String.empty()) + { + return &StringId; + } + return {}; + } + + rct_string_id GetStringId() const + { + return String.empty() ? StringId : STR_NONE; + } +}; + /** * Represents the result of a game action query or execution. */ @@ -70,8 +122,8 @@ public: using Ptr = std::unique_ptr; GA_ERROR Error = GA_ERROR::OK; - std::variant ErrorTitle = STR_NONE; - std::variant ErrorMessage = STR_NONE; + StringVariant ErrorTitle; + StringVariant ErrorMessage; std::array ErrorMessageArgs; CoordsXYZ Position = { LOCATION_NULL, LOCATION_NULL, LOCATION_NULL }; money32 Cost = 0; diff --git a/src/openrct2/actions/GameActionCompat.cpp b/src/openrct2/actions/GameActionCompat.cpp index aebf267c9f..6dc34b7178 100644 --- a/src/openrct2/actions/GameActionCompat.cpp +++ b/src/openrct2/actions/GameActionCompat.cpp @@ -140,11 +140,11 @@ money32 maze_set_track( // NOTE: ride_construction_tooldown_construct requires them to be set. // Refactor result type once theres no C code referencing this function. - if (auto title = std::get_if(&res->ErrorTitle)) + if (auto title = res->ErrorTitle.AsStringId()) gGameCommandErrorTitle = *title; else gGameCommandErrorTitle = STR_NONE; - if (auto message = std::get_if(&res->ErrorMessage)) + if (auto message = res->ErrorMessage.AsStringId()) gGameCommandErrorText = *message; else gGameCommandErrorText = STR_NONE; diff --git a/src/openrct2/actions/LandSmoothAction.hpp b/src/openrct2/actions/LandSmoothAction.hpp index 3d50624403..ef68723978 100644 --- a/src/openrct2/actions/LandSmoothAction.hpp +++ b/src/openrct2/actions/LandSmoothAction.hpp @@ -642,7 +642,7 @@ private: } default: log_error("Invalid map selection %u", _selectionType); - return MakeResult(GA_ERROR::INVALID_PARAMETERS, std::get(res->ErrorTitle)); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, res->ErrorTitle.GetStringId()); } // switch selectionType // Raise / lower the land tool selection area diff --git a/src/openrct2/actions/MazePlaceTrackAction.hpp b/src/openrct2/actions/MazePlaceTrackAction.hpp index afcb95b551..f8931d81d0 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.hpp +++ b/src/openrct2/actions/MazePlaceTrackAction.hpp @@ -93,8 +93,7 @@ public: { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags(), &clearCost, CREATE_CROSSING_MODE_NONE)) { - return MakeResult( - GA_ERROR::NO_CLEARANCE, std::get(res->ErrorTitle), gGameCommandErrorText, gCommonFormatArgs); + return MakeResult(GA_ERROR::NO_CLEARANCE, res->ErrorTitle.GetStringId(), gGameCommandErrorText, gCommonFormatArgs); } if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) @@ -163,8 +162,7 @@ public: { _loc.ToTileStart(), baseHeight, clearanceHeight }, &map_place_non_scenery_clear_func, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, &clearCost, CREATE_CROSSING_MODE_NONE)) { - return MakeResult( - GA_ERROR::NO_CLEARANCE, std::get(res->ErrorTitle), gGameCommandErrorText, gCommonFormatArgs); + return MakeResult(GA_ERROR::NO_CLEARANCE, res->ErrorTitle.GetStringId(), gGameCommandErrorText, gCommonFormatArgs); } money32 price = (((RideTrackCosts[ride->type].track_price * TrackPricing[TRACK_ELEM_MAZE]) >> 16)); diff --git a/src/openrct2/actions/MazeSetTrackAction.hpp b/src/openrct2/actions/MazeSetTrackAction.hpp index 7dc8adeeb5..ed4e3698dd 100644 --- a/src/openrct2/actions/MazeSetTrackAction.hpp +++ b/src/openrct2/actions/MazeSetTrackAction.hpp @@ -137,7 +137,7 @@ public: if (!map_can_construct_at({ _loc.ToTileStart(), baseHeight, clearanceHeight }, { 0b1111, 0 })) { return MakeResult( - GA_ERROR::NO_CLEARANCE, std::get(res->ErrorTitle), gGameCommandErrorText, gCommonFormatArgs); + GA_ERROR::NO_CLEARANCE, res->ErrorTitle.GetStringId(), gGameCommandErrorText, gCommonFormatArgs); } if (gMapGroundFlags & ELEMENT_IS_UNDERWATER) diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 469de6cd97..3c3d5d2c92 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1324,7 +1324,7 @@ static GameActionResult::Ptr map_can_construct_with_clear_at( if (tileElement == nullptr) { res->Error = GA_ERROR::UNKNOWN; - res->ErrorMessage = 0; + res->ErrorMessage = STR_NONE; return res; } do @@ -1481,7 +1481,7 @@ bool map_can_construct_with_clear_at( uint8_t crossingMode) { GameActionResult::Ptr res = map_can_construct_with_clear_at(pos, clearFunc, quarterTile, flags, crossingMode); - if (auto message = std::get_if(&res->ErrorMessage)) + if (auto message = res->ErrorMessage.AsStringId()) gGameCommandErrorText = *message; else gGameCommandErrorText = STR_NONE;