15 #ifndef RCLCPP__NODE_INTERFACES__DETAIL__NODE_INTERFACES_HELPERS_HPP_
16 #define RCLCPP__NODE_INTERFACES__DETAIL__NODE_INTERFACES_HELPERS_HPP_
20 #include <type_traits>
23 #include "rclcpp/visibility_control.hpp"
27 namespace node_interfaces
34 template<
typename NodeT,
typename ... Ts>
35 std::tuple<std::shared_ptr<Ts>...>
36 init_tuple(NodeT & n);
39 template<
typename ... InterfaceTs>
42 template<
typename NodeT>
44 : interfaces_(init_tuple<decltype(node), InterfaceTs ...>(node))
48 : interfaces_(args ...)
52 template<
typename NodeInterfaceT>
53 std::shared_ptr<NodeInterfaceT>
57 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
58 "NodeInterfaces class does not contain given NodeInterfaceT");
59 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
63 template<
typename NodeInterfaceT>
64 std::shared_ptr<const NodeInterfaceT>
68 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
69 "NodeInterfaces class does not contain given NodeInterfaceT");
70 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
74 std::tuple<std::shared_ptr<InterfaceTs>...> interfaces_;
84 template<
typename StorageClassT,
typename ... Ts>
85 struct NodeInterfacesSupports;
92 template<
typename StorageClassT,
typename ... InterfaceTs>
96 template<
typename StorageClassT,
typename NextInterfaceT,
typename ... RemainingInterfaceTs>
102 "given NodeInterfaceT is not supported by rclcpp::node_interfaces::NodeInterfaces");
106 template<
typename StorageClassT>
111 template<
typename StorageClassT,
typename ... RemainingInterfaceTs>
115 using is_supported = std::false_type;
119 template<
typename StorageClassT>
121 :
public StorageClassT
124 template<
typename ... ArgsT>
126 : StorageClassT(std::forward<ArgsT>(args) ...)
132 template<
typename StorageClassT,
typename ElementT,
typename TupleT,
typename NodeT>
134 init_element(TupleT & t, NodeT & n)
136 std::get<std::shared_ptr<ElementT>>(t) =
137 NodeInterfacesSupports<StorageClassT, ElementT>::get_from_node_like(n);
140 template<
typename NodeT,
typename ... Ts>
141 std::tuple<std::shared_ptr<Ts>...>
142 init_tuple(NodeT & n)
144 using StorageClassT = NodeInterfacesStorage<Ts ...>;
145 std::tuple<std::shared_ptr<Ts>...> t;
146 (init_element<StorageClassT, Ts>(t, n), ...);
166 #define RCLCPP_NODE_INTERFACE_HELPERS_SUPPORT(NodeInterfaceType, NodeInterfaceName) \
167 namespace rclcpp::node_interfaces::detail { \
168 template<typename StorageClassT, typename ... RemainingInterfaceTs> \
169 struct NodeInterfacesSupports< \
172 RemainingInterfaceTs ...> \
173 : public NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...> \
175 using is_supported = std::true_type; \
177 template<typename NodeT> \
179 std::shared_ptr<NodeInterfaceType> \
180 get_from_node_like(NodeT & node_like) \
182 return node_like.get_node_ ## NodeInterfaceName ## _interface(); \
186 template<typename ... ArgsT> \
187 explicit NodeInterfacesSupports(ArgsT && ... args) \
188 : NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...>( \
189 std::forward<ArgsT>(args) ...) \
192 std::shared_ptr<NodeInterfaceType> \
193 get_node_ ## NodeInterfaceName ## _interface() \
195 return StorageClassT::template get<NodeInterfaceType>(); \
198 std::shared_ptr<const NodeInterfaceType> \
199 get_node_ ## NodeInterfaceName ## _interface() const \
201 return StorageClassT::template get<NodeInterfaceType>(); \
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
Stores the interfaces in a tuple, provides constructors, and getters.
std::shared_ptr< const NodeInterfaceT > get() const
Individual Node Interface const getter.
std::shared_ptr< NodeInterfaceT > get()
Individual Node Interface non-const getter.
Prototype of NodeInterfacesSupportCheck template meta-function.
NodeInterfacesSupports(ArgsT &&... args)
Perfect forwarding constructor to get arguments down to StorageClassT.
Prototype of NodeInterfacesSupports.