15 #ifndef RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
16 #define RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
23 #include <type_traits>
27 #include "rosidl_runtime_cpp/traits.hpp"
28 #include "tracetools/tracetools.h"
29 #include "tracetools/utils.hpp"
31 #include "rclcpp/allocator/allocator_common.hpp"
32 #include "rclcpp/detail/subscription_callback_type_helper.hpp"
33 #include "rclcpp/function_traits.hpp"
34 #include "rclcpp/message_info.hpp"
35 #include "rclcpp/serialization.hpp"
36 #include "rclcpp/serialized_message.hpp"
37 #include "rclcpp/type_adapter.hpp"
46 inline constexpr
bool always_false_v =
false;
48 template<
typename MessageT,
typename AllocatorT>
51 using AllocTraits = allocator::AllocRebind<MessageT, AllocatorT>;
52 using Alloc =
typename AllocTraits::allocator_type;
53 using Deleter = allocator::Deleter<Alloc, MessageT>;
57 template<
typename MessageT,
typename AllocatorT>
63 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
65 using SubscribedMessageDeleter =
66 typename MessageDeleterHelper<SubscribedType, AllocatorT>::Deleter;
67 using ROSMessageDeleter =
68 typename MessageDeleterHelper<ROSMessageType, AllocatorT>::Deleter;
69 using SerializedMessageDeleter =
70 typename MessageDeleterHelper<rclcpp::SerializedMessage, AllocatorT>::Deleter;
72 using ConstRefCallback =
74 using ConstRefROSMessageCallback =
76 using ConstRefWithInfoCallback =
78 using ConstRefWithInfoROSMessageCallback =
80 using ConstRefSerializedMessageCallback =
82 using ConstRefSerializedMessageWithInfoCallback =
85 using UniquePtrCallback =
86 std::function<void (std::unique_ptr<SubscribedType, SubscribedMessageDeleter>)>;
87 using UniquePtrROSMessageCallback =
88 std::function<void (std::unique_ptr<ROSMessageType, ROSMessageDeleter>)>;
89 using UniquePtrWithInfoCallback =
91 std::unique_ptr<SubscribedType, SubscribedMessageDeleter>,
93 using UniquePtrWithInfoROSMessageCallback =
95 std::unique_ptr<ROSMessageType, ROSMessageDeleter>,
97 using UniquePtrSerializedMessageCallback =
98 std::function<void (std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>)>;
99 using UniquePtrSerializedMessageWithInfoCallback =
101 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>,
104 using SharedConstPtrCallback =
105 std::function<void (std::shared_ptr<const SubscribedType>)>;
106 using SharedConstPtrROSMessageCallback =
107 std::function<void (std::shared_ptr<const ROSMessageType>)>;
108 using SharedConstPtrWithInfoCallback =
110 std::shared_ptr<const SubscribedType>,
112 using SharedConstPtrWithInfoROSMessageCallback =
114 std::shared_ptr<const ROSMessageType>,
116 using SharedConstPtrSerializedMessageCallback =
117 std::function<void (std::shared_ptr<const rclcpp::SerializedMessage>)>;
118 using SharedConstPtrSerializedMessageWithInfoCallback =
120 std::shared_ptr<const rclcpp::SerializedMessage>,
123 using ConstRefSharedConstPtrCallback =
124 std::function<void (
const std::shared_ptr<const SubscribedType> &)>;
125 using ConstRefSharedConstPtrROSMessageCallback =
126 std::function<void (
const std::shared_ptr<const ROSMessageType> &)>;
127 using ConstRefSharedConstPtrWithInfoCallback =
129 const std::shared_ptr<const SubscribedType> &,
131 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
133 const std::shared_ptr<const ROSMessageType> &,
135 using ConstRefSharedConstPtrSerializedMessageCallback =
136 std::function<void (
const std::shared_ptr<const rclcpp::SerializedMessage> &)>;
137 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
139 const std::shared_ptr<const rclcpp::SerializedMessage> &,
143 using SharedPtrCallback =
144 std::function<void (std::shared_ptr<SubscribedType>)>;
145 using SharedPtrROSMessageCallback =
146 std::function<void (std::shared_ptr<ROSMessageType>)>;
147 using SharedPtrWithInfoCallback =
149 using SharedPtrWithInfoROSMessageCallback =
151 std::shared_ptr<ROSMessageType>,
153 using SharedPtrSerializedMessageCallback =
154 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>;
155 using SharedPtrSerializedMessageWithInfoCallback =
156 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>,
const rclcpp::MessageInfo &)>;
169 template<
typename MessageT,
typename AllocatorT>
174 using variant_type = std::variant<
175 typename CallbackTypes::ConstRefCallback,
176 typename CallbackTypes::ConstRefWithInfoCallback,
177 typename CallbackTypes::ConstRefSerializedMessageCallback,
178 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
179 typename CallbackTypes::UniquePtrCallback,
180 typename CallbackTypes::UniquePtrWithInfoCallback,
181 typename CallbackTypes::UniquePtrSerializedMessageCallback,
182 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
183 typename CallbackTypes::SharedConstPtrCallback,
184 typename CallbackTypes::SharedConstPtrWithInfoCallback,
185 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
186 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
187 typename CallbackTypes::ConstRefSharedConstPtrCallback,
188 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
189 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
190 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
191 typename CallbackTypes::SharedPtrCallback,
192 typename CallbackTypes::SharedPtrWithInfoCallback,
193 typename CallbackTypes::SharedPtrSerializedMessageCallback,
194 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
199 template<
typename MessageT,
typename AllocatorT>
204 using variant_type = std::variant<
205 typename CallbackTypes::ConstRefCallback,
206 typename CallbackTypes::ConstRefROSMessageCallback,
207 typename CallbackTypes::ConstRefWithInfoCallback,
208 typename CallbackTypes::ConstRefWithInfoROSMessageCallback,
209 typename CallbackTypes::ConstRefSerializedMessageCallback,
210 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
211 typename CallbackTypes::UniquePtrCallback,
212 typename CallbackTypes::UniquePtrROSMessageCallback,
213 typename CallbackTypes::UniquePtrWithInfoCallback,
214 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback,
215 typename CallbackTypes::UniquePtrSerializedMessageCallback,
216 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
217 typename CallbackTypes::SharedConstPtrCallback,
218 typename CallbackTypes::SharedConstPtrROSMessageCallback,
219 typename CallbackTypes::SharedConstPtrWithInfoCallback,
220 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback,
221 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
222 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
223 typename CallbackTypes::ConstRefSharedConstPtrCallback,
224 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback,
225 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
226 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback,
227 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
228 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
229 typename CallbackTypes::SharedPtrCallback,
230 typename CallbackTypes::SharedPtrROSMessageCallback,
231 typename CallbackTypes::SharedPtrWithInfoCallback,
232 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback,
233 typename CallbackTypes::SharedPtrSerializedMessageCallback,
234 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
239 template<
typename MessageT,
typename AllocatorT>
244 using variant_type = std::variant<
245 typename CallbackTypes::ConstRefSerializedMessageCallback,
246 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
247 typename CallbackTypes::UniquePtrSerializedMessageCallback,
248 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
249 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
250 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
251 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
252 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
253 typename CallbackTypes::SharedPtrSerializedMessageCallback,
254 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
262 typename AllocatorT = std::allocator<void>
268 using SubscribedType =
typename rclcpp::TypeAdapter<MessageT>::custom_type;
270 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
276 using SubscribedTypeAllocatorTraits =
typename SubscribedTypeDeleterHelper::AllocTraits;
277 using SubscribedTypeAllocator =
typename SubscribedTypeDeleterHelper::Alloc;
278 using SubscribedTypeDeleter =
typename SubscribedTypeDeleterHelper::Deleter;
282 using ROSMessageTypeAllocatorTraits =
typename ROSMessageTypeDeleterHelper::AllocTraits;
283 using ROSMessageTypeAllocator =
typename ROSMessageTypeDeleterHelper::Alloc;
284 using ROSMessageTypeDeleter =
typename ROSMessageTypeDeleterHelper::Deleter;
288 using SerializedMessageAllocatorTraits =
typename SerializedMessageDeleterHelper::AllocTraits;
289 using SerializedMessageAllocator =
typename SerializedMessageDeleterHelper::Alloc;
290 using SerializedMessageDeleter =
typename SerializedMessageDeleterHelper::Deleter;
295 using ConstRefCallback =
296 typename CallbackTypes::ConstRefCallback;
297 using ConstRefROSMessageCallback =
298 typename CallbackTypes::ConstRefROSMessageCallback;
299 using ConstRefWithInfoCallback =
300 typename CallbackTypes::ConstRefWithInfoCallback;
301 using ConstRefWithInfoROSMessageCallback =
302 typename CallbackTypes::ConstRefWithInfoROSMessageCallback;
303 using ConstRefSerializedMessageCallback =
304 typename CallbackTypes::ConstRefSerializedMessageCallback;
305 using ConstRefSerializedMessageWithInfoCallback =
306 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback;
307 using UniquePtrCallback =
308 typename CallbackTypes::UniquePtrCallback;
309 using UniquePtrROSMessageCallback =
310 typename CallbackTypes::UniquePtrROSMessageCallback;
311 using UniquePtrWithInfoCallback =
312 typename CallbackTypes::UniquePtrWithInfoCallback;
313 using UniquePtrWithInfoROSMessageCallback =
314 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback;
315 using UniquePtrSerializedMessageCallback =
316 typename CallbackTypes::UniquePtrSerializedMessageCallback;
317 using UniquePtrSerializedMessageWithInfoCallback =
318 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback;
319 using SharedConstPtrCallback =
320 typename CallbackTypes::SharedConstPtrCallback;
321 using SharedConstPtrROSMessageCallback =
322 typename CallbackTypes::SharedConstPtrROSMessageCallback;
323 using SharedConstPtrWithInfoCallback =
324 typename CallbackTypes::SharedConstPtrWithInfoCallback;
325 using SharedConstPtrWithInfoROSMessageCallback =
326 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback;
327 using SharedConstPtrSerializedMessageCallback =
328 typename CallbackTypes::SharedConstPtrSerializedMessageCallback;
329 using SharedConstPtrSerializedMessageWithInfoCallback =
330 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback;
331 using ConstRefSharedConstPtrCallback =
332 typename CallbackTypes::ConstRefSharedConstPtrCallback;
333 using ConstRefSharedConstPtrROSMessageCallback =
334 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback;
335 using ConstRefSharedConstPtrWithInfoCallback =
336 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback;
337 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
338 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback;
339 using ConstRefSharedConstPtrSerializedMessageCallback =
340 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback;
341 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
342 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback;
343 using SharedPtrCallback =
344 typename CallbackTypes::SharedPtrCallback;
345 using SharedPtrROSMessageCallback =
346 typename CallbackTypes::SharedPtrROSMessageCallback;
347 using SharedPtrWithInfoCallback =
348 typename CallbackTypes::SharedPtrWithInfoCallback;
349 using SharedPtrWithInfoROSMessageCallback =
350 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback;
351 using SharedPtrSerializedMessageCallback =
352 typename CallbackTypes::SharedPtrSerializedMessageCallback;
353 using SharedPtrSerializedMessageWithInfoCallback =
354 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback;
359 NotNull(
const T * pointer_in,
const char * msg)
360 : pointer(pointer_in)
362 if (pointer ==
nullptr) {
363 throw std::invalid_argument(msg);
373 : subscribed_type_allocator_(allocator),
374 ros_message_type_allocator_(allocator)
376 allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
377 allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
381 : callback_variant_(other.callback_variant_),
382 callback_disabled_(other.callback_disabled_.load()),
383 subscribed_type_allocator_(other.subscribed_type_allocator_),
384 subscribed_type_deleter_(other.subscribed_type_deleter_),
385 ros_message_type_allocator_(other.ros_message_type_allocator_),
386 ros_message_type_deleter_(other.ros_message_type_deleter_),
387 serialized_message_allocator_(other.serialized_message_allocator_),
388 serialized_message_deleter_(other.serialized_message_deleter_)
390 allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
391 allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
400 template<
typename CallbackT>
411 constexpr
auto is_deprecated =
413 typename scbth::callback_type,
414 std::function<void(std::shared_ptr<SubscribedType>)>
417 typename scbth::callback_type,
421 typename scbth::callback_type,
422 std::function<void(std::shared_ptr<ROSMessageType>)>
425 typename scbth::callback_type,
429 typename scbth::callback_type,
430 std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>
433 typename scbth::callback_type,
434 std::function<void(std::shared_ptr<rclcpp::SerializedMessage>,
const rclcpp::MessageInfo &)>
439 if constexpr (is_deprecated) {
441 set_deprecated(
static_cast<typename scbth::callback_type
>(callback));
444 callback_variant_ =
static_cast<typename scbth::callback_type
>(callback);
452 template<
typename SetT>
454 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
456 [[deprecated(
"use 'void(std::shared_ptr<const MessageT>)' instead")]]
462 callback_variant_ = callback;
466 template<
typename SetT>
468 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
471 "use 'void(std::shared_ptr<const MessageT>, const rclcpp::MessageInfo &)' instead"
478 callback_variant_ = callback;
484 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
485 callback_disabled_.store(
true);
491 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
492 callback_disabled_.store(
false);
495 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
496 create_ros_unique_ptr_from_ros_shared_ptr_message(
497 const std::shared_ptr<const ROSMessageType> & message)
499 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
500 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr, *message);
501 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
504 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>
505 create_serialized_message_unique_ptr_from_shared_ptr(
506 const std::shared_ptr<const rclcpp::SerializedMessage> & serialized_message)
508 auto ptr = SerializedMessageAllocatorTraits::allocate(serialized_message_allocator_, 1);
509 SerializedMessageAllocatorTraits::construct(
510 serialized_message_allocator_, ptr, *serialized_message);
511 return std::unique_ptr<
513 SerializedMessageDeleter
514 >(ptr, serialized_message_deleter_);
517 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
518 create_custom_unique_ptr_from_custom_shared_ptr_message(
519 const std::shared_ptr<const SubscribedType> & message)
521 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
522 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr, *message);
523 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
526 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
527 convert_ros_message_to_custom_type_unique_ptr(
const ROSMessageType & msg)
530 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
531 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr);
533 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
535 throw std::runtime_error(
536 "convert_ros_message_to_custom_type_unique_ptr "
537 "unexpectedly called without TypeAdapter");
541 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
542 convert_custom_type_to_ros_message_unique_ptr(
const SubscribedType & msg)
545 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
546 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr);
548 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
552 "convert_custom_type_to_ros_message_unique_ptr() "
553 "unexpectedly called without specialized TypeAdapter");
558 template<
typename TMsg = ROSMessageType>
559 typename std::enable_if<!serialization_traits::is_serialized_message_class<TMsg>::value,
562 std::shared_ptr<ROSMessageType> message,
565 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
566 if (callback_disabled_.load()) {
569 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
571 if (callback_variant_.index() == 0) {
572 if (std::get<0>(callback_variant_) ==
nullptr) {
574 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
579 [&message, &message_info,
this](
auto && callback) {
580 using T = std::decay_t<decltype(callback)>;
584 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
590 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
591 callback(*local_message);
592 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
593 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
594 callback(*local_message, message_info);
595 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrCallback>) {
596 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
597 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrWithInfoCallback>) {
598 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
599 }
else if constexpr (
601 std::is_same_v<T, SharedConstPtrCallback>||
602 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
603 std::is_same_v<T, SharedPtrCallback>
606 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
607 }
else if constexpr (
609 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
610 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
611 std::is_same_v<T, SharedPtrWithInfoCallback>
614 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
617 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
619 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
620 callback(*message, message_info);
621 }
else if constexpr (std::is_same_v<T, UniquePtrROSMessageCallback>) {
622 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
623 }
else if constexpr (std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>) {
624 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
625 }
else if constexpr (
626 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
627 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
628 std::is_same_v<T, SharedPtrROSMessageCallback>)
631 }
else if constexpr (
632 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
633 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
634 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
636 callback(message, message_info);
640 std::is_same_v<T, ConstRefSerializedMessageCallback>||
641 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
642 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
643 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
644 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
645 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
646 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
647 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
648 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
649 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
651 throw std::runtime_error(
652 "Cannot dispatch std::shared_ptr<ROSMessageType> message "
653 "to rclcpp::SerializedMessage");
657 static_assert(detail::always_false_v<T>,
"unhandled callback type");
659 }, callback_variant_);
660 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
666 std::shared_ptr<const rclcpp::SerializedMessage> serialized_message,
669 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
670 if (callback_disabled_.load()) {
673 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
675 if (callback_variant_.index() == 0) {
676 if (std::get<0>(callback_variant_) ==
nullptr) {
678 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
683 [&serialized_message, &message_info,
this](
auto && callback) {
684 using T = std::decay_t<decltype(callback)>;
687 if constexpr (std::is_same_v<T, ConstRefSerializedMessageCallback>) {
688 callback(*serialized_message);
689 }
else if constexpr (std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>) {
690 callback(*serialized_message, message_info);
691 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageCallback>) {
692 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
693 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>) {
695 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
697 }
else if constexpr (
698 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
699 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
700 std::is_same_v<T, SharedPtrSerializedMessageCallback>)
702 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
703 }
else if constexpr (
704 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
705 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
706 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
709 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
714 std::is_same_v<T, ConstRefCallback>||
715 std::is_same_v<T, ConstRefROSMessageCallback>||
716 std::is_same_v<T, ConstRefWithInfoCallback>||
717 std::is_same_v<T, ConstRefWithInfoROSMessageCallback>||
718 std::is_same_v<T, UniquePtrCallback>||
719 std::is_same_v<T, UniquePtrROSMessageCallback>||
720 std::is_same_v<T, UniquePtrWithInfoCallback>||
721 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
722 std::is_same_v<T, SharedConstPtrCallback>||
723 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
724 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
725 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
726 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
727 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
728 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
729 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
730 std::is_same_v<T, SharedPtrCallback>||
731 std::is_same_v<T, SharedPtrROSMessageCallback>||
732 std::is_same_v<T, SharedPtrWithInfoCallback>||
733 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
735 throw std::runtime_error(
736 "cannot dispatch rclcpp::SerializedMessage to "
737 "non-rclcpp::SerializedMessage callbacks");
741 static_assert(detail::always_false_v<T>,
"unhandled callback type");
743 }, callback_variant_);
744 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
748 dispatch_intra_process(
749 std::shared_ptr<const SubscribedType> message,
752 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
753 if (callback_disabled_.load()) {
756 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
758 if (callback_variant_.index() == 0) {
759 if (std::get<0>(callback_variant_) ==
nullptr) {
761 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
766 [&message, &message_info,
this](
auto && callback) {
767 using T = std::decay_t<decltype(callback)>;
771 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
773 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
774 callback(*message, message_info);
775 }
else if constexpr (
777 std::is_same_v<T, UniquePtrCallback>||
778 std::is_same_v<T, SharedPtrCallback>
781 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message));
782 }
else if constexpr (
784 std::is_same_v<T, UniquePtrWithInfoCallback>||
785 std::is_same_v<T, SharedPtrWithInfoCallback>
788 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message), message_info);
789 }
else if constexpr (
791 std::is_same_v<T, SharedConstPtrCallback>||
792 std::is_same_v<T, ConstRefSharedConstPtrCallback>
796 }
else if constexpr (
798 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
799 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
802 callback(message, message_info);
805 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
806 if constexpr (is_ta) {
807 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
812 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
813 if constexpr (is_ta) {
814 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
815 callback(*local, message_info);
817 callback(*message, message_info);
819 }
else if constexpr (
820 std::is_same_v<T, UniquePtrROSMessageCallback>||
821 std::is_same_v<T, SharedPtrROSMessageCallback>)
823 if constexpr (is_ta) {
824 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
826 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
828 }
else if constexpr (
829 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
830 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
832 if constexpr (is_ta) {
833 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
835 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
837 }
else if constexpr (
838 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
839 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
841 if constexpr (is_ta) {
842 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
846 }
else if constexpr (
847 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
848 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
850 if constexpr (is_ta) {
851 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
853 callback(message, message_info);
858 std::is_same_v<T, ConstRefSerializedMessageCallback>||
859 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
860 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
861 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
862 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
863 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
864 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
865 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
866 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
867 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
869 throw std::runtime_error(
870 "Cannot dispatch std::shared_ptr<const ROSMessageType> message "
871 "to rclcpp::SerializedMessage");
875 static_assert(detail::always_false_v<T>,
"unhandled callback type");
877 }, callback_variant_);
878 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
882 dispatch_intra_process(
883 std::unique_ptr<SubscribedType, SubscribedTypeDeleter> message,
886 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
887 if (callback_disabled_.load()) {
890 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
892 if (callback_variant_.index() == 0) {
893 if (std::get<0>(callback_variant_) ==
nullptr) {
895 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
900 [&message, &message_info,
this](
auto && callback) {
906 using T = std::decay_t<decltype(callback)>;
910 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
912 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
913 callback(*message, message_info);
914 }
else if constexpr (
916 std::is_same_v<T, UniquePtrCallback>||
917 std::is_same_v<T, SharedPtrCallback>))
919 callback(std::move(message));
920 }
else if constexpr (
922 std::is_same_v<T, UniquePtrWithInfoCallback>||
923 std::is_same_v<T, SharedPtrWithInfoCallback>
926 callback(std::move(message), message_info);
927 }
else if constexpr (
929 std::is_same_v<T, SharedConstPtrCallback>||
930 std::is_same_v<T, ConstRefSharedConstPtrCallback>
933 callback(std::move(message));
934 }
else if constexpr (
936 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
937 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
940 callback(std::move(message), message_info);
943 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
944 if constexpr (is_ta) {
945 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
950 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
951 if constexpr (is_ta) {
952 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
953 callback(*local, message_info);
955 callback(*message, message_info);
957 }
else if constexpr (
958 std::is_same_v<T, UniquePtrROSMessageCallback>||
959 std::is_same_v<T, SharedPtrROSMessageCallback>)
961 if constexpr (is_ta) {
962 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
964 callback(std::move(message));
966 }
else if constexpr (
967 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
968 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
970 if constexpr (is_ta) {
971 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
973 callback(std::move(message), message_info);
975 }
else if constexpr (
976 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
977 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
979 if constexpr (is_ta) {
980 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
982 callback(std::move(message));
984 }
else if constexpr (
985 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
986 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
988 if constexpr (is_ta) {
989 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
991 callback(std::move(message), message_info);
996 std::is_same_v<T, ConstRefSerializedMessageCallback>||
997 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
998 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
999 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
1000 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
1001 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
1002 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
1003 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
1004 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
1005 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
1007 throw std::runtime_error(
1008 "Cannot dispatch std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter> message "
1009 "to rclcpp::SerializedMessage");
1013 static_assert(detail::always_false_v<T>,
"unhandled callback type");
1015 }, callback_variant_);
1016 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
1021 use_take_shared_method()
const
1024 std::holds_alternative<SharedConstPtrCallback>(callback_variant_) ||
1025 std::holds_alternative<SharedConstPtrWithInfoCallback>(callback_variant_) ||
1026 std::holds_alternative<ConstRefSharedConstPtrCallback>(callback_variant_) ||
1027 std::holds_alternative<ConstRefSharedConstPtrWithInfoCallback>(callback_variant_) ||
1028 std::holds_alternative<ConstRefCallback>(callback_variant_) ||
1029 std::holds_alternative<ConstRefWithInfoCallback>(callback_variant_);
1034 is_serialized_message_callback()
const
1037 std::holds_alternative<ConstRefSerializedMessageCallback>(callback_variant_) ||
1038 std::holds_alternative<UniquePtrSerializedMessageCallback>(callback_variant_) ||
1039 std::holds_alternative<SharedConstPtrSerializedMessageCallback>(callback_variant_) ||
1040 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageCallback>(callback_variant_) ||
1041 std::holds_alternative<SharedPtrSerializedMessageCallback>(callback_variant_) ||
1042 std::holds_alternative<ConstRefSerializedMessageWithInfoCallback>(callback_variant_) ||
1043 std::holds_alternative<UniquePtrSerializedMessageWithInfoCallback>(callback_variant_) ||
1044 std::holds_alternative<SharedConstPtrSerializedMessageWithInfoCallback>(callback_variant_) ||
1045 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageWithInfoCallback>(
1046 callback_variant_) ||
1047 std::holds_alternative<SharedPtrSerializedMessageWithInfoCallback>(callback_variant_);
1051 register_callback_for_tracing()
1053 #ifndef TRACETOOLS_DISABLED
1055 [
this](
auto && callback) {
1056 if (TRACETOOLS_TRACEPOINT_ENABLED(rclcpp_callback_register)) {
1057 char * symbol = tracetools::get_symbol(callback);
1058 TRACETOOLS_DO_TRACEPOINT(
1059 rclcpp_callback_register,
1060 static_cast<const void *
>(
this),
1064 }, callback_variant_);
1068 typename HelperT::variant_type &
1071 return callback_variant_;
1074 const typename HelperT::variant_type &
1077 return callback_variant_;
1085 typename HelperT::variant_type callback_variant_;
1086 std::recursive_mutex callback_mutex_;
1087 std::atomic_bool callback_disabled_{
false};
1089 SubscribedTypeAllocator subscribed_type_allocator_;
1090 SubscribedTypeDeleter subscribed_type_deleter_;
1091 ROSMessageTypeAllocator ros_message_type_allocator_;
1092 ROSMessageTypeDeleter ros_message_type_deleter_;
1093 SerializedMessageAllocator serialized_message_allocator_;
1094 SerializedMessageDeleter serialized_message_deleter_;
AnySubscriptionCallback< MessageT, AllocatorT > set(CallbackT callback)
Generic function for setting the callback.
void set_deprecated(std::function< void(std::shared_ptr< SetT >, const rclcpp::MessageInfo &)> callback)
Function for shared_ptr to non-const MessageT with MessageInfo, which is deprecated.
void disable()
Disable the callback from being called during dispatch.
void set_deprecated(std::function< void(std::shared_ptr< SetT >)> callback)
Function for shared_ptr to non-const MessageT, which is deprecated.
void enable()
Enable the callback to be called during dispatch.
Additional meta data about messages taken from subscriptions.
Object oriented version of rcl_serialized_message_t with destructor to avoid memory leaks.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
Template structure used to adapt custom, user-defined types to ROS types.
Template helper to select the variant type based on whether or not MessageT is a TypeAdapter.
Struct which contains all possible callback signatures, with or without a TypeAdapter....
typename rclcpp::TypeAdapter< MessageT >::custom_type SubscribedType
MessageT::custom_type if MessageT is a TypeAdapter, otherwise just MessageT.
typename rclcpp::TypeAdapter< MessageT >::ros_message_type ROSMessageType
MessageT::ros_message_type if MessageT is a TypeAdapter, otherwise just MessageT.
Template metaprogramming helper used to resolve the callback argument into a std::function.