diff options
Diffstat (limited to 'src')
-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; |