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))
52 : interfaces_(args ...)
56 template<
typename NodeInterfaceT>
57 std::shared_ptr<NodeInterfaceT>
61 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
62 "NodeInterfaces class does not contain given NodeInterfaceT");
63 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
67 template<
typename NodeInterfaceT>
68 std::shared_ptr<const NodeInterfaceT>
72 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
73 "NodeInterfaces class does not contain given NodeInterfaceT");
74 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
78 std::tuple<std::shared_ptr<InterfaceTs>...> interfaces_;
88 template<
typename StorageClassT,
typename ... Ts>
89 struct NodeInterfacesSupports;
96 template<
typename StorageClassT,
typename ... InterfaceTs>
100 template<
typename StorageClassT,
typename NextInterfaceT,
typename ... RemainingInterfaceTs>
106 "given NodeInterfaceT is not supported by rclcpp::node_interfaces::NodeInterfaces");
110 template<
typename StorageClassT>
115 template<
typename StorageClassT,
typename ... RemainingInterfaceTs>
119 using is_supported = std::false_type;
123 template<
typename StorageClassT>
125 :
public StorageClassT
128 template<
typename ... ArgsT>
130 : StorageClassT(std::forward<ArgsT>(args) ...)
136 template<
typename StorageClassT,
typename ElementT,
typename TupleT,
typename NodeT>
138 init_element(TupleT & t, NodeT & n)
140 std::get<std::shared_ptr<ElementT>>(t) =
141 NodeInterfacesSupports<StorageClassT, ElementT>::get_from_node_like(n);
144 template<
typename NodeT,
typename ... Ts>
145 std::tuple<std::shared_ptr<Ts>...>
146 init_tuple(NodeT & n)
148 using StorageClassT = NodeInterfacesStorage<Ts ...>;
149 std::tuple<std::shared_ptr<Ts>...> t;
150 (init_element<StorageClassT, Ts>(t, n), ...);
171 #define RCLCPP_NODE_INTERFACE_HELPERS_SUPPORT(NodeInterfaceType, NodeInterfaceName) \
172 namespace rclcpp::node_interfaces::detail { \
173 template<typename StorageClassT, typename ... RemainingInterfaceTs> \
174 struct NodeInterfacesSupports< \
177 RemainingInterfaceTs ...> \
178 : public NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...> \
180 using is_supported = std::true_type; \
182 template<typename NodeT> \
184 std::shared_ptr<NodeInterfaceType> \
185 get_from_node_like(NodeT & node_like) \
187 return node_like.get_node_ ## NodeInterfaceName ## _interface(); \
191 template<typename ... ArgsT> \
192 explicit NodeInterfacesSupports(ArgsT && ... args) \
193 : NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...>( \
194 std::forward<ArgsT>(args) ...) \
197 std::shared_ptr<NodeInterfaceType> \
198 get_node_ ## NodeInterfaceName ## _interface() \
200 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.