Merge pull request #119 from ros2/const_shared_ptr

Add any subscription callback types for shared_ptr<const T>
This commit is contained in:
Jackie Kay 2015-10-13 11:08:01 -07:00
commit 5795861009
2 changed files with 65 additions and 10 deletions

View file

@ -32,20 +32,26 @@ namespace any_subscription_callback
template<typename MessageT>
struct AnySubscriptionCallback
{
using SharedPtrCallback = std::function<void(const std::shared_ptr<MessageT> &)>;
using SharedPtrCallback = std::function<void(const std::shared_ptr<MessageT>)>;
using SharedPtrWithInfoCallback =
std::function<void(const std::shared_ptr<MessageT> &, const rmw_message_info_t &)>;
using UniquePtrCallback = std::function<void(std::unique_ptr<MessageT> &)>;
std::function<void(const std::shared_ptr<MessageT>, const rmw_message_info_t &)>;
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 =
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;
SharedPtrWithInfoCallback shared_ptr_with_info_callback;
ConstSharedPtrCallback const_shared_ptr_callback;
ConstSharedPtrWithInfoCallback const_shared_ptr_with_info_callback;
UniquePtrCallback unique_ptr_callback;
UniquePtrWithInfoCallback unique_ptr_with_info_callback;
AnySubscriptionCallback()
: 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)
{}
@ -80,8 +86,48 @@ struct AnySubscriptionCallback
>
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;
}
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,
typename std::enable_if<

View file

@ -207,12 +207,15 @@ public:
any_callback_.shared_ptr_callback(typed_message);
} else if (any_callback_.shared_ptr_with_info_callback) {
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) {
std::unique_ptr<MessageT> unique_msg(new MessageT(*typed_message));
any_callback_.unique_ptr_callback(unique_msg);
any_callback_.unique_ptr_callback(std::unique_ptr<MessageT>(new MessageT(*typed_message)));
} 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(unique_msg, message_info);
any_callback_.unique_ptr_with_info_callback(std::unique_ptr<MessageT>(new MessageT(*
typed_message)), message_info);
} else {
throw std::runtime_error("unexpected message without any callback set");
}
@ -253,10 +256,16 @@ public:
} else if (any_callback_.shared_ptr_with_info_callback) {
typename MessageT::SharedPtr shared_msg = std::move(msg);
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) {
any_callback_.unique_ptr_callback(msg);
any_callback_.unique_ptr_callback(std::move(msg));
} 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 {
throw std::runtime_error("unexpected message without any callback set");
}