RTC Toolkit  0.1.0-alpha
shmPublisher.hpp
Go to the documentation of this file.
1 
8 #ifndef RTCKT_TELSUB_SHMPUBLISHER_HPP
9 #define RTCKT_TELSUB_SHMPUBLISHER_HPP
10 #include <cstdint>
11 #include <system_error>
12 #include <vector>
13 
14 #include <ipcq/writer.hpp>
15 
16 #include "dataSample.hpp"
17 #include "shmPublisherIf.hpp"
18 
19 namespace rtctk::telSub {
20 
26 template <class UserTopicType, class DataBlender, class ShmWriter = ipcq::Writer<UserTopicType>>
27 class ShmPublisher final : public ShmPublisherIf {
28 public:
29  ShmPublisher(ShmWriter&& shm_writer, DataBlender& blender);
30 
35  std::error_code Publish(CorrelatedDataSamplesRef const& dds_samples) noexcept override;
36 
37  void CloseQueue() noexcept override;
38 private:
42  UserTopicType m_topic;
43  DataBlender& m_blender;
44  ShmWriter m_shm;
45 };
46 
52 template <class UserTopicType, class DataBlender, class ShmWriter>
53 auto MakeShmPublisher(ShmWriter&& shm_writer, DataBlender& blender)
54  -> std::unique_ptr<ShmPublisher<UserTopicType, DataBlender, ShmWriter>> {
55  return std::make_unique<ShmPublisher<UserTopicType, DataBlender, ShmWriter>>(
56  std::move(shm_writer), blender);
57 }
58 
59 template <class UserTopicType, class DataBlender, class ShmWriter>
61  DataBlender& blender)
62  : m_topic()
63  , m_blender(blender)
64  , m_shm(std::move(shm_writer)) {
65  static_assert(std::is_invocable_r<std::error_code,
66  DataBlender,
68  UserTopicType&>::value,
69  "DataBlender must have the signature "
70  "`std::error_code(const rtctk::telSub::CorrelatedDataSamplesRef&, "
71  "UserTopicType&)`");
72 }
73 
74 template <class UserTopicType, class DataBlender, class ShmWriter>
76  CorrelatedDataSamplesRef const& dds_samples) noexcept {
77  // Invoke blender and write to SHM queue.
78  if (auto err = m_blender(dds_samples, m_topic); !err) /*[[likely]]*/ {
79  return m_shm.Write(m_topic, ipcq::Notify::All);
80  } else /*[[unlikely]]*/ {
81  return err;
82  }
83 }
84 
85 template <class UserTopicType, class DataBlender, class ShmWriter>
87  m_shm.Close();
88 }
89 
90 
91 } // namespace rtctk::telSub
92 #endif // #ifndef RTCKT_TELSUB_SHMPUBLISHER_HPP
rtctk::telSub::ShmPublisher
Definition: shmPublisher.hpp:27
rtctk::telSub::ShmPublisherIf
Definition: shmPublisherIf.hpp:25
shmPublisherIf.hpp
Declares ShmPublisher.
rtctk::telSub::ShmPublisher::Publish
std::error_code Publish(CorrelatedDataSamplesRef const &dds_samples) noexcept override
Definition: shmPublisher.hpp:75
rtctk::telSub::ShmPublisher::ShmPublisher
ShmPublisher(ShmWriter &&shm_writer, DataBlender &blender)
Definition: shmPublisher.hpp:60
rtctk::telSub
Definition: businessLogic.cpp:35
dataSample.hpp
Declares ShmPublisher.
std
Definition: mudpiProcessingError.hpp:109
rtctk::telSub::CorrelatedDataSamplesRef
Definition: dataSample.hpp:38
rtctk::telSub::ShmPublisher::CloseQueue
void CloseQueue() noexcept override
Definition: shmPublisher.hpp:86
rtctk::telSub::MakeShmPublisher
auto MakeShmPublisher(ShmWriter &&shm_writer, DataBlender &blender) -> std::unique_ptr< ShmPublisher< UserTopicType, DataBlender, ShmWriter >>
Definition: shmPublisher.hpp:53