add any subscription callback types for const, remove references from unique_ptrs
This commit is contained in:
parent
8e4cc7c626
commit
00daba2726
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