RTC Toolkit 4.0.2
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 <cstdint>
15#include <system_error>
16#include <vector>
17
18#include <ipcq/writer.hpp>
19
21
22namespace rtctk::telSub {
23
32template <class UserTopicType, class DataBlender, class ShmWriter = ipcq::Writer<UserTopicType>>
33class ShmPublisher final : public ShmPublisherIf {
34public:
35 ShmPublisher(ShmWriter&& shm_writer, DataBlender& blender);
36
41 std::error_code Publish(DataSamplesView const& samples) noexcept override;
42
43 void CloseQueue() noexcept override;
44
45private:
49 UserTopicType m_topic;
50 DataBlender& m_blender;
51 ShmWriter m_shm;
52};
53
59template <class UserTopicType, class DataBlender, class ShmWriter>
60auto MakeShmPublisher(ShmWriter&& shm_writer, DataBlender& blender)
61 -> std::unique_ptr<ShmPublisher<UserTopicType, DataBlender, ShmWriter>> {
62 return std::make_unique<ShmPublisher<UserTopicType, DataBlender, ShmWriter>>(
63 std::move(shm_writer), blender);
64}
65
66template <class UserTopicType, class DataBlender, class ShmWriter>
68 DataBlender& blender)
69 : m_topic(), m_blender(blender), m_shm(std::move(shm_writer)) {
70 static_assert(std::is_invocable_r<std::error_code,
71 DataBlender,
73 UserTopicType&>::value,
74 "DataBlender must have the signature "
75 "`std::error_code(const rtctk::telSub::DataSamplesView&, "
76 "UserTopicType&)`");
77}
78
79template <class UserTopicType, class DataBlender, class ShmWriter>
81 DataSamplesView const& samples) noexcept {
82 // Invoke blender and write to SHM queue.
83 if (auto err = m_blender(samples, m_topic); !err) /*[[likely]]*/ {
84 return m_shm.Write(m_topic, ipcq::Notify::All);
85 } else /*[[unlikely]]*/ {
86 return err;
87 }
88}
89
90template <class UserTopicType, class DataBlender, class ShmWriter>
92 m_shm.Close();
93}
94
95} // namespace rtctk::telSub
96
97#endif // RTCTK_TELSUB_SHMPUBLISHER_HPP
Simple interface to class that owns the shared memory queue.
Definition: shmPublisherIf.hpp:29
Definition: shmPublisher.hpp:33
ShmPublisher(ShmWriter &&shm_writer, DataBlender &blender)
Definition: shmPublisher.hpp:67
std::error_code Publish(DataSamplesView const &samples) noexcept override
Publish correlated DDS samples to shared memory, transforming it first using DataBlender to a UserTop...
Definition: shmPublisher.hpp:80
void CloseQueue() noexcept override
Close shared memory queue.
Definition: shmPublisher.hpp:91
Definition: main.cpp:18
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:60
Declares ShmPublisher.
A set of correlated agnostic non-owning data samples references.
Definition: dataSampleView.hpp:49