From 4ac8f1dc355dca2b8cba0889829814ce240a4d61 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 21 Jul 2017 19:44:44 +0100 Subject: [PATCH] Make the game action callback type safe --- src/openrct2/actions/GameAction.cpp | 6 +++--- src/openrct2/actions/GameAction.h | 18 +++++++++++++----- src/openrct2/actions/GameActionCompat.cpp | 6 +++--- .../actions/PlaceParkEntranceAction.hpp | 2 +- src/openrct2/actions/RideCreateAction.hpp | 2 +- src/openrct2/actions/RideSetStatus.hpp | 2 +- .../actions/SetParkEntranceFeeAction.hpp | 2 +- src/openrct2/network/network.h | 2 +- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index e3a9bdabde..99b5ca32fb 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -191,10 +191,10 @@ namespace GameActions } // Call callback for asynchronous events - const GameAction::GameActionCallback_t& cb = action->GetCallback(); - if (cb) + auto cb = action->GetCallback(); + if (cb != nullptr) { - cb(action, result); + cb(action, result.get()); } if (result->Error != GA_ERROR::OK && !(flags & GAME_COMMAND_FLAG_GHOST)) diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index 4eda16ce02..e9331fd0ad 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -83,7 +83,7 @@ struct GameAction { public: typedef std::unique_ptr Ptr; - typedef std::function GameActionCallback_t; + typedef std::function Callback_t; private: uint32 const _type; @@ -92,7 +92,7 @@ private: uint32 _playerId = 0; // Callee uint32 _flags = 0; // GAME_COMMAND_FLAGS uint32 _networkId = 0; - GameActionCallback_t _callback; + Callback_t _callback; public: GameAction(uint32 type, uint16 actionFlags) @@ -137,12 +137,12 @@ public: return _type; } - void SetCallback(const GameActionCallback_t& cb) + void SetCallback(Callback_t cb) { _callback = cb; } - const GameActionCallback_t& GetCallback() const + const Callback_t & GetCallback() const { return _callback; } @@ -181,7 +181,7 @@ public: virtual GameActionResult::Ptr Execute() const abstract; }; -template +template struct GameActionBase : GameAction { public: @@ -191,6 +191,14 @@ public: : GameAction(TYPE, TActionFlags) { } + + void SetCallback(std::function typedCallback) + { + GameAction::SetCallback([typedCallback](const GameAction * ga, const GameActionResult * result) + { + typedCallback(ga, static_cast(result)); + }); + } }; typedef GameAction *(*GameActionFactory)(); diff --git a/src/openrct2/actions/GameActionCompat.cpp b/src/openrct2/actions/GameActionCompat.cpp index 1fa6cdc12c..44f508d360 100644 --- a/src/openrct2/actions/GameActionCompat.cpp +++ b/src/openrct2/actions/GameActionCompat.cpp @@ -109,12 +109,12 @@ extern "C" auto gameAction = RideCreateAction(); gameAction.rideType = listItem.type; gameAction.rideSubType = listItem.entry_index; - gameAction.SetCallback([](const GameAction *ga, const GameActionResult::Ptr& res) + gameAction.SetCallback([](const GameAction *ga, const RideCreateGameActionResult * result) { - if (res->Error != GA_ERROR::OK) + if (result->Error != GA_ERROR::OK) return; - ride_construct(static_cast(res.get())->rideIndex); + ride_construct(result->rideIndex); }); GameActions::Execute(&gameAction); diff --git a/src/openrct2/actions/PlaceParkEntranceAction.hpp b/src/openrct2/actions/PlaceParkEntranceAction.hpp index c7d7ce748f..ac253740c9 100644 --- a/src/openrct2/actions/PlaceParkEntranceAction.hpp +++ b/src/openrct2/actions/PlaceParkEntranceAction.hpp @@ -37,7 +37,7 @@ struct PlaceParkEntranceGameActionResult : public GameActionResult } }; -struct PlaceParkEntranceAction : public GameActionBase +struct PlaceParkEntranceAction : public GameActionBase { public: sint16 x; diff --git a/src/openrct2/actions/RideCreateAction.hpp b/src/openrct2/actions/RideCreateAction.hpp index e7b1a2d97e..2e879da59a 100644 --- a/src/openrct2/actions/RideCreateAction.hpp +++ b/src/openrct2/actions/RideCreateAction.hpp @@ -41,7 +41,7 @@ struct RideCreateGameActionResult : public GameActionResult uint32 rideColor; }; -struct RideCreateAction : public GameActionBase +struct RideCreateAction : public GameActionBase { public: sint32 rideType; diff --git a/src/openrct2/actions/RideSetStatus.hpp b/src/openrct2/actions/RideSetStatus.hpp index f2652673f2..f27cafee7d 100644 --- a/src/openrct2/actions/RideSetStatus.hpp +++ b/src/openrct2/actions/RideSetStatus.hpp @@ -28,7 +28,7 @@ extern "C" #include "../ride/ride.h" } -struct RideSetStatusAction : public GameActionBase +struct RideSetStatusAction : public GameActionBase { public: uint8 RideIndex; diff --git a/src/openrct2/actions/SetParkEntranceFeeAction.hpp b/src/openrct2/actions/SetParkEntranceFeeAction.hpp index c2ec3d3eb3..eaccf49909 100644 --- a/src/openrct2/actions/SetParkEntranceFeeAction.hpp +++ b/src/openrct2/actions/SetParkEntranceFeeAction.hpp @@ -27,7 +27,7 @@ extern "C" #include "../world/park.h" } -struct SetParkEntranceFeeAction : public GameActionBase +struct SetParkEntranceFeeAction : public GameActionBase { public: money16 Fee; diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 75c85b497e..a301469723 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -169,7 +169,7 @@ public: std::vector> group_list; NetworkKey _key; std::vector _challenge; - std::map _gameActionCallbacks; + std::map _gameActionCallbacks; NetworkUserManager _userManager; std::string ServerName;