15 #ifndef RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
16 #define RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
21 #include <type_traits>
25 #include "rosidl_runtime_cpp/traits.hpp"
26 #include "tracetools/tracetools.h"
27 #include "tracetools/utils.hpp"
29 #include "rclcpp/allocator/allocator_common.hpp"
30 #include "rclcpp/detail/subscription_callback_type_helper.hpp"
31 #include "rclcpp/function_traits.hpp"
32 #include "rclcpp/message_info.hpp"
33 #include "rclcpp/serialized_message.hpp"
34 #include "rclcpp/type_adapter.hpp"
38 inline constexpr
bool always_false_v =
false;
46 template<
typename MessageT,
typename AllocatorT>
49 using AllocTraits = allocator::AllocRebind<MessageT, AllocatorT>;
50 using Alloc =
typename AllocTraits::allocator_type;
51 using Deleter = allocator::Deleter<Alloc, MessageT>;
55 template<
typename MessageT,
typename AllocatorT>
61 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
63 using SubscribedMessageDeleter =
64 typename MessageDeleterHelper<SubscribedType, AllocatorT>::Deleter;
65 using ROSMessageDeleter =
66 typename MessageDeleterHelper<ROSMessageType, AllocatorT>::Deleter;
67 using SerializedMessageDeleter =
68 typename MessageDeleterHelper<rclcpp::SerializedMessage, AllocatorT>::Deleter;
70 using ConstRefCallback =
72 using ConstRefROSMessageCallback =
74 using ConstRefWithInfoCallback =
76 using ConstRefWithInfoROSMessageCallback =
78 using ConstRefSerializedMessageCallback =
80 using ConstRefSerializedMessageWithInfoCallback =
83 using UniquePtrCallback =
84 std::function<void (std::unique_ptr<SubscribedType, SubscribedMessageDeleter>)>;
85 using UniquePtrROSMessageCallback =
86 std::function<void (std::unique_ptr<ROSMessageType, ROSMessageDeleter>)>;
87 using UniquePtrWithInfoCallback =
89 std::unique_ptr<SubscribedType, SubscribedMessageDeleter>,
91 using UniquePtrWithInfoROSMessageCallback =
93 std::unique_ptr<ROSMessageType, ROSMessageDeleter>,
95 using UniquePtrSerializedMessageCallback =
96 std::function<void (std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>)>;
97 using UniquePtrSerializedMessageWithInfoCallback =
99 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>,
102 using SharedConstPtrCallback =
103 std::function<void (std::shared_ptr<const SubscribedType>)>;
104 using SharedConstPtrROSMessageCallback =
105 std::function<void (std::shared_ptr<const ROSMessageType>)>;
106 using SharedConstPtrWithInfoCallback =
108 std::shared_ptr<const SubscribedType>,
110 using SharedConstPtrWithInfoROSMessageCallback =
112 std::shared_ptr<const ROSMessageType>,
114 using SharedConstPtrSerializedMessageCallback =
115 std::function<void (std::shared_ptr<const rclcpp::SerializedMessage>)>;
116 using SharedConstPtrSerializedMessageWithInfoCallback =
118 std::shared_ptr<const rclcpp::SerializedMessage>,
121 using ConstRefSharedConstPtrCallback =
122 std::function<void (
const std::shared_ptr<const SubscribedType> &)>;
123 using ConstRefSharedConstPtrROSMessageCallback =
124 std::function<void (
const std::shared_ptr<const ROSMessageType> &)>;
125 using ConstRefSharedConstPtrWithInfoCallback =
127 const std::shared_ptr<const SubscribedType> &,
129 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
131 const std::shared_ptr<const ROSMessageType> &,
133 using ConstRefSharedConstPtrSerializedMessageCallback =
134 std::function<void (
const std::shared_ptr<const rclcpp::SerializedMessage> &)>;
135 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
137 const std::shared_ptr<const rclcpp::SerializedMessage> &,
141 using SharedPtrCallback =
142 std::function<void (std::shared_ptr<SubscribedType>)>;
143 using SharedPtrROSMessageCallback =
144 std::function<void (std::shared_ptr<ROSMessageType>)>;
145 using SharedPtrWithInfoCallback =
147 using SharedPtrWithInfoROSMessageCallback =
149 std::shared_ptr<ROSMessageType>,
151 using SharedPtrSerializedMessageCallback =
152 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>;
153 using SharedPtrSerializedMessageWithInfoCallback =
154 std::function<void (std::shared_ptr<rclcpp::SerializedMessage>,
const rclcpp::MessageInfo &)>;
166 template<
typename MessageT,
typename AllocatorT>
171 using variant_type = std::variant<
172 typename CallbackTypes::ConstRefCallback,
173 typename CallbackTypes::ConstRefWithInfoCallback,
174 typename CallbackTypes::ConstRefSerializedMessageCallback,
175 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
176 typename CallbackTypes::UniquePtrCallback,
177 typename CallbackTypes::UniquePtrWithInfoCallback,
178 typename CallbackTypes::UniquePtrSerializedMessageCallback,
179 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
180 typename CallbackTypes::SharedConstPtrCallback,
181 typename CallbackTypes::SharedConstPtrWithInfoCallback,
182 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
183 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
184 typename CallbackTypes::ConstRefSharedConstPtrCallback,
185 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
186 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
187 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
188 typename CallbackTypes::SharedPtrCallback,
189 typename CallbackTypes::SharedPtrWithInfoCallback,
190 typename CallbackTypes::SharedPtrSerializedMessageCallback,
191 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
196 template<
typename MessageT,
typename AllocatorT>
201 using variant_type = std::variant<
202 typename CallbackTypes::ConstRefCallback,
203 typename CallbackTypes::ConstRefROSMessageCallback,
204 typename CallbackTypes::ConstRefWithInfoCallback,
205 typename CallbackTypes::ConstRefWithInfoROSMessageCallback,
206 typename CallbackTypes::ConstRefSerializedMessageCallback,
207 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback,
208 typename CallbackTypes::UniquePtrCallback,
209 typename CallbackTypes::UniquePtrROSMessageCallback,
210 typename CallbackTypes::UniquePtrWithInfoCallback,
211 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback,
212 typename CallbackTypes::UniquePtrSerializedMessageCallback,
213 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback,
214 typename CallbackTypes::SharedConstPtrCallback,
215 typename CallbackTypes::SharedConstPtrROSMessageCallback,
216 typename CallbackTypes::SharedConstPtrWithInfoCallback,
217 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback,
218 typename CallbackTypes::SharedConstPtrSerializedMessageCallback,
219 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback,
220 typename CallbackTypes::ConstRefSharedConstPtrCallback,
221 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback,
222 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback,
223 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback,
224 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback,
225 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback,
226 typename CallbackTypes::SharedPtrCallback,
227 typename CallbackTypes::SharedPtrROSMessageCallback,
228 typename CallbackTypes::SharedPtrWithInfoCallback,
229 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback,
230 typename CallbackTypes::SharedPtrSerializedMessageCallback,
231 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback
239 typename AllocatorT = std::allocator<void>
245 using SubscribedType =
typename rclcpp::TypeAdapter<MessageT>::custom_type;
247 using ROSMessageType =
typename rclcpp::TypeAdapter<MessageT>::ros_message_type;
253 using SubscribedTypeAllocatorTraits =
typename SubscribedTypeDeleterHelper::AllocTraits;
254 using SubscribedTypeAllocator =
typename SubscribedTypeDeleterHelper::Alloc;
255 using SubscribedTypeDeleter =
typename SubscribedTypeDeleterHelper::Deleter;
259 using ROSMessageTypeAllocatorTraits =
typename ROSMessageTypeDeleterHelper::AllocTraits;
260 using ROSMessageTypeAllocator =
typename ROSMessageTypeDeleterHelper::Alloc;
261 using ROSMessageTypeDeleter =
typename ROSMessageTypeDeleterHelper::Deleter;
265 using SerializedMessageAllocatorTraits =
typename SerializedMessageDeleterHelper::AllocTraits;
266 using SerializedMessageAllocator =
typename SerializedMessageDeleterHelper::Alloc;
267 using SerializedMessageDeleter =
typename SerializedMessageDeleterHelper::Deleter;
272 using ConstRefCallback =
273 typename CallbackTypes::ConstRefCallback;
274 using ConstRefROSMessageCallback =
275 typename CallbackTypes::ConstRefROSMessageCallback;
276 using ConstRefWithInfoCallback =
277 typename CallbackTypes::ConstRefWithInfoCallback;
278 using ConstRefWithInfoROSMessageCallback =
279 typename CallbackTypes::ConstRefWithInfoROSMessageCallback;
280 using ConstRefSerializedMessageCallback =
281 typename CallbackTypes::ConstRefSerializedMessageCallback;
282 using ConstRefSerializedMessageWithInfoCallback =
283 typename CallbackTypes::ConstRefSerializedMessageWithInfoCallback;
284 using UniquePtrCallback =
285 typename CallbackTypes::UniquePtrCallback;
286 using UniquePtrROSMessageCallback =
287 typename CallbackTypes::UniquePtrROSMessageCallback;
288 using UniquePtrWithInfoCallback =
289 typename CallbackTypes::UniquePtrWithInfoCallback;
290 using UniquePtrWithInfoROSMessageCallback =
291 typename CallbackTypes::UniquePtrWithInfoROSMessageCallback;
292 using UniquePtrSerializedMessageCallback =
293 typename CallbackTypes::UniquePtrSerializedMessageCallback;
294 using UniquePtrSerializedMessageWithInfoCallback =
295 typename CallbackTypes::UniquePtrSerializedMessageWithInfoCallback;
296 using SharedConstPtrCallback =
297 typename CallbackTypes::SharedConstPtrCallback;
298 using SharedConstPtrROSMessageCallback =
299 typename CallbackTypes::SharedConstPtrROSMessageCallback;
300 using SharedConstPtrWithInfoCallback =
301 typename CallbackTypes::SharedConstPtrWithInfoCallback;
302 using SharedConstPtrWithInfoROSMessageCallback =
303 typename CallbackTypes::SharedConstPtrWithInfoROSMessageCallback;
304 using SharedConstPtrSerializedMessageCallback =
305 typename CallbackTypes::SharedConstPtrSerializedMessageCallback;
306 using SharedConstPtrSerializedMessageWithInfoCallback =
307 typename CallbackTypes::SharedConstPtrSerializedMessageWithInfoCallback;
308 using ConstRefSharedConstPtrCallback =
309 typename CallbackTypes::ConstRefSharedConstPtrCallback;
310 using ConstRefSharedConstPtrROSMessageCallback =
311 typename CallbackTypes::ConstRefSharedConstPtrROSMessageCallback;
312 using ConstRefSharedConstPtrWithInfoCallback =
313 typename CallbackTypes::ConstRefSharedConstPtrWithInfoCallback;
314 using ConstRefSharedConstPtrWithInfoROSMessageCallback =
315 typename CallbackTypes::ConstRefSharedConstPtrWithInfoROSMessageCallback;
316 using ConstRefSharedConstPtrSerializedMessageCallback =
317 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageCallback;
318 using ConstRefSharedConstPtrSerializedMessageWithInfoCallback =
319 typename CallbackTypes::ConstRefSharedConstPtrSerializedMessageWithInfoCallback;
320 using SharedPtrCallback =
321 typename CallbackTypes::SharedPtrCallback;
322 using SharedPtrROSMessageCallback =
323 typename CallbackTypes::SharedPtrROSMessageCallback;
324 using SharedPtrWithInfoCallback =
325 typename CallbackTypes::SharedPtrWithInfoCallback;
326 using SharedPtrWithInfoROSMessageCallback =
327 typename CallbackTypes::SharedPtrWithInfoROSMessageCallback;
328 using SharedPtrSerializedMessageCallback =
329 typename CallbackTypes::SharedPtrSerializedMessageCallback;
330 using SharedPtrSerializedMessageWithInfoCallback =
331 typename CallbackTypes::SharedPtrSerializedMessageWithInfoCallback;
336 NotNull(
const T * pointer_in,
const char * msg)
337 : pointer(pointer_in)
339 if (pointer ==
nullptr) {
340 throw std::invalid_argument(msg);
350 : subscribed_type_allocator_(allocator),
351 ros_message_type_allocator_(allocator)
353 allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
354 allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
365 template<
typename CallbackT>
376 constexpr
auto is_deprecated =
378 typename scbth::callback_type,
379 std::function<void(std::shared_ptr<MessageT>)>
383 typename scbth::callback_type,
389 if constexpr (is_deprecated) {
391 set_deprecated(
static_cast<typename scbth::callback_type
>(callback));
394 callback_variant_ =
static_cast<typename scbth::callback_type
>(callback);
402 template<
typename SetT>
403 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
405 [[deprecated(
"use 'void(std::shared_ptr<const MessageT>)' instead")]]
410 callback_variant_ = callback;
414 template<
typename SetT>
415 #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
418 "use 'void(std::shared_ptr<const MessageT>, const rclcpp::MessageInfo &)' instead"
424 callback_variant_ = callback;
427 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
428 create_ros_unique_ptr_from_ros_shared_ptr_message(
429 const std::shared_ptr<const ROSMessageType> & message)
431 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
432 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr, *message);
433 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
436 std::unique_ptr<rclcpp::SerializedMessage, SerializedMessageDeleter>
437 create_serialized_message_unique_ptr_from_shared_ptr(
438 const std::shared_ptr<const rclcpp::SerializedMessage> & serialized_message)
440 auto ptr = SerializedMessageAllocatorTraits::allocate(serialized_message_allocator_, 1);
441 SerializedMessageAllocatorTraits::construct(
442 serialized_message_allocator_, ptr, *serialized_message);
443 return std::unique_ptr<
445 SerializedMessageDeleter
446 >(ptr, serialized_message_deleter_);
449 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
450 create_custom_unique_ptr_from_custom_shared_ptr_message(
451 const std::shared_ptr<const SubscribedType> & message)
453 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
454 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr, *message);
455 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
458 std::unique_ptr<SubscribedType, SubscribedTypeDeleter>
459 convert_ros_message_to_custom_type_unique_ptr(
const ROSMessageType & msg)
462 auto ptr = SubscribedTypeAllocatorTraits::allocate(subscribed_type_allocator_, 1);
463 SubscribedTypeAllocatorTraits::construct(subscribed_type_allocator_, ptr);
465 return std::unique_ptr<SubscribedType, SubscribedTypeDeleter>(ptr, subscribed_type_deleter_);
467 throw std::runtime_error(
468 "convert_ros_message_to_custom_type_unique_ptr "
469 "unexpectedly called without TypeAdapter");
473 std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
474 convert_custom_type_to_ros_message_unique_ptr(
const SubscribedType & msg)
477 auto ptr = ROSMessageTypeAllocatorTraits::allocate(ros_message_type_allocator_, 1);
478 ROSMessageTypeAllocatorTraits::construct(ros_message_type_allocator_, ptr);
480 return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
484 "convert_custom_type_to_ros_message_unique_ptr() "
485 "unexpectedly called without specialized TypeAdapter");
492 std::shared_ptr<ROSMessageType> message,
495 TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
497 if (callback_variant_.index() == 0) {
498 if (std::get<0>(callback_variant_) ==
nullptr) {
500 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
505 [&message, &message_info,
this](
auto && callback) {
506 using T = std::decay_t<decltype(callback)>;
510 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
516 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
517 callback(*local_message);
518 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
519 auto local_message = convert_ros_message_to_custom_type_unique_ptr(*message);
520 callback(*local_message, message_info);
521 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrCallback>) {
522 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
523 }
else if constexpr (is_ta && std::is_same_v<T, UniquePtrWithInfoCallback>) {
524 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
525 }
else if constexpr (
527 std::is_same_v<T, SharedConstPtrCallback>||
528 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
529 std::is_same_v<T, SharedPtrCallback>
532 callback(convert_ros_message_to_custom_type_unique_ptr(*message));
533 }
else if constexpr (
535 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
536 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
537 std::is_same_v<T, SharedPtrWithInfoCallback>
540 callback(convert_ros_message_to_custom_type_unique_ptr(*message), message_info);
543 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
545 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
546 callback(*message, message_info);
547 }
else if constexpr (std::is_same_v<T, UniquePtrROSMessageCallback>) {
548 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
549 }
else if constexpr (std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>) {
550 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
551 }
else if constexpr (
552 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
553 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
554 std::is_same_v<T, SharedPtrROSMessageCallback>)
557 }
else if constexpr (
558 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
559 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
560 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
562 callback(message, message_info);
566 std::is_same_v<T, ConstRefSerializedMessageCallback>||
567 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
568 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
569 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
570 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
571 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
572 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
573 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
574 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
575 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
577 throw std::runtime_error(
578 "Cannot dispatch std::shared_ptr<ROSMessageType> message "
579 "to rclcpp::SerializedMessage");
583 static_assert(always_false_v<T>,
"unhandled callback type");
585 }, callback_variant_);
586 TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
592 std::shared_ptr<rclcpp::SerializedMessage> serialized_message,
595 TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
false);
597 if (callback_variant_.index() == 0) {
598 if (std::get<0>(callback_variant_) ==
nullptr) {
600 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
605 [&serialized_message, &message_info,
this](
auto && callback) {
606 using T = std::decay_t<decltype(callback)>;
609 if constexpr (std::is_same_v<T, ConstRefSerializedMessageCallback>) {
610 callback(*serialized_message);
611 }
else if constexpr (std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>) {
612 callback(*serialized_message, message_info);
613 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageCallback>) {
614 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
615 }
else if constexpr (std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>) {
617 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
619 }
else if constexpr (
620 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
621 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
622 std::is_same_v<T, SharedPtrSerializedMessageCallback>)
624 callback(create_serialized_message_unique_ptr_from_shared_ptr(serialized_message));
625 }
else if constexpr (
626 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
627 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
628 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
631 create_serialized_message_unique_ptr_from_shared_ptr(serialized_message),
636 std::is_same_v<T, ConstRefCallback>||
637 std::is_same_v<T, ConstRefROSMessageCallback>||
638 std::is_same_v<T, ConstRefWithInfoCallback>||
639 std::is_same_v<T, ConstRefWithInfoROSMessageCallback>||
640 std::is_same_v<T, UniquePtrCallback>||
641 std::is_same_v<T, UniquePtrROSMessageCallback>||
642 std::is_same_v<T, UniquePtrWithInfoCallback>||
643 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
644 std::is_same_v<T, SharedConstPtrCallback>||
645 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
646 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
647 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
648 std::is_same_v<T, ConstRefSharedConstPtrCallback>||
649 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>||
650 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>||
651 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>||
652 std::is_same_v<T, SharedPtrCallback>||
653 std::is_same_v<T, SharedPtrROSMessageCallback>||
654 std::is_same_v<T, SharedPtrWithInfoCallback>||
655 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
657 throw std::runtime_error(
658 "cannot dispatch rclcpp::SerializedMessage to "
659 "non-rclcpp::SerializedMessage callbacks");
663 static_assert(always_false_v<T>,
"unhandled callback type");
665 }, callback_variant_);
666 TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
670 dispatch_intra_process(
671 std::shared_ptr<const SubscribedType> message,
674 TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
676 if (callback_variant_.index() == 0) {
677 if (std::get<0>(callback_variant_) ==
nullptr) {
679 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
684 [&message, &message_info,
this](
auto && callback) {
685 using T = std::decay_t<decltype(callback)>;
689 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
691 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
692 callback(*message, message_info);
693 }
else if constexpr (
695 std::is_same_v<T, UniquePtrCallback>||
696 std::is_same_v<T, SharedPtrCallback>
699 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message));
700 }
else if constexpr (
702 std::is_same_v<T, UniquePtrWithInfoCallback>||
703 std::is_same_v<T, SharedPtrWithInfoCallback>
706 callback(create_custom_unique_ptr_from_custom_shared_ptr_message(message), message_info);
707 }
else if constexpr (
709 std::is_same_v<T, SharedConstPtrCallback>||
710 std::is_same_v<T, ConstRefSharedConstPtrCallback>
714 }
else if constexpr (
716 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
717 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
720 callback(message, message_info);
723 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
724 if constexpr (is_ta) {
725 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
730 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
731 if constexpr (is_ta) {
732 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
733 callback(*local, message_info);
735 callback(*message, message_info);
737 }
else if constexpr (
738 std::is_same_v<T, UniquePtrROSMessageCallback>||
739 std::is_same_v<T, SharedPtrROSMessageCallback>)
741 if constexpr (is_ta) {
742 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
744 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message));
746 }
else if constexpr (
747 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
748 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
750 if constexpr (is_ta) {
751 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
753 callback(create_ros_unique_ptr_from_ros_shared_ptr_message(message), message_info);
755 }
else if constexpr (
756 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
757 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
759 if constexpr (is_ta) {
760 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
764 }
else if constexpr (
765 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
766 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
768 if constexpr (is_ta) {
769 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
771 callback(message, message_info);
776 std::is_same_v<T, ConstRefSerializedMessageCallback>||
777 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
778 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
779 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
780 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
781 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
782 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
783 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
784 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
785 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
787 throw std::runtime_error(
788 "Cannot dispatch std::shared_ptr<const ROSMessageType> message "
789 "to rclcpp::SerializedMessage");
793 static_assert(always_false_v<T>,
"unhandled callback type");
795 }, callback_variant_);
796 TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
800 dispatch_intra_process(
801 std::unique_ptr<SubscribedType, SubscribedTypeDeleter> message,
804 TRACEPOINT(callback_start,
static_cast<const void *
>(
this),
true);
806 if (callback_variant_.index() == 0) {
807 if (std::get<0>(callback_variant_) ==
nullptr) {
809 throw std::runtime_error(
"dispatch called on an unset AnySubscriptionCallback");
814 [&message, &message_info,
this](
auto && callback) {
820 using T = std::decay_t<decltype(callback)>;
824 if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
826 }
else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) {
827 callback(*message, message_info);
828 }
else if constexpr (
830 std::is_same_v<T, UniquePtrCallback>||
831 std::is_same_v<T, SharedPtrCallback>))
833 callback(std::move(message));
834 }
else if constexpr (
836 std::is_same_v<T, UniquePtrWithInfoCallback>||
837 std::is_same_v<T, SharedPtrWithInfoCallback>
840 callback(std::move(message), message_info);
841 }
else if constexpr (
843 std::is_same_v<T, SharedConstPtrCallback>||
844 std::is_same_v<T, ConstRefSharedConstPtrCallback>
847 callback(std::move(message));
848 }
else if constexpr (
850 std::is_same_v<T, SharedConstPtrWithInfoCallback>||
851 std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
854 callback(std::move(message), message_info);
857 else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) {
858 if constexpr (is_ta) {
859 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
864 }
else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
865 if constexpr (is_ta) {
866 auto local = convert_custom_type_to_ros_message_unique_ptr(*message);
867 callback(*local, message_info);
869 callback(*message, message_info);
871 }
else if constexpr (
872 std::is_same_v<T, UniquePtrROSMessageCallback>||
873 std::is_same_v<T, SharedPtrROSMessageCallback>)
875 if constexpr (is_ta) {
876 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
878 callback(std::move(message));
880 }
else if constexpr (
881 std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
882 std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
884 if constexpr (is_ta) {
885 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
887 callback(std::move(message), message_info);
889 }
else if constexpr (
890 std::is_same_v<T, SharedConstPtrROSMessageCallback>||
891 std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
893 if constexpr (is_ta) {
894 callback(convert_custom_type_to_ros_message_unique_ptr(*message));
896 callback(std::move(message));
898 }
else if constexpr (
899 std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
900 std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
902 if constexpr (is_ta) {
903 callback(convert_custom_type_to_ros_message_unique_ptr(*message), message_info);
905 callback(std::move(message), message_info);
910 std::is_same_v<T, ConstRefSerializedMessageCallback>||
911 std::is_same_v<T, ConstRefSerializedMessageWithInfoCallback>||
912 std::is_same_v<T, UniquePtrSerializedMessageCallback>||
913 std::is_same_v<T, UniquePtrSerializedMessageWithInfoCallback>||
914 std::is_same_v<T, SharedConstPtrSerializedMessageCallback>||
915 std::is_same_v<T, SharedConstPtrSerializedMessageWithInfoCallback>||
916 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageCallback>||
917 std::is_same_v<T, ConstRefSharedConstPtrSerializedMessageWithInfoCallback>||
918 std::is_same_v<T, SharedPtrSerializedMessageCallback>||
919 std::is_same_v<T, SharedPtrSerializedMessageWithInfoCallback>)
921 throw std::runtime_error(
922 "Cannot dispatch std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter> message "
923 "to rclcpp::SerializedMessage");
927 static_assert(always_false_v<T>,
"unhandled callback type");
929 }, callback_variant_);
930 TRACEPOINT(callback_end,
static_cast<const void *
>(
this));
935 use_take_shared_method()
const
938 std::holds_alternative<SharedConstPtrCallback>(callback_variant_) ||
939 std::holds_alternative<SharedConstPtrWithInfoCallback>(callback_variant_) ||
940 std::holds_alternative<ConstRefSharedConstPtrCallback>(callback_variant_) ||
941 std::holds_alternative<ConstRefSharedConstPtrWithInfoCallback>(callback_variant_);
946 is_serialized_message_callback()
const
949 std::holds_alternative<ConstRefSerializedMessageCallback>(callback_variant_) ||
950 std::holds_alternative<UniquePtrSerializedMessageCallback>(callback_variant_) ||
951 std::holds_alternative<SharedConstPtrSerializedMessageCallback>(callback_variant_) ||
952 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageCallback>(callback_variant_) ||
953 std::holds_alternative<SharedPtrSerializedMessageCallback>(callback_variant_) ||
954 std::holds_alternative<ConstRefSerializedMessageWithInfoCallback>(callback_variant_) ||
955 std::holds_alternative<UniquePtrSerializedMessageWithInfoCallback>(callback_variant_) ||
956 std::holds_alternative<SharedConstPtrSerializedMessageWithInfoCallback>(callback_variant_) ||
957 std::holds_alternative<ConstRefSharedConstPtrSerializedMessageWithInfoCallback>(
958 callback_variant_) ||
959 std::holds_alternative<SharedPtrSerializedMessageWithInfoCallback>(callback_variant_);
963 register_callback_for_tracing()
965 #ifndef TRACETOOLS_DISABLED
967 [
this](
auto && callback) {
969 rclcpp_callback_register,
970 static_cast<const void *
>(
this),
971 tracetools::get_symbol(callback));
972 }, callback_variant_);
976 typename HelperT::variant_type &
979 return callback_variant_;
982 const typename HelperT::variant_type &
985 return callback_variant_;
993 typename HelperT::variant_type callback_variant_;
995 SubscribedTypeAllocator subscribed_type_allocator_;
996 SubscribedTypeDeleter subscribed_type_deleter_;
997 ROSMessageTypeAllocator ros_message_type_allocator_;
998 ROSMessageTypeDeleter ros_message_type_deleter_;
999 SerializedMessageAllocator serialized_message_allocator_;
1000 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 set_deprecated(std::function< void(std::shared_ptr< SetT >)> callback)
Function for shared_ptr to non-const MessageT, which is deprecated.
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.