RTC Toolkit 6.0.0-pre2
Loading...
Searching...
No Matches
shmPublisher.hpp
Go to the documentation of this file.
1
12#ifndef RTCTK_TELSUB_SHMPUBLISHER_HPP
13#define RTCTK_TELSUB_SHMPUBLISHER_HPP
14#include <network/optional.hpp>
15#include <system_error>
16
17#include <ipcq/writer.hpp>
18
20
21namespace rtctk::telSub {
22
31template <class UserTopicType, class DataBlender, class ShmWriter = ipcq::Writer<UserTopicType>>
32class ShmPublisher final : public ShmPublisherIf {
33public:
34 ShmPublisher(ShmWriter&& shm_writer, DataBlender& blender);
35
40 PublisherError Publish(const DataSamplesView& samples) noexcept override;
41
42 void CloseQueue() noexcept override;
43
44private:
48 UserTopicType m_topic;
49 DataBlender& m_blender;
50 ShmWriter m_shm;
51};
52
58template <class UserTopicType, class DataBlender, class ShmWriter>
59auto MakeShmPublisher(ShmWriter&& shm_writer, DataBlender& blender)
60 -> std::unique_ptr<ShmPublisher<UserTopicType, DataBlender, ShmWriter>> {
61 return std::make_unique<ShmPublisher<UserTopicType, DataBlender, ShmWriter>>(
62 std::forward<ShmWriter>(shm_writer), blender);
63}
64
65template <class UserTopicType, class DataBlender, class ShmWriter>
67 DataBlender& blender)
68 : m_topic(), m_blender(blender), m_shm(std::move(shm_writer)) {
69 static_assert(std::is_invocable_r_v<std::error_code,
70 DataBlender,
72 UserTopicType&>,
73 "DataBlender must have the signature "
74 "`std::error_code(const rtctk::telSub::DataSamplesView&, "
75 "UserTopicType&)`");
76}
77
78template <class UserTopicType, class DataBlender, class ShmWriter>
80 const DataSamplesView& samples) noexcept {
81 // Invoke blender and write to SHM queue.
82 if (auto err = m_blender(samples, m_topic); !err) /*[[likely]]*/ {
83 auto shm_err = m_shm.Write(m_topic, ipcq::Notify::All);
84 if (shm_err) {
85 return ShmError{shm_err};
86 }
87 return {};
88 } else /*[[unlikely]]*/ {
89 return BlenderError{err};
90 }
91}
92
93template <class UserTopicType, class DataBlender, class ShmWriter>
97
98} // namespace rtctk::telSub
99
100#endif // RTCTK_TELSUB_SHMPUBLISHER_HPP
Simple interface to class that owns the shared memory queue.
Definition shmPublisherIf.hpp:31
std::variant< std::monostate, BlenderError, ShmError > PublisherError
Definition shmPublisherIf.hpp:45
PublisherError Publish(const DataSamplesView &samples) noexcept override
Publish correlated DDS samples to shared memory, transforming it first using DataBlender to a UserTop...
Definition shmPublisher.hpp:79
ShmPublisher(ShmWriter &&shm_writer, DataBlender &blender)
Definition shmPublisher.hpp:66
void CloseQueue() noexcept override
Close shared memory queue.
Definition shmPublisher.hpp:94
Definition main.cpp:24
auto MakeShmPublisher(ShmWriter &&shm_writer, DataBlender &blender) -> std::unique_ptr< ShmPublisher< UserTopicType, DataBlender, ShmWriter > >
Helper that can deduce DataBlender class template argument.
Definition shmPublisher.hpp:59
Definition ddsSub.hpp:156
Declares ShmPublisher.
A set of correlated agnostic non-owning data samples references.
Definition dataSampleView.hpp:52
Definition shmPublisherIf.hpp:33
Definition shmPublisherIf.hpp:39