@@ -476,6 +476,22 @@ class AnySubscriptionCallback
476
476
}
477
477
}
478
478
479
+ std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
480
+ convert_custom_type_to_ros_message_unique_ptr (const SubscribedType & msg)
481
+ {
482
+ if constexpr (rclcpp::TypeAdapter<MessageT>::is_specialized::value) {
483
+ auto ptr = ROSMessageTypeAllocatorTraits::allocate (ros_message_type_allocator_, 1 );
484
+ ROSMessageTypeAllocatorTraits::construct (ros_message_type_allocator_, ptr);
485
+ rclcpp::TypeAdapter<MessageT>::convert_to_ros_message (msg, *ptr);
486
+ return std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>(ptr, ros_message_type_deleter_);
487
+ } else {
488
+ static_assert (
489
+ !sizeof (MessageT *),
490
+ " convert_custom_type_to_ros_message_unique_ptr() "
491
+ " unexpectedly called without specialized TypeAdapter" );
492
+ }
493
+ }
494
+
479
495
// Dispatch when input is a ros message and the output could be anything.
480
496
void
481
497
dispatch (
@@ -658,7 +674,7 @@ class AnySubscriptionCallback
658
674
659
675
void
660
676
dispatch_intra_process (
661
- std::shared_ptr<const ROSMessageType > message,
677
+ std::shared_ptr<const SubscribedType > message,
662
678
const rclcpp::MessageInfo & message_info)
663
679
{
664
680
TRACEPOINT (callback_start, static_cast <const void *>(this ), true );
@@ -677,65 +693,89 @@ class AnySubscriptionCallback
677
693
678
694
// conditions for custom type
679
695
if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
680
- auto local_message = convert_ros_message_to_custom_type_unique_ptr (*message);
681
- callback (*local_message);
696
+ callback (*message);
682
697
} else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) { // NOLINT
683
- auto local_message = convert_ros_message_to_custom_type_unique_ptr (*message);
684
- callback (*local_message, message_info);
698
+ callback (*message, message_info);
685
699
} else if constexpr ( // NOLINT[readability/braces]
686
700
is_ta && (
687
701
std::is_same_v<T, UniquePtrCallback>||
688
702
std::is_same_v<T, SharedPtrCallback>
689
703
))
690
704
{
691
- callback (convert_ros_message_to_custom_type_unique_ptr (* message));
705
+ callback (create_custom_unique_ptr_from_custom_shared_ptr_message ( message));
692
706
} else if constexpr ( // NOLINT[readability/braces]
693
707
is_ta && (
694
708
std::is_same_v<T, UniquePtrWithInfoCallback>||
695
709
std::is_same_v<T, SharedPtrWithInfoCallback>
696
710
))
697
711
{
698
- callback (convert_ros_message_to_custom_type_unique_ptr (* message), message_info);
712
+ callback (create_custom_unique_ptr_from_custom_shared_ptr_message ( message), message_info);
699
713
} else if constexpr ( // NOLINT[readability/braces]
700
714
is_ta && (
701
715
std::is_same_v<T, SharedConstPtrCallback>||
702
716
std::is_same_v<T, ConstRefSharedConstPtrCallback>
703
717
))
704
718
{
705
- callback (convert_ros_message_to_custom_type_unique_ptr (* message) );
719
+ callback (message);
706
720
} else if constexpr ( // NOLINT[readability/braces]
707
721
is_ta && (
708
722
std::is_same_v<T, SharedConstPtrWithInfoCallback>||
709
723
std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
710
724
))
711
725
{
712
- callback (convert_ros_message_to_custom_type_unique_ptr (* message) , message_info);
726
+ callback (message, message_info);
713
727
}
714
728
// conditions for ros message type
715
- else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) { // NOLINT
716
- callback (*message);
717
- } else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
718
- callback (*message, message_info);
729
+ else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) { // NOLINT[readability/braces]
730
+ if constexpr (is_ta) {
731
+ auto local = convert_custom_type_to_ros_message_unique_ptr (*message);
732
+ callback (*local);
733
+ } else {
734
+ callback (*message);
735
+ }
736
+ } else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) { // NOLINT[readability/braces]
737
+ if constexpr (is_ta) {
738
+ auto local = convert_custom_type_to_ros_message_unique_ptr (*message);
739
+ callback (*local, message_info);
740
+ } else {
741
+ callback (*message, message_info);
742
+ }
719
743
} else if constexpr ( // NOLINT[readability/braces]
720
744
std::is_same_v<T, UniquePtrROSMessageCallback>||
721
745
std::is_same_v<T, SharedPtrROSMessageCallback>)
722
746
{
723
- callback (create_ros_unique_ptr_from_ros_shared_ptr_message (message));
747
+ if constexpr (is_ta) {
748
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message));
749
+ } else {
750
+ callback (create_ros_unique_ptr_from_ros_shared_ptr_message (message));
751
+ }
724
752
} else if constexpr ( // NOLINT[readability/braces]
725
753
std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
726
754
std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
727
755
{
728
- callback (create_ros_unique_ptr_from_ros_shared_ptr_message (message), message_info);
756
+ if constexpr (is_ta) {
757
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message), message_info);
758
+ } else {
759
+ callback (create_ros_unique_ptr_from_ros_shared_ptr_message (message), message_info);
760
+ }
729
761
} else if constexpr ( // NOLINT[readability/braces]
730
762
std::is_same_v<T, SharedConstPtrROSMessageCallback>||
731
763
std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
732
764
{
733
- callback (message);
765
+ if constexpr (is_ta) {
766
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message));
767
+ } else {
768
+ callback (message);
769
+ }
734
770
} else if constexpr ( // NOLINT[readability/braces]
735
771
std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
736
772
std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
737
773
{
738
- callback (message, message_info);
774
+ if constexpr (is_ta) {
775
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message), message_info);
776
+ } else {
777
+ callback (message, message_info);
778
+ }
739
779
}
740
780
// condition to catch SerializedMessage types
741
781
else if constexpr ( // NOLINT[readability/braces]
@@ -764,7 +804,7 @@ class AnySubscriptionCallback
764
804
765
805
void
766
806
dispatch_intra_process (
767
- std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter > message,
807
+ std::unique_ptr<SubscribedType, SubscribedTypeDeleter > message,
768
808
const rclcpp::MessageInfo & message_info)
769
809
{
770
810
TRACEPOINT (callback_start, static_cast <const void *>(this ), true );
@@ -778,70 +818,98 @@ class AnySubscriptionCallback
778
818
// Dispatch.
779
819
std::visit (
780
820
[&message, &message_info, this ](auto && callback) {
821
+ // clang complains that 'this' lambda capture is unused, which is true
822
+ // in *some* specializations of this template, but not others. Just
823
+ // quiet it down.
824
+ (void )this ;
825
+
781
826
using T = std::decay_t <decltype (callback)>;
782
827
static constexpr bool is_ta = rclcpp::TypeAdapter<MessageT>::is_specialized::value;
783
828
784
829
// conditions for custom type
785
830
if constexpr (is_ta && std::is_same_v<T, ConstRefCallback>) {
786
- auto local_message = convert_ros_message_to_custom_type_unique_ptr (*message);
787
- callback (*local_message);
831
+ callback (*message);
788
832
} else if constexpr (is_ta && std::is_same_v<T, ConstRefWithInfoCallback>) { // NOLINT
789
- auto local_message = convert_ros_message_to_custom_type_unique_ptr (*message);
790
- callback (*local_message, message_info);
833
+ callback (*message, message_info);
791
834
} else if constexpr ( // NOLINT[readability/braces]
792
835
is_ta && (
793
836
std::is_same_v<T, UniquePtrCallback>||
794
- std::is_same_v<T, SharedPtrCallback>
795
- ))
837
+ std::is_same_v<T, SharedPtrCallback>))
796
838
{
797
- callback (convert_ros_message_to_custom_type_unique_ptr (* message));
839
+ callback (std::move ( message));
798
840
} else if constexpr ( // NOLINT[readability/braces]
799
841
is_ta && (
800
842
std::is_same_v<T, UniquePtrWithInfoCallback>||
801
843
std::is_same_v<T, SharedPtrWithInfoCallback>
802
844
))
803
845
{
804
- callback (convert_ros_message_to_custom_type_unique_ptr (* message), message_info);
846
+ callback (std::move ( message), message_info);
805
847
} else if constexpr ( // NOLINT[readability/braces]
806
848
is_ta && (
807
849
std::is_same_v<T, SharedConstPtrCallback>||
808
850
std::is_same_v<T, ConstRefSharedConstPtrCallback>
809
851
))
810
852
{
811
- callback (convert_ros_message_to_custom_type_unique_ptr (* message));
853
+ callback (std::move ( message));
812
854
} else if constexpr ( // NOLINT[readability/braces]
813
855
is_ta && (
814
856
std::is_same_v<T, SharedConstPtrWithInfoCallback>||
815
857
std::is_same_v<T, ConstRefSharedConstPtrWithInfoCallback>
816
858
))
817
859
{
818
- callback (convert_ros_message_to_custom_type_unique_ptr (* message), message_info);
860
+ callback (std::move ( message), message_info);
819
861
}
820
862
// conditions for ros message type
821
- else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) { // NOLINT
822
- callback (*message);
823
- } else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) {
824
- callback (*message, message_info);
863
+ else if constexpr (std::is_same_v<T, ConstRefROSMessageCallback>) { // NOLINT[readability/braces]
864
+ if constexpr (is_ta) {
865
+ auto local = convert_custom_type_to_ros_message_unique_ptr (*message);
866
+ callback (*local);
867
+ } else {
868
+ callback (*message);
869
+ }
870
+ } else if constexpr (std::is_same_v<T, ConstRefWithInfoROSMessageCallback>) { // NOLINT[readability/braces]
871
+ if constexpr (is_ta) {
872
+ auto local = convert_custom_type_to_ros_message_unique_ptr (*message);
873
+ callback (*local, message_info);
874
+ } else {
875
+ callback (*message, message_info);
876
+ }
825
877
} else if constexpr ( // NOLINT[readability/braces]
826
878
std::is_same_v<T, UniquePtrROSMessageCallback>||
827
879
std::is_same_v<T, SharedPtrROSMessageCallback>)
828
880
{
829
- callback (std::move (message));
881
+ if constexpr (is_ta) {
882
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message));
883
+ } else {
884
+ callback (std::move (message));
885
+ }
830
886
} else if constexpr ( // NOLINT[readability/braces]
831
887
std::is_same_v<T, UniquePtrWithInfoROSMessageCallback>||
832
888
std::is_same_v<T, SharedPtrWithInfoROSMessageCallback>)
833
889
{
834
- callback (std::move (message), message_info);
890
+ if constexpr (is_ta) {
891
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message), message_info);
892
+ } else {
893
+ callback (std::move (message), message_info);
894
+ }
835
895
} else if constexpr ( // NOLINT[readability/braces]
836
896
std::is_same_v<T, SharedConstPtrROSMessageCallback>||
837
897
std::is_same_v<T, ConstRefSharedConstPtrROSMessageCallback>)
838
898
{
839
- callback (std::move (message));
899
+ if constexpr (is_ta) {
900
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message));
901
+ } else {
902
+ callback (std::move (message));
903
+ }
840
904
} else if constexpr ( // NOLINT[readability/braces]
841
905
std::is_same_v<T, SharedConstPtrWithInfoROSMessageCallback>||
842
906
std::is_same_v<T, ConstRefSharedConstPtrWithInfoROSMessageCallback>)
843
907
{
844
- callback (std::move (message), message_info);
908
+ if constexpr (is_ta) {
909
+ callback (convert_custom_type_to_ros_message_unique_ptr (*message), message_info);
910
+ } else {
911
+ callback (std::move (message), message_info);
912
+ }
845
913
}
846
914
// condition to catch SerializedMessage types
847
915
else if constexpr ( // NOLINT[readability/braces]
0 commit comments