15 #ifndef RCLCPP__EXPERIMENTAL__BUFFERS__INTRA_PROCESS_BUFFER_HPP_
16 #define RCLCPP__EXPERIMENTAL__BUFFERS__INTRA_PROCESS_BUFFER_HPP_
20 #include <type_traits>
23 #include "rclcpp/allocator/allocator_common.hpp"
24 #include "rclcpp/allocator/allocator_deleter.hpp"
25 #include "rclcpp/experimental/buffers/buffer_implementation_base.hpp"
26 #include "rclcpp/macros.hpp"
30 namespace experimental
42 virtual void clear() = 0;
44 virtual bool has_data()
const = 0;
45 virtual bool use_take_shared_method()
const = 0;
50 typename Alloc = std::allocator<void>,
51 typename MessageDeleter = std::default_delete<MessageT>>
59 using MessageUniquePtr = std::unique_ptr<MessageT, MessageDeleter>;
60 using MessageSharedPtr = std::shared_ptr<const MessageT>;
62 virtual void add_shared(MessageSharedPtr msg) = 0;
63 virtual void add_unique(MessageUniquePtr msg) = 0;
65 virtual MessageSharedPtr consume_shared() = 0;
66 virtual MessageUniquePtr consume_unique() = 0;
71 typename Alloc = std::allocator<void>,
72 typename MessageDeleter = std::default_delete<MessageT>,
73 typename BufferT = std::unique_ptr<MessageT>>
79 using MessageAllocTraits = allocator::AllocRebind<MessageT, Alloc>;
80 using MessageAlloc =
typename MessageAllocTraits::allocator_type;
81 using MessageUniquePtr = std::unique_ptr<MessageT, MessageDeleter>;
82 using MessageSharedPtr = std::shared_ptr<const MessageT>;
87 std::shared_ptr<Alloc> allocator =
nullptr)
89 bool valid_type = (std::is_same<BufferT, MessageSharedPtr>::value ||
90 std::is_same<BufferT, MessageUniquePtr>::value);
92 throw std::runtime_error(
"Creating TypedIntraProcessBuffer with not valid BufferT");
95 buffer_ = std::move(buffer_impl);
98 message_allocator_ = std::make_shared<MessageAlloc>();
100 message_allocator_ = std::make_shared<MessageAlloc>(*allocator.get());
106 void add_shared(MessageSharedPtr msg)
override
108 add_shared_impl<BufferT>(std::move(msg));
111 void add_unique(MessageUniquePtr msg)
override
113 buffer_->enqueue(std::move(msg));
116 MessageSharedPtr consume_shared()
override
118 return consume_shared_impl<BufferT>();
121 MessageUniquePtr consume_unique()
override
123 return consume_unique_impl<BufferT>();
126 bool has_data()
const override
128 return buffer_->has_data();
131 void clear()
override
136 bool use_take_shared_method()
const override
138 return std::is_same<BufferT, MessageSharedPtr>::value;
142 std::unique_ptr<BufferImplementationBase<BufferT>> buffer_;
144 std::shared_ptr<MessageAlloc> message_allocator_;
147 template<
typename DestinationT>
148 typename std::enable_if<
149 std::is_same<DestinationT, MessageSharedPtr>::value
151 add_shared_impl(MessageSharedPtr shared_msg)
153 buffer_->enqueue(std::move(shared_msg));
157 template<
typename DestinationT>
158 typename std::enable_if<
159 std::is_same<DestinationT, MessageUniquePtr>::value
161 add_shared_impl(MessageSharedPtr shared_msg)
166 MessageUniquePtr unique_msg;
167 MessageDeleter * deleter = std::get_deleter<MessageDeleter, const MessageT>(shared_msg);
168 auto ptr = MessageAllocTraits::allocate(*message_allocator_.get(), 1);
169 MessageAllocTraits::construct(*message_allocator_.get(), ptr, *shared_msg);
171 unique_msg = MessageUniquePtr(ptr, *deleter);
173 unique_msg = MessageUniquePtr(ptr);
176 buffer_->enqueue(std::move(unique_msg));
180 template<
typename OriginT>
181 typename std::enable_if<
182 std::is_same<OriginT, MessageSharedPtr>::value,
185 consume_shared_impl()
187 return buffer_->dequeue();
191 template<
typename OriginT>
192 typename std::enable_if<
193 (std::is_same<OriginT, MessageUniquePtr>::value),
196 consume_shared_impl()
199 return buffer_->dequeue();
203 template<
typename OriginT>
204 typename std::enable_if<
205 (std::is_same<OriginT, MessageSharedPtr>::value),
208 consume_unique_impl()
210 MessageSharedPtr buffer_msg = buffer_->dequeue();
212 MessageUniquePtr unique_msg;
213 MessageDeleter * deleter = std::get_deleter<MessageDeleter, const MessageT>(buffer_msg);
214 auto ptr = MessageAllocTraits::allocate(*message_allocator_.get(), 1);
215 MessageAllocTraits::construct(*message_allocator_.get(), ptr, *buffer_msg);
217 unique_msg = MessageUniquePtr(ptr, *deleter);
219 unique_msg = MessageUniquePtr(ptr);
226 template<
typename OriginT>
227 typename std::enable_if<
228 (std::is_same<OriginT, MessageUniquePtr>::value),
231 consume_unique_impl()
233 return buffer_->dequeue();
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.