15 #ifndef RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
16 #define RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
23 #include <type_traits>
27 #include "tracetools/tracetools.h"
28 #include "tracetools/utils.hpp"
30 #include "rclcpp/allocator/allocator_common.hpp"
31 #include "rclcpp/detail/subscription_callback_type_helper.hpp"
32 #include "rclcpp/function_traits.hpp"
33 #include "rclcpp/message_info.hpp"
34 #include "rclcpp/serialization.hpp"
35 #include "rclcpp/serialized_message.hpp"
36 #include "rclcpp/type_adapter.hpp"
45 inline constexpr
bool always_false_v =
false;
47 template<
typename MessageT,
typename AllocatorT>
50 using AllocTraits = allocator::AllocRebind<MessageT, AllocatorT>;
51 using Alloc =
typename AllocTraits::allocator_type;
52 using Deleter = allocator::Deleter<Alloc, MessageT>;
56 template<
typename MessageT,
typename AllocatorT>
62 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
64 using SubscribedMessageDeleter =
65 typename MessageDeleterHelper<SubscribedType, AllocatorT>::Deleter;
66 using ROSMessageDeleter =
67 typename MessageDeleterHelper<ROSMessageType, AllocatorT>::Deleter;
68 using SerializedMessageDeleter =
69 typename MessageDeleterHelper<rclcpp::SerializedMessage, AllocatorT>::Deleter;
71 using ConstRefCallback =
73 using ConstRefROSMessageCallback =
75 using ConstRefWithInfoCallback =
77 using ConstRefWithInfoROSMessageCallback =
79 using ConstRefSerializedMessageCallback =
81 using ConstRefSerializedMessageWithInfoCallback =
84 using UniquePtrCallback =
85 std::function<void (std::unique_ptr<SubscribedType, SubscribedMessageDeleter>)>;
86 using UniquePtrROSMessageCallback =
87 std::function<void (std::unique_ptr<ROSMessageType, ROSMessageDeleter>)>;
88 using UniquePtrWithInfoCallback =
90 std::unique_ptr<SubscribedType, SubscribedMessageDeleter>,
92 using UniquePtrWithInfoROSMessageCallback =
94 std::unique_ptr<ROSMessageType, ROSMessageDeleter>,
96 using UniquePtrSerializedMessageCallback =
97 std::function<void (std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>)>;
98 using UniquePtrSerializedMessageWithInfoCallback =
100 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>,
103 using SharedConstPtrCallback =
104 std::function<void (std::shared_ptr<const SubscribedType>)>;
105 using SharedConstPtrROSMessageCallback =
106 std::function<void (std::shared_ptr<const ROSMessageType>)>;
107 using SharedConstPtrWithInfoCallback =
109 std::shared_ptr<const SubscribedType>,
111 using SharedConstPtrWithInfoROSMessageCallback =
113 std::shared_ptr<const ROSMessageType>,
115 using SharedConstPtrSerializedMessageCallback =
116 std::function<void (std::shared_ptr<const rclcpp::SerializedMessage>)>;
117 using SharedConstPtrSerializedMessageWithInfoCallback =
119 std::shared_ptr<const rclcpp::SerializedMessage>,
122 using ConstRefSharedConstPtrCallback =
123 std::function<void (
const std::shared_ptr<const SubscribedType> &)>;
124 using ConstRefSharedConstPtrROSMessageCallback =
125 std::function<void (
const std::shared_ptr<const ROSMessageType> &)>;
126 using ConstRefSharedConstPtrWithInfoCallback =
128 const std::shared_ptr<const SubscribedType> &,
130 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
132 const std::shared_ptr<const ROSMessageType> &,
134 using ConstRefSharedConstPtrSerializedMessageCallback =
135 std::function<void (
const std::shared_ptr<const rclcpp::SerializedMessage> &)>;
136 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
138 const std::shared_ptr<const rclcpp::SerializedMessage> &,
142 using SharedPtrCallback =
143 std::function<void (std::shared_ptr<SubscribedType>)>;
144 using SharedPtrROSMessageCallback =
145 std::function<void (std::shared_ptr<ROSMessageType>)>;
146 using SharedPtrWithInfoCallback =
148 using SharedPtrWithInfoROSMessageCallback =
150 std::shared_ptr<ROSMessageType>,
152 using SharedPtrSerializedMessageCallback =
153 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>;
154 using SharedPtrSerializedMessageWithInfoCallback =
155 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>,
const rclcpp::MessageInfo &)>;
168 template<
typename MessageT,
typename AllocatorT>
173 using variant_type = std::variant<
174 typename CallbackTypes::ConstRefCallback,
175 typename CallbackTypes::ConstRefWithInfoCallback,
176 typename CallbackTypes::ConstRefSerializedMessageCallback,
177 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
178 typename CallbackTypes::UniquePtrCallback,
179 typename CallbackTypes::UniquePtrWithInfoCallback,
180 typename CallbackTypes::UniquePtrSerializedMessageCallback,
181 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
182 typename CallbackTypes::SharedConstPtrCallback,
183 typename CallbackTypes::SharedConstPtrWithInfoCallback,
184 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
185 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
186 typename CallbackTypes::ConstRefSharedConstPtrCallback,
187 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
188 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
189 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
190 typename CallbackTypes::SharedPtrCallback,
191 typename CallbackTypes::SharedPtrWithInfoCallback,
192 typename CallbackTypes::SharedPtrSerializedMessageCallback,
193 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
198 template<
typename MessageT,
typename AllocatorT>
203 using variant_type = std::variant<
204 typename CallbackTypes::ConstRefCallback,
205 typename CallbackTypes::ConstRefROSMessageCallback,
206 typename CallbackTypes::ConstRefWithInfoCallback,
207 typename CallbackTypes::ConstRefWithInfoROSMessageCallback,
208 typename CallbackTypes::ConstRefSerializedMessageCallback,
209 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
210 typename CallbackTypes::UniquePtrCallback,
211 typename CallbackTypes::UniquePtrROSMessageCallback,
212 typename CallbackTypes::UniquePtrWithInfoCallback,
213 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback,
214 typename CallbackTypes::UniquePtrSerializedMessageCallback,
215 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
216 typename CallbackTypes::SharedConstPtrCallback,
217 typename CallbackTypes::SharedConstPtrROSMessageCallback,
218 typename CallbackTypes::SharedConstPtrWithInfoCallback,
219 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback,
220 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
221 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
222 typename CallbackTypes::ConstRefSharedConstPtrCallback,
223 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback,
224 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
225 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback,
226 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
227 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
228 typename CallbackTypes::SharedPtrCallback,
229 typename CallbackTypes::SharedPtrROSMessageCallback,
230 typename CallbackTypes::SharedPtrWithInfoCallback,
231 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback,
232 typename CallbackTypes::SharedPtrSerializedMessageCallback,
233 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
238 template<
typename MessageT,
typename AllocatorT>
243 using variant_type = std::variant<
244 typename CallbackTypes::ConstRefSerializedMessageCallback,
245 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
246 typename CallbackTypes::UniquePtrSerializedMessageCallback,
247 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
248 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
249 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
250 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
251 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
252 typename CallbackTypes::SharedPtrSerializedMessageCallback,
253 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
261 typename AllocatorT = std::allocator<void>
267 using SubscribedType =
typename rclcpp::TypeAdapter<MessageT>::custom_type;
269 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
275 using SubscribedTypeAllocatorTraits =
typename SubscribedTypeDeleterHelper::AllocTraits;
276 using SubscribedTypeAllocator =
typename SubscribedTypeDeleterHelper::Alloc;
277 using SubscribedTypeDeleter =
typename SubscribedTypeDeleterHelper::Deleter;
281 using ROSMessageTypeAllocatorTraits =
typename ROSMessageTypeDeleterHelper::AllocTraits;
282 using ROSMessageTypeAllocator =
typename ROSMessageTypeDeleterHelper::Alloc;
283 using ROSMessageTypeDeleter =
typename ROSMessageTypeDeleterHelper::Deleter;
287 using SerializedMessageAllocatorTraits =
typename SerializedMessageDeleterHelper::AllocTraits;
288 using SerializedMessageAllocator =
typename SerializedMessageDeleterHelper::Alloc;
289 using SerializedMessageDeleter =
typename SerializedMessageDeleterHelper::Deleter;
294 using ConstRefCallback =
295 typename CallbackTypes::ConstRefCallback;
296 using ConstRefROSMessageCallback =
297 typename CallbackTypes::ConstRefROSMessageCallback;
298 using ConstRefWithInfoCallback =
299 typename CallbackTypes::ConstRefWithInfoCallback;
300 using ConstRefWithInfoROSMessageCallback =
301 typename CallbackTypes::ConstRefWithInfoROSMessageCallback;
302 using ConstRefSerializedMessageCallback =
303 typename CallbackTypes::ConstRefSerializedMessageCallback;
304 using ConstRefSerializedMessageWithInfoCallback =
305 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback;
306 using UniquePtrCallback =
307 typename CallbackTypes::UniquePtrCallback;
308 using UniquePtrROSMessageCallback =
309 typename CallbackTypes::UniquePtrROSMessageCallback;
310 using UniquePtrWithInfoCallback =
311 typename CallbackTypes::UniquePtrWithInfoCallback;
312 using UniquePtrWithInfoROSMessageCallback =
313 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback;
314 using UniquePtrSerializedMessageCallback =
315 typename CallbackTypes::UniquePtrSerializedMessageCallback;
316 using UniquePtrSerializedMessageWithInfoCallback =
317 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback;
318 using SharedConstPtrCallback =
319 typename CallbackTypes::SharedConstPtrCallback;
320 using SharedConstPtrROSMessageCallback =
321 typename CallbackTypes::SharedConstPtrROSMessageCallback;
322 using SharedConstPtrWithInfoCallback =
323 typename CallbackTypes::SharedConstPtrWithInfoCallback;
324 using SharedConstPtrWithInfoROSMessageCallback =
325 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback;
326 using SharedConstPtrSerializedMessageCallback =
327 typename CallbackTypes::SharedConstPtrSerializedMessageCallback;
328 using SharedConstPtrSerializedMessageWithInfoCallback =
329 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback;
330 using ConstRefSharedConstPtrCallback =
331 typename CallbackTypes::ConstRefSharedConstPtrCallback;
332 using ConstRefSharedConstPtrROSMessageCallback =
333 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback;
334 using ConstRefSharedConstPtrWithInfoCallback =
335 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback;
336 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
337 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback;
338 using ConstRefSharedConstPtrSerializedMessageCallback =
339 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback;
340 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
341 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback;
342 using SharedPtrCallback =
343 typename CallbackTypes::SharedPtrCallback;
344 using SharedPtrROSMessageCallback =
345 typename CallbackTypes::SharedPtrROSMessageCallback;
346 using SharedPtrWithInfoCallback =
347 typename CallbackTypes::SharedPtrWithInfoCallback;
348 using SharedPtrWithInfoROSMessageCallback =
349 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback;
350 using SharedPtrSerializedMessageCallback =
351 typename CallbackTypes::SharedPtrSerializedMessageCallback;
352 using SharedPtrSerializedMessageWithInfoCallback =
353 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback;
358 NotNull(
const T * pointer_in,
const char * msg)
359 : pointer(pointer_in)
361 if (pointer ==
nullptr) {
362 throw std::invalid_argument(msg);
372 : subscribed_type_allocator_(allocator),
373 ros_message_type_allocator_(allocator)
375 allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
376 allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
380 : callback_variant_(other.callback_variant_),
381 callback_disabled_(other.callback_disabled_.load()),
382 subscribed_type_allocator_(other.subscribed_type_allocator_),
383 subscribed_type_deleter_(other.subscribed_type_deleter_),
384 ros_message_type_allocator_(other.ros_message_type_allocator_),
385 ros_message_type_deleter_(other.ros_message_type_deleter_),
386 serialized_message_allocator_(other.serialized_message_allocator_),
387 serialized_message_deleter_(other.serialized_message_deleter_)
389 allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
390 allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
399 template<
typename CallbackT>
410 constexpr
auto is_deprecated =
412 typename scbth::callback_type,
413 std::function<void(std::shared_ptr<SubscribedType>)>
416 typename scbth::callback_type,
420 typename scbth::callback_type,
421 std::function<void(std::shared_ptr<ROSMessageType>)>
424 typename scbth::callback_type,
428 typename scbth::callback_type,
429 std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>
432 typename scbth::callback_type,
433 std::function<void(std::shared_ptr<rclcpp::SerializedMessage>,
const rclcpp::MessageInfo &)>
438 if constexpr (is_deprecated) {
440 set_deprecated(
static_cast<typename scbth::callback_type
>(callback));
443 callback_variant_ =
static_cast<typename scbth::callback_type
>(callback);
451 template<
typename SetT>
453 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
455 [[deprecated(
"use 'void(std::shared_ptr<const MessageT>)' instead")]]
461 callback_variant_ = callback;
465 template<
typename SetT>
467 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
470 "use 'void(std::shared_ptr<const MessageT>, const rclcpp::MessageInfo &)' instead"
477 callback_variant_ = callback;
483 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
484 callback_disabled_.store(
true);
490 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
491 callback_disabled_.store(
false);
494 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
495 create_ros_unique_ptr_from_ros_shared_ptr_message(
496 const std::shared_ptr<const ROSMessageType> & message)
498 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
499 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr, *message);
500 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
503 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>
504 create_serialized_message_unique_ptr_from_shared_ptr(
505 const std::shared_ptr<const rclcpp::SerializedMessage> & serialized_message)
507 auto ptr = SerializedMessageAllocatorTraits::allocate(serialized_message_allocator_, 1);
508 SerializedMessageAllocatorTraits::construct(
509 serialized_message_allocator_, ptr, *serialized_message);
510 return std::unique_ptr<
512 SerializedMessageDeleter
513 >(ptr, serialized_message_deleter_);
516 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
517 create_custom_unique_ptr_from_custom_shared_ptr_message(
518 const std::shared_ptr<const SubscribedType> & message)
520 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
521 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr, *message);
522 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
525 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
526 convert_ros_message_to_custom_type_unique_ptr(
const ROSMessageType & msg)
529 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
530 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr);
532 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
534 throw std::runtime_error(
535 "convert_ros_message_to_custom_type_unique_ptr "
536 "unexpectedly called without TypeAdapter");
540 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
541 convert_custom_type_to_ros_message_unique_ptr(
const SubscribedType & msg)
544 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
545 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr);
547 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
551 "convert_custom_type_to_ros_message_unique_ptr() "
552 "unexpectedly called without specialized TypeAdapter");
557 template<
typename TMsg = ROSMessageType>
558 typename std::enable_if<!serialization_traits::is_serialized_message_class<TMsg>::value,
561 std::shared_ptr<ROSMessageType> message,
564 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
565 if (callback_disabled_.load()) {
568 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
570 if (callback_variant_.index() == 0) {
571 if (std::get<0>(callback_variant_) ==
nullptr) {
573 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
578 [&message, &message_info,
this](
auto && callback) {
579 using T = std::decay_t<decltype(callback)>;
583 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
589 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
590 callback(*local_message);
591 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
592 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
593 callback(*local_message, message_info);
594 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrCallback>) {
595 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
596 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrWithInfoCallback>) {
597 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
598 }
else if constexpr (
600 std::is_same_v<T, SharedConstPtrCallback>||
601 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
602 std::is_same_v<T, SharedPtrCallback>
605 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
606 }
else if constexpr (
608 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
609 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
610 std::is_same_v<T, SharedPtrWithInfoCallback>
613 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
616 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
618 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
619 callback(*message, message_info);
620 }
else if constexpr (std::is_same_v<T, UniquePtrROSMessageCallback>) {
621 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
622 }
else if constexpr (std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>) {
623 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
624 }
else if constexpr (
625 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
626 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
627 std::is_same_v<T, SharedPtrROSMessageCallback>)
630 }
else if constexpr (
631 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
632 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
633 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
635 callback(message, message_info);
639 std::is_same_v<T, ConstRefSerializedMessageCallback>||
640 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
641 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
642 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
643 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
644 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
645 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
646 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
647 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
648 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
650 throw std::runtime_error(
651 "Cannot dispatch std::shared_ptr<ROSMessageType> message "
652 "to rclcpp::SerializedMessage");
656 static_assert(detail::always_false_v<T>,
"unhandled callback type");
658 }, callback_variant_);
659 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
665 std::shared_ptr<const rclcpp::SerializedMessage> serialized_message,
668 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
669 if (callback_disabled_.load()) {
672 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
674 if (callback_variant_.index() == 0) {
675 if (std::get<0>(callback_variant_) ==
nullptr) {
677 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
682 [&serialized_message, &message_info,
this](
auto && callback) {
683 using T = std::decay_t<decltype(callback)>;
686 if constexpr (std::is_same_v<T, ConstRefSerializedMessageCallback>) {
687 callback(*serialized_message);
688 }
else if constexpr (std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>) {
689 callback(*serialized_message, message_info);
690 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageCallback>) {
691 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
692 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>) {
694 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
696 }
else if constexpr (
697 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
698 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
699 std::is_same_v<T, SharedPtrSerializedMessageCallback>)
701 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
702 }
else if constexpr (
703 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
704 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
705 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
708 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
713 std::is_same_v<T, ConstRefCallback>||
714 std::is_same_v<T, ConstRefROSMessageCallback>||
715 std::is_same_v<T, ConstRefWithInfoCallback>||
716 std::is_same_v<T, ConstRefWithInfoROSMessageCallback>||
717 std::is_same_v<T, UniquePtrCallback>||
718 std::is_same_v<T, UniquePtrROSMessageCallback>||
719 std::is_same_v<T, UniquePtrWithInfoCallback>||
720 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
721 std::is_same_v<T, SharedConstPtrCallback>||
722 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
723 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
724 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
725 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
726 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
727 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
728 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
729 std::is_same_v<T, SharedPtrCallback>||
730 std::is_same_v<T, SharedPtrROSMessageCallback>||
731 std::is_same_v<T, SharedPtrWithInfoCallback>||
732 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
734 throw std::runtime_error(
735 "cannot dispatch rclcpp::SerializedMessage to "
736 "non-rclcpp::SerializedMessage callbacks");
740 static_assert(detail::always_false_v<T>,
"unhandled callback type");
742 }, callback_variant_);
743 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
747 dispatch_intra_process(
748 std::shared_ptr<const SubscribedType> message,
751 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
752 if (callback_disabled_.load()) {
755 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
757 if (callback_variant_.index() == 0) {
758 if (std::get<0>(callback_variant_) ==
nullptr) {
760 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
765 [&message, &message_info,
this](
auto && callback) {
766 using T = std::decay_t<decltype(callback)>;
770 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
772 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
773 callback(*message, message_info);
774 }
else if constexpr (
776 std::is_same_v<T, UniquePtrCallback>||
777 std::is_same_v<T, SharedPtrCallback>
780 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message));
781 }
else if constexpr (
783 std::is_same_v<T, UniquePtrWithInfoCallback>||
784 std::is_same_v<T, SharedPtrWithInfoCallback>
787 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message), message_info);
788 }
else if constexpr (
790 std::is_same_v<T, SharedConstPtrCallback>||
791 std::is_same_v<T, ConstRefSharedConstPtrCallback>
795 }
else if constexpr (
797 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
798 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
801 callback(message, message_info);
804 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
805 if constexpr (is_ta) {
806 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
811 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
812 if constexpr (is_ta) {
813 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
814 callback(*local, message_info);
816 callback(*message, message_info);
818 }
else if constexpr (
819 std::is_same_v<T, UniquePtrROSMessageCallback>||
820 std::is_same_v<T, SharedPtrROSMessageCallback>)
822 if constexpr (is_ta) {
823 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
825 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
827 }
else if constexpr (
828 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
829 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
831 if constexpr (is_ta) {
832 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
834 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
836 }
else if constexpr (
837 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
838 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
840 if constexpr (is_ta) {
841 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
845 }
else if constexpr (
846 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
847 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
849 if constexpr (is_ta) {
850 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
852 callback(message, message_info);
857 std::is_same_v<T, ConstRefSerializedMessageCallback>||
858 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
859 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
860 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
861 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
862 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
863 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
864 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
865 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
866 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
868 throw std::runtime_error(
869 "Cannot dispatch std::shared_ptr<const ROSMessageType> message "
870 "to rclcpp::SerializedMessage");
874 static_assert(detail::always_false_v<T>,
"unhandled callback type");
876 }, callback_variant_);
877 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
881 dispatch_intra_process(
882 std::unique_ptr<SubscribedType, SubscribedTypeDeleter> message,
885 std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
886 if (callback_disabled_.load()) {
889 TRACETOOLS_TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
891 if (callback_variant_.index() == 0) {
892 if (std::get<0>(callback_variant_) ==
nullptr) {
894 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
899 [&message, &message_info,
this](
auto && callback) {
905 using T = std::decay_t<decltype(callback)>;
909 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
911 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
912 callback(*message, message_info);
913 }
else if constexpr (
915 std::is_same_v<T, UniquePtrCallback>||
916 std::is_same_v<T, SharedPtrCallback>))
918 callback(std::move(message));
919 }
else if constexpr (
921 std::is_same_v<T, UniquePtrWithInfoCallback>||
922 std::is_same_v<T, SharedPtrWithInfoCallback>
925 callback(std::move(message), message_info);
926 }
else if constexpr (
928 std::is_same_v<T, SharedConstPtrCallback>||
929 std::is_same_v<T, ConstRefSharedConstPtrCallback>
932 callback(std::move(message));
933 }
else if constexpr (
935 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
936 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
939 callback(std::move(message), message_info);
942 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
943 if constexpr (is_ta) {
944 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
949 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
950 if constexpr (is_ta) {
951 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
952 callback(*local, message_info);
954 callback(*message, message_info);
956 }
else if constexpr (
957 std::is_same_v<T, UniquePtrROSMessageCallback>||
958 std::is_same_v<T, SharedPtrROSMessageCallback>)
960 if constexpr (is_ta) {
961 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
963 callback(std::move(message));
965 }
else if constexpr (
966 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
967 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
969 if constexpr (is_ta) {
970 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
972 callback(std::move(message), message_info);
974 }
else if constexpr (
975 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
976 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
978 if constexpr (is_ta) {
979 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
981 callback(std::move(message));
983 }
else if constexpr (
984 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
985 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
987 if constexpr (is_ta) {
988 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
990 callback(std::move(message), message_info);
995 std::is_same_v<T, ConstRefSerializedMessageCallback>||
996 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
997 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
998 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
999 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
1000 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
1001 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
1002 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
1003 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
1004 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
1006 throw std::runtime_error(
1007 "Cannot dispatch std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter> message "
1008 "to rclcpp::SerializedMessage");
1012 static_assert(detail::always_false_v<T>,
"unhandled callback type");
1014 }, callback_variant_);
1015 TRACETOOLS_TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
1020 use_take_shared_method()
const
1023 std::holds_alternative<SharedConstPtrCallback>(callback_variant_) ||
1024 std::holds_alternative<SharedConstPtrWithInfoCallback>(callback_variant_) ||
1025 std::holds_alternative<ConstRefSharedConstPtrCallback>(callback_variant_) ||
1026 std::holds_alternative<ConstRefSharedConstPtrWithInfoCallback>(callback_variant_) ||
1027 std::holds_alternative<ConstRefCallback>(callback_variant_) ||
1028 std::holds_alternative<ConstRefWithInfoCallback>(callback_variant_);
1033 is_serialized_message_callback()
const
1036 std::holds_alternative<ConstRefSerializedMessageCallback>(callback_variant_) ||
1037 std::holds_alternative<UniquePtrSerializedMessageCallback>(callback_variant_) ||
1038 std::holds_alternative<SharedConstPtrSerializedMessageCallback>(callback_variant_) ||
1039 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageCallback>(callback_variant_) ||
1040 std::holds_alternative<SharedPtrSerializedMessageCallback>(callback_variant_) ||
1041 std::holds_alternative<ConstRefSerializedMessageWithInfoCallback>(callback_variant_) ||
1042 std::holds_alternative<UniquePtrSerializedMessageWithInfoCallback>(callback_variant_) ||
1043 std::holds_alternative<SharedConstPtrSerializedMessageWithInfoCallback>(callback_variant_) ||
1044 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageWithInfoCallback>(
1045 callback_variant_) ||
1046 std::holds_alternative<SharedPtrSerializedMessageWithInfoCallback>(callback_variant_);
1050 register_callback_for_tracing()
1052 #ifndef TRACETOOLS_DISABLED
1054 [
this](
auto && callback) {
1055 if (TRACETOOLS_TRACEPOINT_ENABLED(rclcpp_callback_register)) {
1056 char * symbol = tracetools::get_symbol(callback);
1057 TRACETOOLS_DO_TRACEPOINT(
1058 rclcpp_callback_register,
1059 static_cast<const void *
>(
this),
1063 }, callback_variant_);
1067 typename HelperT::variant_type &
1070 return callback_variant_;
1073 const typename HelperT::variant_type &
1076 return callback_variant_;
1084 typename HelperT::variant_type callback_variant_;
1085 std::recursive_mutex callback_mutex_;
1086 std::atomic_bool callback_disabled_{
false};
1088 SubscribedTypeAllocator subscribed_type_allocator_;
1089 SubscribedTypeDeleter subscribed_type_deleter_;
1090 ROSMessageTypeAllocator ros_message_type_allocator_;
1091 ROSMessageTypeDeleter ros_message_type_deleter_;
1092 SerializedMessageAllocator serialized_message_allocator_;
1093 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.