Merge pull request #119 from ros2/const_shared_ptr
Add any subscription callback types for shared_ptr<const T>
This commit is contained in:
		
						commit
						5795861009
					
				
					 2 changed files with 65 additions and 10 deletions
				
			
		| 
						 | 
					@ -32,20 +32,26 @@ namespace any_subscription_callback
 | 
				
			||||||
template<typename MessageT>
 | 
					template<typename MessageT>
 | 
				
			||||||
struct AnySubscriptionCallback
 | 
					struct AnySubscriptionCallback
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  using SharedPtrCallback = std::function<void(const std::shared_ptr<MessageT> &)>;
 | 
					  using SharedPtrCallback = std::function<void(const std::shared_ptr<MessageT>)>;
 | 
				
			||||||
  using SharedPtrWithInfoCallback =
 | 
					  using SharedPtrWithInfoCallback =
 | 
				
			||||||
      std::function<void(const std::shared_ptr<MessageT> &, const rmw_message_info_t &)>;
 | 
					      std::function<void(const std::shared_ptr<MessageT>, const rmw_message_info_t &)>;
 | 
				
			||||||
  using UniquePtrCallback = std::function<void(std::unique_ptr<MessageT> &)>;
 | 
					  using ConstSharedPtrCallback = std::function<void(const std::shared_ptr<const MessageT>)>;
 | 
				
			||||||
 | 
					  using ConstSharedPtrWithInfoCallback =
 | 
				
			||||||
 | 
					      std::function<void(const std::shared_ptr<const MessageT>, const rmw_message_info_t &)>;
 | 
				
			||||||
 | 
					  using UniquePtrCallback = std::function<void(std::unique_ptr<MessageT>)>;
 | 
				
			||||||
  using UniquePtrWithInfoCallback =
 | 
					  using UniquePtrWithInfoCallback =
 | 
				
			||||||
      std::function<void(std::unique_ptr<MessageT> &, const rmw_message_info_t &)>;
 | 
					      std::function<void(std::unique_ptr<MessageT>, const rmw_message_info_t &)>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SharedPtrCallback shared_ptr_callback;
 | 
					  SharedPtrCallback shared_ptr_callback;
 | 
				
			||||||
  SharedPtrWithInfoCallback shared_ptr_with_info_callback;
 | 
					  SharedPtrWithInfoCallback shared_ptr_with_info_callback;
 | 
				
			||||||
 | 
					  ConstSharedPtrCallback const_shared_ptr_callback;
 | 
				
			||||||
 | 
					  ConstSharedPtrWithInfoCallback const_shared_ptr_with_info_callback;
 | 
				
			||||||
  UniquePtrCallback unique_ptr_callback;
 | 
					  UniquePtrCallback unique_ptr_callback;
 | 
				
			||||||
  UniquePtrWithInfoCallback unique_ptr_with_info_callback;
 | 
					  UniquePtrWithInfoCallback unique_ptr_with_info_callback;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AnySubscriptionCallback()
 | 
					  AnySubscriptionCallback()
 | 
				
			||||||
  : shared_ptr_callback(nullptr), shared_ptr_with_info_callback(nullptr),
 | 
					  : shared_ptr_callback(nullptr), shared_ptr_with_info_callback(nullptr),
 | 
				
			||||||
 | 
					    const_shared_ptr_callback(nullptr), const_shared_ptr_with_info_callback(nullptr),
 | 
				
			||||||
    unique_ptr_callback(nullptr), unique_ptr_with_info_callback(nullptr)
 | 
					    unique_ptr_callback(nullptr), unique_ptr_with_info_callback(nullptr)
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,8 +86,48 @@ struct AnySubscriptionCallback
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
  void set(CallbackT callback)
 | 
					  void set(CallbackT callback)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    static_assert(std::is_same<
 | 
				
			||||||
 | 
					        typename function_traits<CallbackT>::template argument_type<1>,
 | 
				
			||||||
 | 
					        const rmw_message_info_t &>::value,
 | 
				
			||||||
 | 
					      "Passed incorrect argument type to callback, should be rmw_message_info_t");
 | 
				
			||||||
    shared_ptr_with_info_callback = callback;
 | 
					    shared_ptr_with_info_callback = callback;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  template<typename CallbackT,
 | 
				
			||||||
 | 
					  typename std::enable_if<
 | 
				
			||||||
 | 
					    function_traits<CallbackT>::arity == 1
 | 
				
			||||||
 | 
					  >::type * = nullptr,
 | 
				
			||||||
 | 
					  typename std::enable_if<
 | 
				
			||||||
 | 
					    std::is_same<
 | 
				
			||||||
 | 
					      typename function_traits<CallbackT>::template argument_type<0>,
 | 
				
			||||||
 | 
					      typename std::shared_ptr<const MessageT>
 | 
				
			||||||
 | 
					    >::value
 | 
				
			||||||
 | 
					  >::type * = nullptr
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					  void set(CallbackT callback)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    const_shared_ptr_callback = callback;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  template<typename CallbackT,
 | 
				
			||||||
 | 
					  typename std::enable_if<
 | 
				
			||||||
 | 
					    function_traits<CallbackT>::arity == 2
 | 
				
			||||||
 | 
					  >::type * = nullptr,
 | 
				
			||||||
 | 
					  typename std::enable_if<
 | 
				
			||||||
 | 
					    std::is_same<
 | 
				
			||||||
 | 
					      typename function_traits<CallbackT>::template argument_type<0>,
 | 
				
			||||||
 | 
					      typename std::shared_ptr<const MessageT>
 | 
				
			||||||
 | 
					    >::value
 | 
				
			||||||
 | 
					  >::type * = nullptr
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					  void set(CallbackT callback)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    static_assert(std::is_same<
 | 
				
			||||||
 | 
					        typename function_traits<CallbackT>::template argument_type<1>,
 | 
				
			||||||
 | 
					        const rmw_message_info_t &>::value,
 | 
				
			||||||
 | 
					      "Passed incorrect argument type to callback, should be rmw_message_info_t");
 | 
				
			||||||
 | 
					    const_shared_ptr_with_info_callback = callback;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
  template<typename CallbackT,
 | 
					  template<typename CallbackT,
 | 
				
			||||||
    typename std::enable_if<
 | 
					    typename std::enable_if<
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,12 +207,15 @@ public:
 | 
				
			||||||
      any_callback_.shared_ptr_callback(typed_message);
 | 
					      any_callback_.shared_ptr_callback(typed_message);
 | 
				
			||||||
    } else if (any_callback_.shared_ptr_with_info_callback) {
 | 
					    } else if (any_callback_.shared_ptr_with_info_callback) {
 | 
				
			||||||
      any_callback_.shared_ptr_with_info_callback(typed_message, message_info);
 | 
					      any_callback_.shared_ptr_with_info_callback(typed_message, message_info);
 | 
				
			||||||
 | 
					    } else if (any_callback_.const_shared_ptr_callback) {
 | 
				
			||||||
 | 
					      any_callback_.const_shared_ptr_callback(typed_message);
 | 
				
			||||||
 | 
					    } else if (any_callback_.const_shared_ptr_with_info_callback) {
 | 
				
			||||||
 | 
					      any_callback_.const_shared_ptr_with_info_callback(typed_message, message_info);
 | 
				
			||||||
    } else if (any_callback_.unique_ptr_callback) {
 | 
					    } else if (any_callback_.unique_ptr_callback) {
 | 
				
			||||||
      std::unique_ptr<MessageT> unique_msg(new MessageT(*typed_message));
 | 
					      any_callback_.unique_ptr_callback(std::unique_ptr<MessageT>(new MessageT(*typed_message)));
 | 
				
			||||||
      any_callback_.unique_ptr_callback(unique_msg);
 | 
					 | 
				
			||||||
    } else if (any_callback_.unique_ptr_with_info_callback) {
 | 
					    } else if (any_callback_.unique_ptr_with_info_callback) {
 | 
				
			||||||
      std::unique_ptr<MessageT> unique_msg(new MessageT(*typed_message));
 | 
					      any_callback_.unique_ptr_with_info_callback(std::unique_ptr<MessageT>(new MessageT(*
 | 
				
			||||||
      any_callback_.unique_ptr_with_info_callback(unique_msg, message_info);
 | 
					        typed_message)), message_info);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      throw std::runtime_error("unexpected message without any callback set");
 | 
					      throw std::runtime_error("unexpected message without any callback set");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -253,10 +256,16 @@ public:
 | 
				
			||||||
    } else if (any_callback_.shared_ptr_with_info_callback) {
 | 
					    } else if (any_callback_.shared_ptr_with_info_callback) {
 | 
				
			||||||
      typename MessageT::SharedPtr shared_msg = std::move(msg);
 | 
					      typename MessageT::SharedPtr shared_msg = std::move(msg);
 | 
				
			||||||
      any_callback_.shared_ptr_with_info_callback(shared_msg, message_info);
 | 
					      any_callback_.shared_ptr_with_info_callback(shared_msg, message_info);
 | 
				
			||||||
 | 
					    } else if (any_callback_.const_shared_ptr_callback) {
 | 
				
			||||||
 | 
					      typename MessageT::ConstSharedPtr const_shared_msg = std::move(msg);
 | 
				
			||||||
 | 
					      any_callback_.const_shared_ptr_callback(const_shared_msg);
 | 
				
			||||||
 | 
					    } else if (any_callback_.const_shared_ptr_with_info_callback) {
 | 
				
			||||||
 | 
					      typename MessageT::ConstSharedPtr const_shared_msg = std::move(msg);
 | 
				
			||||||
 | 
					      any_callback_.const_shared_ptr_with_info_callback(const_shared_msg, message_info);
 | 
				
			||||||
    } else if (any_callback_.unique_ptr_callback) {
 | 
					    } else if (any_callback_.unique_ptr_callback) {
 | 
				
			||||||
      any_callback_.unique_ptr_callback(msg);
 | 
					      any_callback_.unique_ptr_callback(std::move(msg));
 | 
				
			||||||
    } else if (any_callback_.unique_ptr_with_info_callback) {
 | 
					    } else if (any_callback_.unique_ptr_with_info_callback) {
 | 
				
			||||||
      any_callback_.unique_ptr_with_info_callback(msg, message_info);
 | 
					      any_callback_.unique_ptr_with_info_callback(std::move(msg), message_info);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      throw std::runtime_error("unexpected message without any callback set");
 | 
					      throw std::runtime_error("unexpected message without any callback set");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue