11#ifndef RTCTK_TELSUB_AGNOSTICDATASAMPLES_HPP
12#define RTCTK_TELSUB_AGNOSTICDATASAMPLES_HPP
17#include <memory_resource>
19#include <system_error>
20#include <unordered_map>
28using DdsSample = rtctk::componentFramework::AgnosticTopic;
31using DdsInfoSeq = rtctk::componentFramework::SampleInfoSeq;
52 virtual std::error_code
80 const size_t m_expected_topic_count;
84 std::pmr::map<std::string, std::pair<DdsSampleSeq, DdsInfoSeq>> m_samples;
88 using Alloc = std::pmr::polymorphic_allocator<std::byte>;
98 : m_expected_topic_count(topic_count), m_samples(alloc), m_loaner(loaner) {
112 inline std::uint8_t
Size() const noexcept {
113 return m_samples.size();
125 return m_samples[topic].first;
136 return m_samples.at(topic).first;
142 inline bool Empty() const noexcept;
147 inline
bool Full() const noexcept;
161 return {m_samples[topic].first, m_samples[topic].second};
170 inline void Clear(
const std::string& topic)
noexcept;
177 inline void Clear() noexcept;
183 return m_samples.begin();
187 return m_samples.cbegin();
191 return m_samples.end();
195 return m_samples.cend();
205 for (
const auto& entry : m_samples) {
211 auto& seq = m_samples.at(topic).first;
212 if (seq.has_ownership()) {
217 (void)m_loaner.ReturnLoan(topic, seq, m_samples[topic].second);
223 for (
const auto& [topic, sample] : m_samples) {
224 if (sample.first.length() > 0) {
232 if (m_samples.size() != m_expected_topic_count) {
235 for (
const auto& [topic, sample] : m_samples) {
236 if (sample.first.length() == 0) {
const_iterator cend()
Definition agnosticDataSamples.hpp:194
std::uint8_t Size() const noexcept
Definition agnosticDataSamples.hpp:112
bool Empty() const noexcept
Definition agnosticDataSamples.hpp:222
~AgnosticDataSamples() noexcept
Definition agnosticDataSamples.hpp:100
std::pmr::polymorphic_allocator< std::byte > Alloc
Definition agnosticDataSamples.hpp:88
iterator begin()
Definition agnosticDataSamples.hpp:182
AgnosticDataSamples(const AgnosticDataSamples &)=delete
bool Full() const noexcept
Definition agnosticDataSamples.hpp:231
iterator end()
Definition agnosticDataSamples.hpp:190
AgnosticDataSamples(SeqLoanerIf &loaner, size_t topic_count, const Alloc &alloc={})
Construct instance with the specified number of topics.
Definition agnosticDataSamples.hpp:97
std::tuple< DdsSampleSeq &, DdsInfoSeq & > GetUpdateRefs(const std::string &topic) noexcept
Get references to objects to be updated with new values.
Definition agnosticDataSamples.hpp:160
AgnosticDataSamples & operator=(const AgnosticDataSamples &)=delete
const DdsSampleSeq & At(const std::string &topic) const
Access sample sequence for topic.
Definition agnosticDataSamples.hpp:135
DdsSampleSeq & operator[](const std::string &topic) noexcept
Access sample sequence for topic topic, will create it if it does not exist.
Definition agnosticDataSamples.hpp:124
void Clear() noexcept
Return samples if not owned and clear all sequences.
Definition agnosticDataSamples.hpp:204
const_iterator cbegin()
Definition agnosticDataSamples.hpp:186
decltype(m_samples)::const_iterator const_iterator
Definition agnosticDataSamples.hpp:180
decltype(m_samples)::iterator iterator
Definition agnosticDataSamples.hpp:179
Loaner interface.
Definition agnosticDataSamples.hpp:39
virtual std::error_code ReturnLoan(const std::string &topic, DdsSampleSeq &samples, DdsInfoSeq &infos) noexcept=0
Returns loaned sample sequence.
Project-wide configuration header.
Declares common DDS class.
rtctk::componentFramework::AgnosticTopicSeq DdsSampleSeq
Definition agnosticDataSamples.hpp:29
rtctk::componentFramework::SampleInfoSeq DdsInfoSeq
Definition agnosticDataSamples.hpp:31
rtctk::componentFramework::AgnosticTopic DdsSample
Definition agnosticDataSamples.hpp:28
Definition ddsSub.hpp:155