15 #ifndef RCLCPP__ANY_SERVICE_CALLBACK_HPP_
16 #define RCLCPP__ANY_SERVICE_CALLBACK_HPP_
22 #include <type_traits>
25 #include "rclcpp/function_traits.hpp"
26 #include "rclcpp/visibility_control.hpp"
27 #include "rmw/types.h"
28 #include "tracetools/tracetools.h"
29 #include "tracetools/utils.hpp"
36 template<
typename T,
typename =
void>
45 decltype(std::declval<T>() == nullptr)>>: std::true_type {};
48 decltype(std::declval<T>() == nullptr), decltype(std::declval<T &>() = nullptr)>>
54 template<
typename ServiceT>
57 template<
typename ServiceT>
62 : callback_(std::monostate{})
67 typename std::enable_if_t<!detail::can_be_nullptr<CallbackT>::value,
int> = 0>
69 set(CallbackT && callback)
78 callback_.template emplace<SharedPtrCallback>(callback);
82 SharedPtrWithRequestHeaderCallback
85 callback_.template emplace<SharedPtrWithRequestHeaderCallback>(callback);
89 SharedPtrDeferResponseCallback
92 callback_.template emplace<SharedPtrDeferResponseCallback>(callback);
96 SharedPtrDeferResponseCallbackWithServiceHandle
99 callback_.template emplace<SharedPtrDeferResponseCallbackWithServiceHandle>(callback);
103 callback_ = std::forward<CallbackT>(callback);
109 typename std::enable_if_t<detail::can_be_nullptr<CallbackT>::value,
int> = 0>
111 set(CallbackT && callback)
114 throw std::invalid_argument(
"AnyServiceCallback::set(): callback cannot be nullptr");
123 callback_.template emplace<SharedPtrCallback>(callback);
124 }
else if constexpr (
127 SharedPtrWithRequestHeaderCallback
130 callback_.template emplace<SharedPtrWithRequestHeaderCallback>(callback);
131 }
else if constexpr (
134 SharedPtrDeferResponseCallback
137 callback_.template emplace<SharedPtrDeferResponseCallback>(callback);
138 }
else if constexpr (
141 SharedPtrDeferResponseCallbackWithServiceHandle
144 callback_.template emplace<SharedPtrDeferResponseCallbackWithServiceHandle>(callback);
148 callback_ = std::forward<CallbackT>(callback);
153 std::shared_ptr<typename ServiceT::Response>
156 const std::shared_ptr<rmw_request_id_t> & request_header,
157 std::shared_ptr<typename ServiceT::Request> request)
159 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
160 if (std::holds_alternative<std::monostate>(callback_)) {
163 throw std::runtime_error{
"unexpected request without any callback set"};
165 if (std::holds_alternative<SharedPtrDeferResponseCallback>(callback_)) {
166 const auto & cb = std::get<SharedPtrDeferResponseCallback>(callback_);
167 cb(request_header, std::move(request));
168 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
171 if (std::holds_alternative<SharedPtrDeferResponseCallbackWithServiceHandle>(callback_)) {
172 const auto & cb = std::get<SharedPtrDeferResponseCallbackWithServiceHandle>(callback_);
173 cb(service_handle, request_header, std::move(request));
174 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
178 auto response = std::make_shared<typename ServiceT::Response>();
179 if (std::holds_alternative<SharedPtrCallback>(callback_)) {
180 (void)request_header;
181 const auto & cb = std::get<SharedPtrCallback>(callback_);
182 cb(std::move(request), response);
183 }
else if (std::holds_alternative<SharedPtrWithRequestHeaderCallback>(callback_)) {
184 const auto & cb = std::get<SharedPtrWithRequestHeaderCallback>(callback_);
185 cb(request_header, std::move(request), response);
187 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
191 void register_callback_for_tracing()
193 #ifndef TRACETOOLS_DISABLED
195 [
this](
auto && arg) {
196 if (TRACETOOLS_TRACEPOINT_ENABLED(rclcpp_callback_register)) {
197 char * symbol = tracetools::get_symbol(arg);
198 TRACETOOLS_DO_TRACEPOINT(
199 rclcpp_callback_register,
200 static_cast<const void *
>(
this),
209 using SharedPtrCallback = std::function<
211 std::shared_ptr<typename ServiceT::Request>,
212 std::shared_ptr<typename ServiceT::Response>
214 using SharedPtrWithRequestHeaderCallback = std::function<
216 std::shared_ptr<rmw_request_id_t>,
217 std::shared_ptr<typename ServiceT::Request>,
218 std::shared_ptr<typename ServiceT::Response>
220 using SharedPtrDeferResponseCallback = std::function<
222 std::shared_ptr<rmw_request_id_t>,
223 std::shared_ptr<typename ServiceT::Request>
225 using SharedPtrDeferResponseCallbackWithServiceHandle = std::function<
228 std::shared_ptr<rmw_request_id_t>,
229 std::shared_ptr<typename ServiceT::Request>
235 SharedPtrWithRequestHeaderCallback,
236 SharedPtrDeferResponseCallback,
237 SharedPtrDeferResponseCallbackWithServiceHandle> callback_;
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.