summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lutz <michi@icosahedron.de>2021-12-20 16:59:07 +0100
committerMichael Lutz <michi@icosahedron.de>2021-12-20 23:32:23 +0100
commitb11bd185e3c656c08e3f3d57eb2ada15b7ac276d (patch)
treeb3bb8a82353c1d494d2d1d1aeebb4e4a14877e4d
parent9c18236f2c691cf4f21693f2693256a31faafae8 (diff)
downloadopenttd-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.h3
-rw-r--r--src/network/network_command.cpp5
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;