diff options
author | Michael Lutz <michi@icosahedron.de> | 2021-12-20 16:59:07 +0100 |
---|---|---|
committer | Michael Lutz <michi@icosahedron.de> | 2021-12-20 23:32:23 +0100 |
commit | b11bd185e3c656c08e3f3d57eb2ada15b7ac276d (patch) | |
tree | b3bb8a82353c1d494d2d1d1aeebb4e4a14877e4d | |
parent | 9c18236f2c691cf4f21693f2693256a31faafae8 (diff) | |
download | openttd-b11bd185e3c656c08e3f3d57eb2ada15b7ac276d.tar.xz |
Fix #9756: Network command unpack proc was not generated in all cases.
The case where the callback proc takes all command results but not any of
the command parameters was not handled properly.
-rw-r--r-- | src/command_type.h | 3 | ||||
-rw-r--r-- | src/network/network_command.cpp | 5 |
2 files changed, 7 insertions, 1 deletions
diff --git a/src/command_type.h b/src/command_type.h index e8db1ed7f..9a122dede 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -409,12 +409,14 @@ template <typename T> struct CommandFunctionTraitHelper; template <typename... Targs> struct CommandFunctionTraitHelper<CommandCost(*)(DoCommandFlag, Targs...)> { using Args = std::tuple<std::decay_t<Targs>...>; + using RetTypes = void; using CbArgs = Args; using CbProcType = void(*)(Commands, const CommandCost &); }; template <template <typename...> typename Tret, typename... Tretargs, typename... Targs> struct CommandFunctionTraitHelper<Tret<CommandCost, Tretargs...>(*)(DoCommandFlag, Targs...)> { using Args = std::tuple<std::decay_t<Targs>...>; + using RetTypes = std::tuple<std::decay_t<Tretargs>...>; using CbArgs = std::tuple<std::decay_t<Tretargs>..., std::decay_t<Targs>...>; using CbProcType = void(*)(Commands, const CommandCost &, Tretargs...); }; @@ -426,6 +428,7 @@ template <Commands Tcmd> struct CommandTraits; template<> struct CommandTraits<cmd_> { \ using ProcType = decltype(&proc_); \ using Args = typename CommandFunctionTraitHelper<ProcType>::Args; \ + using RetTypes = typename CommandFunctionTraitHelper<ProcType>::RetTypes; \ using CbArgs = typename CommandFunctionTraitHelper<ProcType>::CbArgs; \ using RetCallbackProc = typename CommandFunctionTraitHelper<ProcType>::CbProcType; \ static constexpr Commands cmd = cmd_; \ diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 05837f50c..d39618abf 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -136,7 +136,10 @@ constexpr UnpackNetworkCommandProc MakeUnpackNetworkCommandCallback() noexcept { /* Check if the callback matches with the command arguments. If not, don't generate an Unpack proc. */ using Tcallback = std::tuple_element_t<Tcb, decltype(_callback_tuple)>; - if constexpr (std::is_same_v<Tcallback, CommandCallback * const> || std::is_same_v<Tcallback, CommandCallbackData * const> || std::is_same_v<typename CommandTraits<Tcmd>::CbArgs, typename CallbackArgsHelper<Tcallback>::Args>) { + if constexpr (std::is_same_v<Tcallback, CommandCallback * const> || // Callback type is CommandCallback. + std::is_same_v<Tcallback, CommandCallbackData * const> || // Callback type is CommandCallbackData. + std::is_same_v<typename CommandTraits<Tcmd>::CbArgs, typename CallbackArgsHelper<Tcallback>::Args> || // Callback proc takes all command return values and parameters. + (!std::is_void_v<typename CommandTraits<Tcmd>::RetTypes> && std::is_same_v<typename CallbackArgsHelper<typename CommandTraits<Tcmd>::RetCallbackProc const>::Args, typename CallbackArgsHelper<Tcallback>::Args>)) { // Callback return is more than CommandCost and the proc takes all return values. return &UnpackNetworkCommand<Tcmd, Tcb>; } else { return nullptr; |