diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index eee65266ec..9ffd26946e 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -182,7 +182,7 @@ public: template void Visit(const std::string_view& name, T& param) { - static_assert(std::is_arithmetic::value, "Not an arithmetic type"); + static_assert(std::is_arithmetic_v || std::is_enum_v, "Not an arithmetic type"); auto value = static_cast(param); Visit(name, value); param = static_cast(value); diff --git a/src/openrct2/actions/RideSetSetting.hpp b/src/openrct2/actions/RideSetSetting.hpp index 36410631ba..3c99c5855f 100644 --- a/src/openrct2/actions/RideSetSetting.hpp +++ b/src/openrct2/actions/RideSetSetting.hpp @@ -32,7 +32,7 @@ DEFINE_GAME_ACTION(RideSetSettingAction, GAME_COMMAND_SET_RIDE_SETTING, GameActi { private: NetworkRideId_t _rideIndex{ RideIdNewNull }; - uint8_t _setting{ 0 }; + RideSetSetting _setting{ 0 }; uint8_t _value{ 0 }; public: @@ -41,7 +41,7 @@ public: } RideSetSettingAction(ride_id_t rideIndex, RideSetSetting setting, uint8_t value) : _rideIndex(rideIndex) - , _setting(static_cast(setting)) + , _setting(setting) , _value(value) { } @@ -74,7 +74,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_CANT_CHANGE_OPERATING_MODE); } - switch (static_cast(_setting)) + switch (_setting) { case RideSetSetting::Mode: if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) @@ -162,7 +162,7 @@ public: } break; default: - log_warning("Invalid RideSetSetting: %u", _setting); + log_warning("Invalid RideSetSetting: %u", static_cast(_setting)); return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_CANT_CHANGE_OPERATING_MODE); break; } @@ -179,7 +179,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_CANT_CHANGE_OPERATING_MODE); } - switch (static_cast(_setting)) + switch (_setting) { case RideSetSetting::Mode: invalidate_test_results(ride); diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index e3a175183c..89ba75849f 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -28,13 +28,37 @@ #include #include -template struct DataSerializerTraits +template struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const T& v) = delete; static void decode(OpenRCT2::IStream* stream, T& val) = delete; static void log(OpenRCT2::IStream* stream, const T& val) = delete; }; +template struct DataSerializerTraits_enum +{ + static void encode(OpenRCT2::IStream* stream, const T& val) + { + stream->Write(&val); + } + static void decode(OpenRCT2::IStream* stream, T& val) + { + stream->Read(&val); + } + static void log(OpenRCT2::IStream* stream, const T& val) + { + using underlying = std::underlying_type_t; + std::stringstream ss; + ss << std::hex << std::setw(sizeof(underlying) * 2) << std::setfill('0') << static_cast(val); + + std::string str = ss.str(); + stream->Write(str.c_str(), str.size()); + } +}; + +template +using DataSerializerTraits = std::conditional_t, DataSerializerTraits_enum, DataSerializerTraits_t>; + template struct DataSerializerTraitsIntegral { static void encode(OpenRCT2::IStream* stream, const T& val) @@ -58,7 +82,7 @@ template struct DataSerializerTraitsIntegral } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const bool& val) { @@ -77,39 +101,39 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits : public DataSerializerTraitsIntegral +template<> struct DataSerializerTraits_t : public DataSerializerTraitsIntegral { }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const std::string& str) { @@ -137,7 +161,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const NetworkPlayerId_t& val) { @@ -172,7 +196,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const NetworkRideId_t& val) { @@ -205,7 +229,7 @@ template<> struct DataSerializerTraits } }; -template struct DataSerializerTraits> +template struct DataSerializerTraits_t> { static void encode(OpenRCT2::IStream* stream, const DataSerialiserTag& tag) { @@ -230,7 +254,7 @@ template struct DataSerializerTraits> } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const OpenRCT2::MemoryStream& val) { @@ -298,23 +322,23 @@ template struct DataSerializerTraitsPODArray } }; -template struct DataSerializerTraits : public DataSerializerTraitsPODArray +template struct DataSerializerTraits_t : public DataSerializerTraitsPODArray { }; -template struct DataSerializerTraits : public DataSerializerTraitsPODArray +template struct DataSerializerTraits_t : public DataSerializerTraitsPODArray { }; -template struct DataSerializerTraits : public DataSerializerTraitsPODArray +template struct DataSerializerTraits_t : public DataSerializerTraitsPODArray { }; -template struct DataSerializerTraits : public DataSerializerTraitsPODArray +template struct DataSerializerTraits_t : public DataSerializerTraitsPODArray { }; -template struct DataSerializerTraits> +template struct DataSerializerTraits_t> { static void encode(OpenRCT2::IStream* stream, const std::array<_Ty, _Size>& val) { @@ -356,7 +380,7 @@ template struct DataSerializerTraits struct DataSerializerTraits> +template struct DataSerializerTraits_t> { static void encode(OpenRCT2::IStream* stream, const std::vector<_Ty>& val) { @@ -397,7 +421,7 @@ template struct DataSerializerTraits> } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const MapRange& v) { @@ -425,7 +449,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const TileElement& tileElement) { @@ -467,7 +491,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const CoordsXY& coords) { @@ -488,7 +512,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const CoordsXYZ& coord) { @@ -513,7 +537,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const CoordsXYZD& coord) { @@ -541,7 +565,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const NetworkCheatType_t& val) { @@ -561,7 +585,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const rct_object_entry& val) { @@ -583,7 +607,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const TrackDesignTrackElement& val) { @@ -603,7 +627,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const TrackDesignMazeElement& val) { @@ -624,7 +648,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const TrackDesignEntranceElement& val) { @@ -652,7 +676,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const TrackDesignSceneryElement& val) { @@ -687,7 +711,7 @@ template<> struct DataSerializerTraits } }; -template<> struct DataSerializerTraits +template<> struct DataSerializerTraits_t { static void encode(OpenRCT2::IStream* stream, const rct_vehicle_colour& val) {