Go2Py/deploy/dds_bridge/thirdparty/include/ddscxx/dds/sub/TCoherentAccess.hpp

151 lines
5.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef OMG_DDS_SUB_TCOHERENT_ACCESS_HPP_
#define OMG_DDS_SUB_TCOHERENT_ACCESS_HPP_
/* Copyright 2010, Object Management Group, Inc.
* Copyright 2010, PrismTech, Corp.
* Copyright 2010, Real-Time Innovations, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <dds/core/Value.hpp>
namespace dds
{
namespace sub
{
template <typename DELEGATE>
class TCoherentAccess;
}
}
/**
* @brief
* Class for RAII way of beginning/ending coherent access.
*
* Coherent access indicates that the application is about to access
* the data samples in any of the DataReader objects attached to the
* Subscriber.
*
* The application is required to use this operation
* only if Presentation QosPolicy of the Subscriber to which the
* DataReader belongs has the access_scope set to "GROUP". In the
* aforementioned case, the operation must be called
* prior to calling any of the sample-accessing operations, i.e.
* read and take on DataReader. Otherwise the sample-accessing
* operations will throw a PreconditionNotMetError exception.
*
* Once the application has finished accessing the data samples
* it must end the coherent access. It is not required for the
* application to begin or end access if the Presentation QosPolicy
* has the access_scope set to something other than GROUP. Beginning
* or ending access in this case is not considered an error and has
* no effect. Beginning and ending access may be nested. In that
* case, the application end access as many times as it began
* access.
*
* @code{.cpp}
* dds::domain::DomainParticipant participant(org::eclipse::cyclonedds::domain::default_id());
* dds::topic::Topic<Foo::Bar> topic(participant, "TopicName");
*
* dds::sub::qos::SubscriberQos sQos sQos = participant.default_subscriber_qos()
* << dds::core::policy::Presentation::TopicAccessScope(false, true);
* dds::sub::Subscriber subscriber(participant, sQos);
*
* {
* std::vector< dds::sub::DataReader<Foo::Bar> > readers;
* // Start coherent access.
* dds::sub::TCoherentAccess coherentAccess(subscriber);
* // Find (previously created with the subscriber) datareaders that now got data.
* dds::sub::find< dds::sub::DataReader<Foo::Bar> >(subscriber,
* dds::sub::status::DataState::any(),
* back_inserter(readers));
* // Get data from the readers
* for (size_type i = 0; i < rv.size(); i++) {
* dds::sub::LoanedSamples<Foo::Bar> samples = readers[i].read()
* dds::sub::LoanedSamples<Type1>::const_iterator it;
* for (it = samples.begin(); it != samples.end(); iterator++) {
* const dds::sub::Sample<Foo::Bar>& sample = *it;
* const Foo::Bar& data = sample.data();
* const dds::sub::SampleInfo& info = sample.info();
* // Use sample data and meta information.
* }
* }
* }
* // CoherentAccess went out of scope: it is ended implicitly
* @endcode
*
* @see for more information: @ref DCPS_Modules_Subscription "Subscription"
* @see dds::sub::Subscriber
*/
template <typename DELEGATE>
class dds::sub::TCoherentAccess : public dds::core::Value<DELEGATE>
{
public:
/**
* Creating a CoherentAccess object, which will begin coherent access of
* received samples using DataReader objects attached to this Subscriber.
*
* @param sub The Subscriber to begin the coherent access on.
* @throws dds::core::Error
* An internal error has occurred.
* @throws dds::core::AlreadyClosedError
* The Subscriber has already been closed.
* @throws dds::core::NotEnabledError
* The Subscriber has not yet been enabled.
* @throws dds::core::OutOfResourcesError
* The Data Distribution Service ran out of resources to
* complete this operation.
* @throws dds::core::NullReferenceError
* The Subscriber was not properly created and references to dds::core::null.
*/
explicit TCoherentAccess(const dds::sub::Subscriber& sub);
public:
/**
* This operation will explicitly end the coherent access.
*
* If the Subscriber already ended its coherent access (by a call to this very
* operation), then a call to this operation will have no effect.
*
* @throws dds::core::Error
* An internal error has occurred.
* @throws dds::core::AlreadyClosedError
* The Subscriber has already been closed.
* @throws dds::core::NotEnabledError
* The Subscriber has not yet been enabled.
* @throws dds::core::NullReferenceError
* The Subscriber was not properly created and references to dds::core::null.
*/
void end();
public:
/**
* The destruction of the CoherentAccess will implicitly end the coherent
* access if not already ended by a call to end().
*
* When there is a problem with which end() would normally throw an exception,
* then that exception is swallowed. Errors can be found in the logs.
*/
~TCoherentAccess();
private:
TCoherentAccess(const TCoherentAccess&);
TCoherentAccess& operator=(const TCoherentAccess&);
};
#endif /* OMG_TDDS_SUB_TCOHERENT_ACCESS_HPP_ */