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