Go2Py/cpp_bridge/thirdparty/include/ddscxx/dds/sub/detail/TDataReaderImpl.hpp

1445 lines
49 KiB
C++

/*
* Copyright(c) 2006 to 2021 ZettaScale Technology and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
* v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
#ifndef CYCLONEDDS_DDS_SUB_TDATAREADER_IMPL_HPP_
#define CYCLONEDDS_DDS_SUB_TDATAREADER_IMPL_HPP_
/**
* @file
*/
/*
* OMG PSM class declaration
*/
#include <dds/sub/detail/DataReader.hpp>
#include <dds/sub/Query.hpp>
#include <dds/sub/detail/SamplesHolder.hpp>
#include <dds/domain/DomainParticipantListener.hpp>
#include "dds/core/macros.hpp"
/***************************************************************************
*
* dds/sub/DataReader<> WRAPPER implementation.
* Declaration can be found in dds/sub/TDataReader.hpp
*
***************************************************************************/
// Implementation
namespace dds
{
namespace sub
{
//--------------------------------------------------------------------------------
// DATAREADER
//--------------------------------------------------------------------------------
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::Selector::Selector(DataReader& dr) : impl_(dr.delegate())
{
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector&
DataReader<T, DELEGATE>::Selector::instance(const dds::core::InstanceHandle& h)
{
impl_.instance(h);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector&
DataReader<T, DELEGATE>::Selector::next_instance(const dds::core::InstanceHandle& h)
{
impl_.next_instance(h);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector&
DataReader<T, DELEGATE>::Selector::state(const dds::sub::status::DataState& s)
{
impl_.filter_state(s);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector&
DataReader<T, DELEGATE>::Selector::content(const dds::sub::Query& query)
{
impl_.filter_content(query);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector&
DataReader<T, DELEGATE>::Selector::max_samples(uint32_t n)
{
impl_.max_samples(n);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
dds::sub::LoanedSamples<T>
DataReader<T, DELEGATE>::Selector::read()
{
return impl_.read();
}
template <typename T, template <typename Q> class DELEGATE>
dds::sub::LoanedSamples<T>
DataReader<T, DELEGATE>::Selector::take()
{
return impl_.take();
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesFWIterator>
uint32_t
DataReader<T, DELEGATE>::Selector::read(SamplesFWIterator sfit, uint32_t max_samples)
{
return impl_.read(sfit, max_samples);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesFWIterator>
uint32_t
DataReader<T, DELEGATE>::Selector::take(SamplesFWIterator sfit, uint32_t max_samples)
{
return impl_.take(sfit, max_samples);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesBIIterator>
uint32_t
DataReader<T, DELEGATE>::Selector::read(SamplesBIIterator sbit)
{
return impl_.read(sbit);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesBIIterator>
uint32_t
DataReader<T, DELEGATE>::Selector::take(SamplesBIIterator sbit)
{
return impl_.take(sbit);
}
//--------------------------------------------------------------------------------
// DATAREADER::MANIPULATORSELECTOR
//--------------------------------------------------------------------------------
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::ManipulatorSelector::
ManipulatorSelector(DataReader& dr) : impl_(dr.delegate()) {}
template <typename T, template <typename Q> class DELEGATE>
bool
DataReader<T, DELEGATE>::ManipulatorSelector::read_mode()
{
return impl_.read_mode();
}
template <typename T, template <typename Q> class DELEGATE>
void
DataReader<T, DELEGATE>::ManipulatorSelector::read_mode(bool b)
{
impl_.read_mode(b);
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::instance(const dds::core::InstanceHandle& h)
{
impl_.instance(h);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::next_instance(const dds::core::InstanceHandle& h)
{
impl_.next_instance(h);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::operator >>(dds::sub::LoanedSamples<T>& samples)
{
impl_ >> samples;
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::operator >> (ManipulatorSelector & (manipulator)(ManipulatorSelector&))
{
manipulator(*this);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
template <typename Functor>
typename DataReader<T, DELEGATE>::ManipulatorSelector
DataReader<T, DELEGATE>::ManipulatorSelector::operator >> (Functor f)
{
f(*this);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::state(const dds::sub::status::DataState& s)
{
impl_.filter_state(s);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::content(const dds::sub::Query& query)
{
impl_.filter_content(query);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector&
DataReader<T, DELEGATE>::ManipulatorSelector::max_samples(uint32_t n)
{
impl_.max_samples(n);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const dds::topic::Topic<T>& topic):
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic, sub->default_datareader_qos()))
{
this->delegate()->init(this->impl_);
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const ::dds::topic::Topic<T>& topic,
const dds::sub::qos::DataReaderQos& qos,
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask) :
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic, qos, listener, mask))
{
this->delegate()->init(this->impl_);
}
#ifdef OMG_DDS_CONTENT_SUBSCRIPTION_SUPPORT
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const dds::topic::ContentFilteredTopic<T>& topic) :
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic, sub.default_datareader_qos()))
{
this->delegate()->init(this->impl_);
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const ::dds::topic::ContentFilteredTopic<T>& topic,
const dds::sub::qos::DataReaderQos& qos,
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask) :
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic, qos, listener, mask))
{
this->delegate()->init(this->impl_);
}
#endif /* OMG_DDS_CONTENT_SUBSCRIPTION_SUPPORT */
#ifdef OMG_DDS_MULTI_TOPIC_SUPPORT
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const dds::topic::MultiTopic<T>& topic) :
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic))
{
this->delegate()->init(this->impl_);
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>::DataReader(
const dds::sub::Subscriber& sub,
const ::dds::topic::MultiTopic<T>& topic,
const dds::sub::qos::DataReaderQos& qos,
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask) :
::dds::core::Reference< DELEGATE<T> >(new DELEGATE<T>(sub, topic, qos, listener, mask))
{
this->delegate()->init(this->impl_);
}
#endif /* OMG_DDS_MULTI_TOPIC_SUPPORT */
template <typename T, template <typename Q> class DELEGATE>
dds::sub::status::DataState
DataReader<T, DELEGATE>::default_filter_state()
{
return this->delegate()->default_filter_state();
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>& DataReader<T, DELEGATE>::default_filter_state(const dds::sub::status::DataState& status)
{
this->delegate()->default_filter_state(status);
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
DataReader<T, DELEGATE>& DataReader<T, DELEGATE>::operator >>(dds::sub::LoanedSamples<T>& ls)
{
ls = this->read();
return *this;
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::ManipulatorSelector
DataReader<T, DELEGATE>::operator >> (ManipulatorSelector& (manipulator)(ManipulatorSelector&))
{
ManipulatorSelector selector(*this);
manipulator(selector);
return selector;
}
template <typename T, template <typename Q> class DELEGATE>
template <typename Functor>
typename DataReader<T, DELEGATE>::ManipulatorSelector
DataReader<T, DELEGATE>::operator >> (Functor f)
{
ManipulatorSelector selector(*this);
f(selector);
return selector;
}
template <typename T, template <typename Q> class DELEGATE>
LoanedSamples<T>
DataReader<T, DELEGATE>::read()
{
return this->delegate()->read();
}
template <typename T, template <typename Q> class DELEGATE>
LoanedSamples<T>
DataReader<T, DELEGATE>::take()
{
return this->delegate()->take();
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesFWIterator>
uint32_t
DataReader<T, DELEGATE>::read(SamplesFWIterator sfit, uint32_t max_samples)
{
return this->delegate()->read(sfit, max_samples);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesFWIterator>
uint32_t
DataReader<T, DELEGATE>::take(SamplesFWIterator sfit, uint32_t max_samples)
{
return this->delegate()->take(sfit, max_samples);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesBIIterator>
uint32_t
DataReader<T, DELEGATE>::read(SamplesBIIterator sbit)
{
return this->delegate()->read(sbit);
}
template <typename T, template <typename Q> class DELEGATE>
template <typename SamplesBIIterator>
uint32_t
DataReader<T, DELEGATE>::take(SamplesBIIterator sbit)
{
return this->delegate()->take(sbit);
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Selector
DataReader<T, DELEGATE>::select()
{
Selector selector(*this);
return selector;
}
template <typename T, template <typename Q> class DELEGATE>
dds::topic::TopicInstance<T>
DataReader<T, DELEGATE>::key_value(const dds::core::InstanceHandle& h)
{
return this->delegate()->key_value(h);
}
template <typename T, template <typename Q> class DELEGATE>
T&
DataReader<T, DELEGATE>::key_value(T& sample, const dds::core::InstanceHandle& h)
{
return this->delegate()->key_value(sample, h);
}
template <typename T, template <typename Q> class DELEGATE>
const dds::core::InstanceHandle
DataReader<T, DELEGATE>::lookup_instance(const T& key) const
{
return this->delegate()->lookup_instance(key);
}
template <typename T, template <typename Q> class DELEGATE>
void
DataReader<T, DELEGATE>::listener(
Listener* listener,
const dds::core::status::StatusMask& event_mask)
{
this->delegate()->listener(listener, event_mask);
}
template <typename T, template <typename Q> class DELEGATE>
typename DataReader<T, DELEGATE>::Listener*
DataReader<T, DELEGATE>::listener() const
{
return this->delegate()->listener();
}
}
}
/***************************************************************************
*
* dds/sub/detail/DataReader<> DELEGATE implementation.
* Declaration can be found in dds/sub/detail/DataReader.hpp
*
* Implementation and declaration have been separated because some circular
* dependencies, like with DataReaderListener and AnyDataReader.
*
***************************************************************************/
#include <dds/sub/AnyDataReader.hpp>
#include <dds/sub/DataReaderListener.hpp>
#include <dds/topic/Topic.hpp>
#include <dds/topic/ContentFilteredTopic.hpp>
#include <org/eclipse/cyclonedds/sub/AnyDataReaderDelegate.hpp>
#include <org/eclipse/cyclonedds/core/ListenerDispatcher.hpp>
template <typename T>
dds::sub::detail::DataReader<T>::DataReader(const dds::sub::Subscriber& sub,
const dds::topic::Topic<T>& topic,
const dds::sub::qos::DataReaderQos& qos,
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask)
: ::org::eclipse::cyclonedds::sub::AnyDataReaderDelegate(qos, topic), sub_(sub),
typed_sample_()
{
common_constructor(listener, mask);
}
template <typename T>
dds::sub::detail::DataReader<T>::DataReader(const dds::sub::Subscriber& sub,
const dds::topic::ContentFilteredTopic<T, dds::topic::detail::ContentFilteredTopic>& topic,
const dds::sub::qos::DataReaderQos& qos,
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask)
: ::org::eclipse::cyclonedds::sub::AnyDataReaderDelegate(qos, topic), sub_(sub),
typed_sample_()
{
common_constructor(listener, mask);
}
template <typename T>
void
dds::sub::detail::DataReader<T>::common_constructor(
dds::sub::DataReaderListener<T>* listener,
const dds::core::status::StatusMask& mask)
{
DDSCXX_WARNING_MSVC_OFF(4127)
DDSCXX_WARNING_MSVC_OFF(6326)
if (dds::topic::is_topic_type<T>::value == 0) {
ISOCPP_THROW_EXCEPTION(ISOCPP_PRECONDITION_NOT_MET_ERROR, "DataReader cannot be created, topic information not found");
}
DDSCXX_WARNING_MSVC_ON(6326)
DDSCXX_WARNING_MSVC_ON(4127)
org::eclipse::cyclonedds::sub::qos::DataReaderQosDelegate drQos = qos_.delegate();
dds_entity_t ddsc_sub = sub_.delegate()->get_ddsc_entity();
dds_entity_t ddsc_top = this->AnyDataReaderDelegate::td_.delegate()->get_ddsc_entity();
// get and validate the ddsc qos
drQos.check();
dds_qos_t* ddsc_qos = drQos.ddsc_qos();
#if 0
std::string expression = this->AnyDataReaderDelegate::td_.delegate()->reader_expression();
c_value *params = this->AnyDataReaderDelegate::td_.delegate()->reader_parameters();
#endif
dds_entity_t ddsc_reader = dds_create_reader(ddsc_sub, ddsc_top, ddsc_qos, NULL);
dds_delete_qos(ddsc_qos);
ISOCPP_DDSC_RESULT_CHECK_AND_THROW(ddsc_reader, "Could not create DataReader.");
this->AnyDataReaderDelegate::td_.delegate()->incrNrDependents();
this->AnyDataReaderDelegate::setSample(&this->typed_sample_);
this->set_ddsc_entity(ddsc_reader);
this->listener(listener, mask);
}
template <typename T>
dds::sub::detail::DataReader<T>::~DataReader<T>()
{
if (!this->closed) {
try {
close();
} catch (...) {
}
}
}
template <typename T>
void
dds::sub::detail::DataReader<T>::init(ObjectDelegate::weak_ref_type weak_ref)
{
/* Set weak_ref before passing ourselves to other isocpp objects. */
this->set_weak_ref(weak_ref);
/* Add weak_ref to the map of entities */
this->add_to_entity_map(weak_ref);
/* Add the datareader to the datareader set of the subscriber */
this->sub_.delegate()->add_datareader(*this);
// Because listeners are added after reader is created (which is in enabled state, because
// disabled state is not yet supported), events could have occured before listeners were
// registered. Therefore the event handlers for those events are called here.
if (this->listener_get()) {
dds::core::status::StatusMask readerStatus = status_changes();
if (listener_mask.to_ulong() & dds::core::status::StatusMask::data_available().to_ulong()
&& readerStatus.test(DDS_DATA_AVAILABLE_STATUS_ID))
{
on_data_available(this->ddsc_entity);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::liveliness_changed().to_ulong()
&& readerStatus.test(DDS_LIVELINESS_CHANGED_STATUS_ID))
{
dds::core::status::LivelinessChangedStatus status = liveliness_changed_status();
on_liveliness_changed(this->ddsc_entity, status);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::requested_deadline_missed().to_ulong()
&& readerStatus.test(DDS_REQUESTED_DEADLINE_MISSED_STATUS_ID))
{
dds::core::status::RequestedDeadlineMissedStatus status = requested_deadline_missed_status();
on_requested_deadline_missed(this->ddsc_entity, status);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::requested_incompatible_qos().to_ulong()
&& readerStatus.test(DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS_ID))
{
dds::core::status::RequestedIncompatibleQosStatus status = requested_incompatible_qos_status();
on_requested_incompatible_qos(this->ddsc_entity, status);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::sample_lost().to_ulong()
&& readerStatus.test(DDS_SAMPLE_LOST_STATUS_ID))
{
dds::core::status::SampleLostStatus status = sample_lost_status();
on_sample_lost(this->ddsc_entity, status);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::sample_rejected().to_ulong()
&& readerStatus.test(DDS_SAMPLE_REJECTED_STATUS_ID))
{
dds::core::status::SampleRejectedStatus status = sample_rejected_status();
on_sample_rejected(this->ddsc_entity, status);
}
if (listener_mask.to_ulong() & dds::core::status::StatusMask::subscription_matched().to_ulong()
&& readerStatus.test(DDS_SUBSCRIPTION_MATCHED_STATUS_ID))
{
dds::core::status::SubscriptionMatchedStatus status = subscription_matched_status();
on_subscription_matched(this->ddsc_entity, status);
}
}
this->enable();
}
template <typename T>
dds::sub::status::DataState
dds::sub::detail::DataReader<T>::default_filter_state()
{
org::eclipse::cyclonedds::core::ScopedObjectLock scopedLock(*this);
dds::sub::status::DataState state = this->status_filter_;
scopedLock.unlock();
return state;
}
template <typename T>
void
dds::sub::detail::DataReader<T>::default_filter_state(const dds::sub::status::DataState& state)
{
org::eclipse::cyclonedds::core::ScopedObjectLock scopedLock(*this);
this->status_filter_ = state;
scopedLock.unlock();
}
template <typename T>
bool
dds::sub::detail::DataReader<T>::is_loan_supported()
{
this->check();
return this->AnyDataReaderDelegate::is_loan_supported(static_cast<dds_entity_t>(this->ddsc_entity));
}
template <typename T>
dds::sub::LoanedSamples<org::eclipse::cyclonedds::topic::CDRBlob>
dds::sub::detail::DataReader<T>::read_cdr()
{
dds::sub::LoanedSamples<org::eclipse::cyclonedds::topic::CDRBlob> samples;
dds::sub::detail::CDRSamplesHolder holder(samples);
this->AnyDataReaderDelegate::read_cdr(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return samples;
}
template <typename T>
dds::sub::LoanedSamples<org::eclipse::cyclonedds::topic::CDRBlob>
dds::sub::detail::DataReader<T>::take_cdr()
{
dds::sub::LoanedSamples<org::eclipse::cyclonedds::topic::CDRBlob> samples;
dds::sub::detail::CDRSamplesHolder holder(samples);
this->AnyDataReaderDelegate::take_cdr(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return samples;
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::read()
{
dds::sub::LoanedSamples<T> samples;
dds::sub::detail::LoanedSamplesHolder<T> holder(samples);
this->AnyDataReaderDelegate::loaned_read(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return samples;
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::take()
{
dds::sub::LoanedSamples<T> samples;
dds::sub::detail::LoanedSamplesHolder<T> holder(samples);
this->AnyDataReaderDelegate::loaned_take(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return samples;
}
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::read(SamplesFWIterator samples, uint32_t max_samples)
{
dds::sub::detail::SamplesFWInteratorHolder<T, SamplesFWIterator> holder(samples);
this->AnyDataReaderDelegate::read(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, max_samples);
return holder.get_length();
}
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::take(SamplesFWIterator samples, uint32_t max_samples)
{
dds::sub::detail::SamplesFWInteratorHolder<T, SamplesFWIterator> holder(samples);
this->AnyDataReaderDelegate::take(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, max_samples);
return holder.get_length();
}
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::read(SamplesBIIterator samples)
{
dds::sub::detail::SamplesBIIteratorHolder<T, SamplesBIIterator> holder(samples);
this->AnyDataReaderDelegate::read(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return holder.get_length();
}
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::take(SamplesBIIterator samples)
{
dds::sub::detail::SamplesBIIteratorHolder<T, SamplesBIIterator> holder(samples);
this->AnyDataReaderDelegate::take(static_cast<dds_entity_t>(this->ddsc_entity), this->status_filter_, holder, static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED));
return holder.get_length();
}
template <typename T>
dds::topic::TopicInstance<T>
dds::sub::detail::DataReader<T>::key_value(const dds::core::InstanceHandle& h)
{
T key_holder;
this->AnyDataReaderDelegate::get_key_value(static_cast<dds_entity_t>(this->ddsc_entity), h, &key_holder);
return dds::topic::TopicInstance<T>(h, key_holder);
}
template <typename T>
T&
dds::sub::detail::DataReader<T>::key_value(T& key, const dds::core::InstanceHandle& h)
{
this->AnyDataReaderDelegate::get_key_value(static_cast<dds_entity_t>(this->ddsc_entity), h, &key);
return key;
}
template <typename T>
const dds::core::InstanceHandle
dds::sub::detail::DataReader<T>::lookup_instance(const T& key) const
{
dds::core::InstanceHandle handle(this->AnyDataReaderDelegate::lookup_instance(static_cast<dds_entity_t>(this->ddsc_entity), &key));
return handle;
}
template <typename T>
const dds::sub::Subscriber&
dds::sub::detail::DataReader<T>::subscriber() const
{
this->check();
return sub_;
}
template <typename T>
void
dds::sub::detail::DataReader<T>::close()
{
this->prevent_callbacks();
org::eclipse::cyclonedds::core::ScopedObjectLock scopedLock(*this);
this->listener_set(NULL, dds::core::status::StatusMask::none());
this->sub_.delegate()->remove_datareader(*this);
// Remove our dependency on the topicdescription, and drop our reference to it,
// so that it can become garbage collected.
// It is important that we also drop our reference to the topicdescription, since
// subsequent dependencies between for example ContentFilteredTopic to Topic can
// only be dropped by the destructor of the ContentFilteredTopic.
this->AnyDataReaderDelegate::td_.delegate()->decrNrDependents();
this->AnyDataReaderDelegate::td_ = dds::topic::TopicDescription(dds::core::null);
org::eclipse::cyclonedds::sub::AnyDataReaderDelegate::close();
scopedLock.unlock();
}
template <typename T>
dds::sub::DataReaderListener<T>*
dds::sub::detail::DataReader<T>::listener()
{
this->check();
return reinterpret_cast<dds::sub::DataReaderListener<T>*>(this->listener_get());
}
template <typename T>
void
dds::sub::detail::DataReader<T>::listener(
dds::sub::DataReaderListener<T>* l,
const dds::core::status::StatusMask& event_mask)
{
org::eclipse::cyclonedds::core::ScopedObjectLock scopedLock(*this);
this->listener_set( l, event_mask ) ;
scopedLock.unlock();
}
template <typename T>
dds::sub::DataReader<T, dds::sub::detail::DataReader>
dds::sub::detail::DataReader<T>::wrapper()
{
typename DataReader::ref_type ref =
::std::dynamic_pointer_cast<DataReader<T> >(this->get_strong_ref());
dds::sub::DataReader<T, dds::sub::detail::DataReader> reader(ref);
return reader;
}
template <typename T>
dds::sub::detail::DataReader<T>::Selector::Selector(typename DataReader<T>::ref_type dr)
: mode(SELECT_MODE_READ), reader(dr), state_filter_is_set_(false),
max_samples_(static_cast<uint32_t>(dds::core::LENGTH_UNLIMITED)), query_(dds::core::null)
{
}
template <typename T>
typename dds::sub::detail::DataReader<T>::Selector&
dds::sub::detail::DataReader<T>::Selector::instance(const dds::core::InstanceHandle& h)
{
this->handle = h;
switch (this->mode) {
case SELECT_MODE_READ:
case SELECT_MODE_READ_INSTANCE:
case SELECT_MODE_READ_NEXT_INSTANCE:
this->mode = SELECT_MODE_READ_INSTANCE;
break;
case SELECT_MODE_READ_WITH_CONDITION:
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
this->mode = SELECT_MODE_READ_INSTANCE_WITH_CONDITION;
break;
}
return *this;
}
template <typename T>
typename dds::sub::detail::DataReader<T>::Selector&
dds::sub::detail::DataReader<T>::Selector::next_instance(const dds::core::InstanceHandle& h)
{
this->handle = h;
switch (this->mode) {
case SELECT_MODE_READ:
case SELECT_MODE_READ_INSTANCE:
case SELECT_MODE_READ_NEXT_INSTANCE:
this->mode = SELECT_MODE_READ_NEXT_INSTANCE;
break;
case SELECT_MODE_READ_WITH_CONDITION:
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
this->mode = SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION;
break;
}
return *this;
}
template <typename T>
typename dds::sub::detail::DataReader<T>::Selector&
dds::sub::detail::DataReader<T>::Selector::filter_state(const dds::sub::status::DataState& s)
{
this->state_filter_ = s;
this->state_filter_is_set_ = true;
if ((this->mode == SELECT_MODE_READ_WITH_CONDITION) ||
(this->mode == SELECT_MODE_READ_INSTANCE_WITH_CONDITION) ||
(this->mode == SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION)) {
if (!this->query_.delegate()->modify_state_filter(this->state_filter_)) {
dds::sub::Query q(this->query_.data_reader(), this->query_.expression(), this->query_.delegate()->parameters());
q.delegate()->state_filter(this->state_filter_);
this->query_ = q;
}
}
return *this;
}
template <typename T>
typename dds::sub::detail::DataReader<T>::Selector&
dds::sub::detail::DataReader<T>::Selector::max_samples(uint32_t n)
{
this->max_samples_ = n;
return *this;
}
template <typename T>
typename dds::sub::detail::DataReader<T>::Selector&
dds::sub::detail::DataReader<T>::Selector::filter_content(
const dds::sub::Query& query)
{
ISOCPP_THROW_EXCEPTION(ISOCPP_UNSUPPORTED_ERROR, "Read with queries not currently supported");
this->query_ = query;
switch (this->mode) {
case SELECT_MODE_READ:
case SELECT_MODE_READ_INSTANCE:
case SELECT_MODE_READ_NEXT_INSTANCE:
this->mode = SELECT_MODE_READ_WITH_CONDITION;
break;
default:
break;
}
return *this;
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::Selector::read()
{
return this->reader->read(*this);
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::Selector::take()
{
return this->reader->take(*this);
}
// --- Forward Iterators: --- //
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::Selector::read(SamplesFWIterator sfit, uint32_t max_samples)
{
return this->reader->read(sfit, max_samples, *this);
}
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::Selector::take(SamplesFWIterator sfit, uint32_t max_samples)
{
return this->reader->take(sfit, max_samples, *this);
}
// --- Back-Inserting Iterators: --- //
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::Selector::read(SamplesBIIterator sbit)
{
return this->reader->read(sbit, *this);
}
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::Selector::take(SamplesBIIterator sbit)
{
return this->reader->take(sbit, *this);
}
template <typename T>
typename dds::sub::detail::DataReader<T>::SelectMode
dds::sub::detail::DataReader<T>::Selector::get_mode() const
{
return this->mode;
}
template <typename T>
dds::sub::detail::DataReader<T>::ManipulatorSelector::ManipulatorSelector(typename DataReader<T>::ref_type dr) :
Selector(dr), read_mode_(true)
{
}
template <typename T>
bool
dds::sub::detail::DataReader<T>::ManipulatorSelector::read_mode()
{
return read_mode_;
}
template <typename T>
void
dds::sub::detail::DataReader<T>::ManipulatorSelector::read_mode(bool b)
{
read_mode_ = b;
}
template <typename T>
typename dds::sub::detail::DataReader<T>::ManipulatorSelector&
dds::sub::detail::DataReader<T>::ManipulatorSelector::operator >>(dds::sub::LoanedSamples<T>& samples)
{
if(read_mode_)
{
samples = this->Selector::read();
}
else
{
samples = this->Selector::take();
}
return *this;
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::read(const Selector& selector)
{
dds::sub::LoanedSamples<T> samples;
dds::sub::detail::LoanedSamplesHolder<T> holder(samples);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::loaned_read(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::loaned_read_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::loaned_read_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return samples;
}
template <typename T>
dds::sub::LoanedSamples<T>
dds::sub::detail::DataReader<T>::take(const Selector& selector)
{
dds::sub::LoanedSamples<T> samples;
dds::sub::detail::LoanedSamplesHolder<T> holder(samples);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::loaned_take(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::loaned_take_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::loaned_take_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return samples;
}
// --- Forward Iterators: --- //
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::read(SamplesFWIterator samples,
uint32_t max_samples, const Selector& selector)
{
dds::sub::detail::SamplesFWInteratorHolder<T, SamplesFWIterator> holder(samples);
max_samples = std::min(max_samples, selector.max_samples_);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::read(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::read_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::read_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return holder.get_length();
}
template <typename T>
template<typename SamplesFWIterator>
uint32_t
dds::sub::detail::DataReader<T>::take(SamplesFWIterator samples,
uint32_t max_samples, const Selector& selector)
{
dds::sub::detail::SamplesFWInteratorHolder<T, SamplesFWIterator> holder(samples);
max_samples = std::min(max_samples, selector.max_samples_);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::take(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::take_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::take_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
max_samples);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return holder.get_length();
}
// --- Back-Inserting Iterators: --- //
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::read(SamplesBIIterator samples, const Selector& selector)
{
dds::sub::detail::SamplesBIIteratorHolder<T, SamplesBIIterator> holder(samples);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::read(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::read_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::read_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return holder.get_length();
}
template <typename T>
template<typename SamplesBIIterator>
uint32_t
dds::sub::detail::DataReader<T>::take(SamplesBIIterator samples, const Selector& selector)
{
dds::sub::detail::SamplesBIIteratorHolder<T, SamplesBIIterator> holder(samples);
switch(selector.mode) {
case SELECT_MODE_READ:
this->AnyDataReaderDelegate::take(static_cast<dds_entity_t>(this->ddsc_entity),
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_INSTANCE:
this->AnyDataReaderDelegate::take_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_NEXT_INSTANCE:
this->AnyDataReaderDelegate::take_next_instance(static_cast<dds_entity_t>(this->ddsc_entity),
selector.handle,
selector.state_filter_,
holder,
selector.max_samples_);
break;
case SELECT_MODE_READ_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
case SELECT_MODE_READ_NEXT_INSTANCE_WITH_CONDITION:
/* When SQL queries and QueryContitions are supported, then
* create a QueryContitions from the Query and Reader status_filter_.
* Use the resulting condition entity to read. */
break;
}
return holder.get_length();
}
namespace dds
{
namespace sub
{
template <typename SELECTOR>
SELECTOR& read(SELECTOR& selector)
{
selector.read_mode(true);
return selector;
}
template <typename SELECTOR>
SELECTOR& take(SELECTOR& selector)
{
selector.read_mode(false);
return selector;
}
inline dds::sub::functors::MaxSamplesManipulatorFunctor
max_samples(uint32_t n)
{
return dds::sub::functors::MaxSamplesManipulatorFunctor(n);
}
inline dds::sub::functors::ContentFilterManipulatorFunctor
content(const dds::sub::Query& query)
{
return dds::sub::functors::ContentFilterManipulatorFunctor(query);
}
inline dds::sub::functors::StateFilterManipulatorFunctor
state(const dds::sub::status::DataState& s)
{
return dds::sub::functors::StateFilterManipulatorFunctor(s);
}
inline dds::sub::functors::InstanceManipulatorFunctor
instance(const dds::core::InstanceHandle& h)
{
return dds::sub::functors::InstanceManipulatorFunctor(h);
}
inline dds::sub::functors::NextInstanceManipulatorFunctor
next_instance(const dds::core::InstanceHandle& h)
{
return dds::sub::functors::NextInstanceManipulatorFunctor(h);
}
}
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_requested_deadline_missed(dds_entity_t,
org::eclipse::cyclonedds::core::RequestedDeadlineMissedStatusDelegate &sd)
{
dds::core::status::RequestedDeadlineMissedStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_requested_deadline_missed(dr, s);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_requested_incompatible_qos(dds_entity_t,
org::eclipse::cyclonedds::core::RequestedIncompatibleQosStatusDelegate &sd)
{
dds::core::status::RequestedIncompatibleQosStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_requested_incompatible_qos(dr, s);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_sample_rejected(dds_entity_t,
org::eclipse::cyclonedds::core::SampleRejectedStatusDelegate &sd)
{
dds::core::status::SampleRejectedStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_sample_rejected(dr, s);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_liveliness_changed(dds_entity_t,
org::eclipse::cyclonedds::core::LivelinessChangedStatusDelegate &sd)
{
dds::core::status::LivelinessChangedStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_liveliness_changed(dr, s);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_data_available(dds_entity_t)
{
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_data_available(dr);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_subscription_matched(dds_entity_t,
org::eclipse::cyclonedds::core::SubscriptionMatchedStatusDelegate &sd)
{
dds::core::status::SubscriptionMatchedStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_subscription_matched(dr, s);
}
template <typename T>
void dds::sub::detail::DataReader<T>::on_sample_lost(dds_entity_t,
org::eclipse::cyclonedds::core::SampleLostStatusDelegate &sd)
{
dds::core::status::SampleLostStatus s;
s.delegate() = sd;
dds::sub::DataReader<T, dds::sub::detail::DataReader> dr = wrapper();
dds::sub::DataReaderListener<T> *l =
reinterpret_cast<dds::sub::DataReaderListener<T> *>(this->listener_get());
l->on_sample_lost(dr, s);
}
// End of implementation
#endif /* CYCLONEDDS_DDS_SUB_TDATAREADER_IMPL_HPP_ */