15 #ifndef RCLCPP__NODE_INTERFACES__DETAIL__NODE_INTERFACES_HELPERS_HPP_
16 #define RCLCPP__NODE_INTERFACES__DETAIL__NODE_INTERFACES_HELPERS_HPP_
20 #include <type_traits>
26 namespace node_interfaces
33 template<
typename NodeT,
typename ... Ts>
34 std::tuple<std::shared_ptr<Ts>...>
35 init_tuple(NodeT & n);
38 template<
typename ... InterfaceTs>
41 template<
typename NodeT>
43 : interfaces_(init_tuple<decltype(node), InterfaceTs ...>(node))
51 : interfaces_(args ...)
55 template<
typename NodeInterfaceT>
56 std::shared_ptr<NodeInterfaceT>
60 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
61 "NodeInterfaces class does not contain given NodeInterfaceT");
62 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
66 template<
typename NodeInterfaceT>
67 std::shared_ptr<const NodeInterfaceT>
71 (std::is_same_v<NodeInterfaceT, InterfaceTs>|| ...),
72 "NodeInterfaces class does not contain given NodeInterfaceT");
73 return std::get<std::shared_ptr<NodeInterfaceT>>(interfaces_);
77 std::tuple<std::shared_ptr<InterfaceTs>...> interfaces_;
87 template<
typename StorageClassT,
typename ... Ts>
88 struct NodeInterfacesSupports;
95 template<
typename StorageClassT,
typename ... InterfaceTs>
99 template<
typename StorageClassT,
typename NextInterfaceT,
typename ... RemainingInterfaceTs>
105 "given NodeInterfaceT is not supported by rclcpp::node_interfaces::NodeInterfaces");
109 template<
typename StorageClassT>
114 template<
typename StorageClassT,
typename ... RemainingInterfaceTs>
118 using is_supported = std::false_type;
122 template<
typename StorageClassT>
124 :
public StorageClassT
127 template<
typename ... ArgsT>
129 : StorageClassT(std::forward<ArgsT>(args) ...)
135 template<
typename StorageClassT,
typename ElementT,
typename TupleT,
typename NodeT>
137 init_element(TupleT & t, NodeT & n)
139 std::get<std::shared_ptr<ElementT>>(t) =
140 NodeInterfacesSupports<StorageClassT, ElementT>::get_from_node_like(n);
143 template<
typename NodeT,
typename ... Ts>
144 std::tuple<std::shared_ptr<Ts>...>
145 init_tuple(NodeT & n)
147 using StorageClassT = NodeInterfacesStorage<Ts ...>;
148 std::tuple<std::shared_ptr<Ts>...> t;
149 (init_element<StorageClassT, Ts>(t, n), ...);
170 #define RCLCPP_NODE_INTERFACE_HELPERS_SUPPORT(NodeInterfaceType, NodeInterfaceName) \
171 namespace rclcpp::node_interfaces::detail { \
172 template<typename StorageClassT, typename ... RemainingInterfaceTs> \
173 struct NodeInterfacesSupports< \
176 RemainingInterfaceTs ...> \
177 : public NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...> \
179 using is_supported = std::true_type; \
181 template<typename NodeT> \
183 std::shared_ptr<NodeInterfaceType> \
184 get_from_node_like(NodeT & node_like) \
186 return node_like.get_node_ ## NodeInterfaceName ## _interface(); \
190 template<typename ... ArgsT> \
191 explicit NodeInterfacesSupports(ArgsT && ... args) \
192 : NodeInterfacesSupports<StorageClassT, RemainingInterfaceTs ...>( \
193 std::forward<ArgsT>(args) ...) \
196 std::shared_ptr<NodeInterfaceType> \
197 get_node_ ## NodeInterfaceName ## _interface() \
199 return StorageClassT::template get<NodeInterfaceType>(); \
202 std::shared_ptr<const NodeInterfaceType> \
203 get_node_ ## NodeInterfaceName ## _interface() const \
205 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.