diff --git a/rclcpp/include/rclcpp/any_subscription_callback.hpp b/rclcpp/include/rclcpp/any_subscription_callback.hpp index a2249b74a8..661e6b97fd 100644 --- a/rclcpp/include/rclcpp/any_subscription_callback.hpp +++ b/rclcpp/include/rclcpp/any_subscription_callback.hpp @@ -407,12 +407,73 @@ class AnySubscriptionCallback // converted to one another, e.g. shared_ptr and unique_ptr. using scbth = detail::SubscriptionCallbackTypeHelper; - callback_variant_ = static_cast(callback); + // Determine if the given CallbackT is a deprecated signature or not. + constexpr auto is_deprecated = + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function)> + >::value || + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function, const rclcpp::MessageInfo &)> + >::value || + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function)> + >::value || + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function, const rclcpp::MessageInfo &)> + >::value || + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function)> + >::value || + rclcpp::function_traits::same_arguments< + typename scbth::callback_type, + std::function, const rclcpp::MessageInfo &)> + >::value; + + // Use the discovered type to force the type of callback when assigning + // into the variant. + if constexpr (is_deprecated) { + // If deprecated, call sub-routine that is deprecated. + set_deprecated(static_cast(callback)); + } else { + // Otherwise just assign it. + callback_variant_ = static_cast(callback); + } // Return copy of self for easier testing, normally will be compiled out. return *this; } + /// Function for shared_ptr to non-const MessageT, which is deprecated. + template + #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS) + // suppress deprecation warnings in `test_any_subscription_callback.cpp` + [[deprecated("use 'void(std::shared_ptr)' instead")]] + #endif + void + set_deprecated(std::function)> callback) + { + callback_variant_ = callback; + } + + /// Function for shared_ptr to non-const MessageT with MessageInfo, which is deprecated. + template + #if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS) + // suppress deprecation warnings in `test_any_subscription_callback.cpp` + [[deprecated( + "use 'void(std::shared_ptr, const rclcpp::MessageInfo &)' instead" + )]] + #endif + void + set_deprecated(std::function, const rclcpp::MessageInfo &)> callback) + { + callback_variant_ = callback; + } + /// Disable the callback from being called during dispatch. void disable() { diff --git a/rclcpp/test/rclcpp/test_any_subscription_callback.cpp b/rclcpp/test/rclcpp/test_any_subscription_callback.cpp index 9539bebd01..f292399695 100644 --- a/rclcpp/test/rclcpp/test_any_subscription_callback.cpp +++ b/rclcpp/test/rclcpp/test_any_subscription_callback.cpp @@ -20,6 +20,7 @@ #include #include +#define RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS 1 #include "rclcpp/any_subscription_callback.hpp" #include "test_msgs/msg/empty.hpp" @@ -178,7 +179,7 @@ TEST_F(TestAnySubscriptionCallback, is_serialized_message_callback) { } { rclcpp::AnySubscriptionCallback asc; - asc.set([](std::shared_ptr) {}); + asc.set([](std::shared_ptr) {}); EXPECT_TRUE(asc.is_serialized_message_callback()); EXPECT_NO_THROW( asc.dispatch( @@ -187,7 +188,7 @@ TEST_F(TestAnySubscriptionCallback, is_serialized_message_callback) { } { rclcpp::AnySubscriptionCallback asc; - asc.set([](std::shared_ptr, const rclcpp::MessageInfo &) {}); + asc.set([](std::shared_ptr, const rclcpp::MessageInfo &) {}); EXPECT_TRUE(asc.is_serialized_message_callback()); EXPECT_NO_THROW( asc.dispatch( diff --git a/rclcpp/test/rclcpp/test_subscription_publisher_with_same_type_adapter.cpp b/rclcpp/test/rclcpp/test_subscription_publisher_with_same_type_adapter.cpp index ffb47e9468..d733d9758b 100644 --- a/rclcpp/test/rclcpp/test_subscription_publisher_with_same_type_adapter.cpp +++ b/rclcpp/test/rclcpp/test_subscription_publisher_with_same_type_adapter.cpp @@ -212,7 +212,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg) -> void { + std::shared_ptr msg) -> void { is_received = true; EXPECT_STREQ(message_data.c_str(), (*msg).c_str()); }; @@ -230,7 +230,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg, + std::shared_ptr msg, const rclcpp::MessageInfo & message_info) -> void { is_received = true; EXPECT_STREQ(message_data.c_str(), (*msg).c_str()); @@ -422,7 +422,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg) -> void { + std::shared_ptr msg) -> void { is_received = true; EXPECT_STREQ(message_data.c_str(), (*msg).c_str()); }; @@ -440,7 +440,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg, + std::shared_ptr msg, const rclcpp::MessageInfo & message_info) -> void { is_received = true; EXPECT_STREQ(message_data.c_str(), (*msg).c_str()); @@ -637,7 +637,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg) -> void { + std::shared_ptr msg) -> void { is_received = true; ASSERT_EQ(message_data, *msg); }; @@ -656,7 +656,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg, + std::shared_ptr msg, const rclcpp::MessageInfo & message_info) -> void { is_received = true; ASSERT_EQ(message_data, *msg); @@ -862,7 +862,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg) -> void { + std::shared_ptr msg) -> void { is_received = true; ASSERT_EQ(message_data, *msg); }; @@ -882,7 +882,7 @@ TEST_F( bool is_received = false; auto callback = [message_data, &is_received]( - std::shared_ptr msg, + std::shared_ptr msg, const rclcpp::MessageInfo & message_info) -> void { is_received = true; ASSERT_EQ(message_data, *msg);