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 "rmw/types.h"
27 #include "tracetools/tracetools.h"
28 #include "tracetools/utils.hpp"
35 template<
typename T,
typename =
void>
44 decltype(std::declval<T>() == nullptr)>>: std::true_type {};
47 decltype(std::declval<T>() == nullptr), decltype(std::declval<T &>() = nullptr)>>
53 template<
typename ServiceT>
56 template<
typename ServiceT>
61 : callback_(std::monostate{})
66 typename std::enable_if_t<!detail::can_be_nullptr<CallbackT>::value,
int> = 0>
68 set(CallbackT && callback)
77 callback_.template emplace<SharedPtrCallback>(callback);
81 SharedPtrWithRequestHeaderCallback
84 callback_.template emplace<SharedPtrWithRequestHeaderCallback>(callback);
88 SharedPtrDeferResponseCallback
91 callback_.template emplace<SharedPtrDeferResponseCallback>(callback);
95 SharedPtrDeferResponseCallbackWithServiceHandle
98 callback_.template emplace<SharedPtrDeferResponseCallbackWithServiceHandle>(callback);
102 callback_ = std::forward<CallbackT>(callback);
108 typename std::enable_if_t<detail::can_be_nullptr<CallbackT>::value,
int> = 0>
110 set(CallbackT && callback)
113 throw std::invalid_argument(
"AnyServiceCallback::set(): callback cannot be nullptr");
122 callback_.template emplace<SharedPtrCallback>(callback);
123 }
else if constexpr (
126 SharedPtrWithRequestHeaderCallback
129 callback_.template emplace<SharedPtrWithRequestHeaderCallback>(callback);
130 }
else if constexpr (
133 SharedPtrDeferResponseCallback
136 callback_.template emplace<SharedPtrDeferResponseCallback>(callback);
137 }
else if constexpr (
140 SharedPtrDeferResponseCallbackWithServiceHandle
143 callback_.template emplace<SharedPtrDeferResponseCallbackWithServiceHandle>(callback);
147 callback_ = std::forward<CallbackT>(callback);
152 std::shared_ptr<typename ServiceT::Response>
155 const std::shared_ptr<rmw_request_id_t> & request_header,
156 std::shared_ptr<typename ServiceT::Request> request)
158 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
159 if (std::holds_alternative<std::monostate>(callback_)) {
162 throw std::runtime_error{
"unexpected request without any callback set"};
164 if (std::holds_alternative<SharedPtrDeferResponseCallback>(callback_)) {
165 const auto & cb = std::get<SharedPtrDeferResponseCallback>(callback_);
166 cb(request_header, std::move(request));
167 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
170 if (std::holds_alternative<SharedPtrDeferResponseCallbackWithServiceHandle>(callback_)) {
171 const auto & cb = std::get<SharedPtrDeferResponseCallbackWithServiceHandle>(callback_);
172 cb(service_handle, request_header, std::move(request));
173 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
177 auto response = std::make_shared<typename ServiceT::Response>();
178 if (std::holds_alternative<SharedPtrCallback>(callback_)) {
179 (void)request_header;
180 const auto & cb = std::get<SharedPtrCallback>(callback_);
181 cb(std::move(request), response);
182 }
else if (std::holds_alternative<SharedPtrWithRequestHeaderCallback>(callback_)) {
183 const auto & cb = std::get<SharedPtrWithRequestHeaderCallback>(callback_);
184 cb(request_header, std::move(request), response);
186 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
190 void register_callback_for_tracing()
192 #ifndef TRACETOOLS_DISABLED
194 [
this](
auto && arg) {
195 if (TRACETOOLS_TRACEPOINT_ENABLED(rclcpp_callback_register)) {
196 char * symbol = tracetools::get_symbol(arg);
197 TRACETOOLS_DO_TRACEPOINT(
198 rclcpp_callback_register,
199 static_cast<const void *
>(
this),
208 using SharedPtrCallback = std::function<
210 std::shared_ptr<typename ServiceT::Request>,
211 std::shared_ptr<typename ServiceT::Response>
213 using SharedPtrWithRequestHeaderCallback = std::function<
215 std::shared_ptr<rmw_request_id_t>,
216 std::shared_ptr<typename ServiceT::Request>,
217 std::shared_ptr<typename ServiceT::Response>
219 using SharedPtrDeferResponseCallback = std::function<
221 std::shared_ptr<rmw_request_id_t>,
222 std::shared_ptr<typename ServiceT::Request>
224 using SharedPtrDeferResponseCallbackWithServiceHandle = std::function<
227 std::shared_ptr<rmw_request_id_t>,
228 std::shared_ptr<typename ServiceT::Request>
234 SharedPtrWithRequestHeaderCallback,
235 SharedPtrDeferResponseCallback,
236 SharedPtrDeferResponseCallbackWithServiceHandle> callback_;
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.