#ifndef OMG_DDS_SUB_DATA_STATE_HPP_ #define OMG_DDS_SUB_DATA_STATE_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 #include namespace dds { namespace sub { namespace status { class SampleState; class ViewState; class InstanceState; class DataState; } } } /** * @brief * Class to hold SampleState information. * * For each sample, the Data Distribution Service internally maintains a * sample_state specific to each DataReader. The sample_state can either be * READ_SAMPLE_STATE or NOT_READ_SAMPLE_STATE. * - read * - The DataReader has already accessed that * sample by means of read. Had the sample been accessed by take it would * no longer be available to the DataReader. * - not_read * - The DataReader has not accessed that sample before. * * @see for more information: @ref DCPS_Modules_Subscription_SampleInfo "SampleInfo" */ class OMG_DDS_API dds::sub::status::SampleState : public std::bitset { public: /** * Convenience typedef for std::bitset. */ typedef std::bitset MaskType; public: /** * Construct a SampleState with default MaskType. */ SampleState(); /** * Construct a SampleState with MaskType of i. * * @param i MaskType */ explicit SampleState(uint32_t i); /** * Copy constructor. * Construct a SampleState with existing SampleState. * * @param src the SampleState to copy from */ SampleState(const SampleState& src); /** * Copy assignment operator. * * Copy the contents from one SampleState to another. * * @param src the SampleState to copy from * * @return reference to the SampleState instance that was copied to */ SampleState& operator=(const SampleState& src) = default; /** * Construct a SampleState with existing MaskType. * * @param src the MaskType to copy from */ SampleState(const MaskType& src); public: /** * Get the READ_SAMPLE_STATE. * * read * - The DataReader has already accessed that * sample by means of read. Had the sample been accessed by take it would * no longer be available to the DataReader. * * @return the read SampleState */ inline static const SampleState read(); /** * Get the NOT_READ_SAMPLE_STATE. * *not_read * - The DataReader has not accessed that sample before. * * @return the not_read SampleState */ inline static const SampleState not_read(); /** * Get any SampleState. * * Either the sample has already been read or not read. * * @return any SampleState */ inline static const SampleState any(); }; /** * @brief * Class to hold sample ViewState information. * * For each instance (identified by the key), the Data Distribution Service internally * maintains a view_state relative to each DataReader. The ViewSate can * either be NEW_VIEW_STATE or NOT_NEW_VIEW_STATE. * - new_view * - Either this is the first time that the DataReader * has ever accessed samples of that instance, or else that the DataReader has * accessed previous samples of the instance, but the instance has since been reborn * (i.e. become not-alive and then alive again). * - not_new_view * - The DataReader has already accessed * samples of the same instance and that the instance has not been reborn since. * * @see for more information: @ref DCPS_Modules_Subscription_SampleInfo "SampleInfo" */ class OMG_DDS_API dds::sub::status::ViewState : public std::bitset { public: /** * Convenience typedef for std::bitset. */ typedef std::bitset MaskType; public: /** * Construct a ViewState with default MaskType. */ ViewState(); /** * Construct a ViewState with MaskType of i. * * @param m the MaskType */ explicit ViewState(uint32_t m); /** * Copy constructor. * * Construct a ViewState with existing ViewState. * * @param src the ViewState to copy from */ ViewState(const ViewState& src); /** * Copy assignment operator. * * Copy the contents from one ViewState to another. * * @param src the ViewState to copy from * * @return reference to the ViewState instance that was copied to */ ViewState& operator=(const ViewState& src) = default; /** * Construct a ViewState with existing MaskType. * * @param src the MaskType to copy from */ ViewState(const MaskType& src); public: /** * Get the NEW_VIEW_STATE. * * new_view * - Either this is the first time that the DataReader * has ever accessed samples of that instance, or else that the DataReader has * accessed previous samples of the instance, but the instance has since been reborn * (i.e. become not-alive and then alive again). * * @return the new_view ViewState */ inline static const ViewState new_view(); /** * Get the NOT_NEW_VIEW_STATE. * * not_new_view * - The DataReader has already accessed * samples of the same instance and that the instance has not been reborn since. * * @return the not_new_view ViewState */ inline static const ViewState not_new_view(); /** * Get any ViewState. * * Either the sample has already been seen or not seen. * * @return the any ViewState */ inline static const ViewState any(); }; /** * @brief * Class to hold sample InstanceState information. * * For each instance the Data Distribution Service internally maintains an * InstanceState. The InstanceState can be: * - alive, which indicates that * - samples have been received for the instance * - there are live DataWriter objects writing the instance * - the instance has not been explicitly disposed of (or else samples have been * received after it was disposed of) * - not_alive_disposed, which indicates that * - the instance was disposed * of by a DataWriter, either explicitly by means of the dispose operation or * implicitly in case the autodispose_unregistered_instances field of the * WriterDataLyfecycle QosPolicy equals TRUE when the instance gets * unregistered, WriterDataLifecycle QosPolicy and no new * samples for that instance have been written afterwards. * - not_alive_no_writers, which indicates that * - the instance has been * declared as not-alive by the DataReader because it detected that there are no live * DataWriter objects writing that instance. * * @see for more information: @ref DCPS_Modules_Subscription_SampleInfo "SampleInfo" */ class OMG_DDS_API dds::sub::status::InstanceState : public std::bitset { public: /** * Convenience typedef for std::bitset. */ typedef std::bitset MaskType; public: /** * Construct an InstanceState with no state flags set. */ InstanceState(); /** * Construct an InstanceState with an uint32_t m, representing a bit array. * * @param m the bit array to initialize the bitset with */ explicit InstanceState(uint32_t m); /** * Copy constructor. * * Construct an InstanceState with existing InstanceState. * * @param src the InstanceState to copy from */ InstanceState(const InstanceState& src); /** * Copy assignment operator. * * Copy the contents from one InstanceState to another. * * @param src the InstanceState to copy from * * @return reference to the InstanceState instance that was copied to */ InstanceState& operator=(const InstanceState& src) = default; /** * Construct an InstanceState with existing MaskType. * * @param src the bitset to copy from */ InstanceState(const MaskType& src); public: /** * Get ALIVE_INSTANCE_STATE. * * alive, which indicates that * - samples have been received for the instance * - there are live DataWriter objects writing the instance * - the instance has not been explicitly disposed of (or else samples have been * received after it was disposed of) * * @return the alive InstanceState */ inline static const InstanceState alive(); /** * Get NOT_ALIVE_DISPOSED_INSTANCE_STATE. * * not_alive_disposed, which indicates that * - the instance was disposed * of by a DataWriter, either explicitly by means of the dispose operation or * implicitly in case the autodispose_unregistered_instances field of the * WriterDataLyfecycle QosPolicy equals TRUE when the instance gets * unregistered, WriterDataLifecycle QosPolicy and no new * samples for that instance have been written afterwards. * * @return the not_alive_disposed InstanceState */ inline static const InstanceState not_alive_disposed(); /** * Get NOT_ALIVE_NO_WRITERS_INSTANCE_STATE. * * not_alive_no_writers, which indicates that * - the instance has been * declared as not-alive by the DataReader because it detected that there are no live * DataWriter objects writing that instance. * * @return the not_alive_no_writers InstanceState */ inline static const InstanceState not_alive_no_writers(); /** * Get not_alive mask * * not_alive = not_alive_disposed | not_alive_no_writers: * - not_alive_disposed, which indicates that * - the instance was disposed * of by a DataWriter, either explicitly by means of the dispose operation or * implicitly in case the autodispose_unregistered_instances field of the * WriterDataLyfecycle QosPolicy equals TRUE when the instance gets * unregistered, WriterDataLifecycle QosPolicy and no new * samples for that instance have been written afterwards. * - not_alive_no_writers, which indicates that * - the instance has been * declared as not-alive by the DataReader because it detected that there are no live * DataWriter objects writing that instance. * * @return the not_alive_mask InstanceState */ inline static const InstanceState not_alive_mask(); /** * Get any InstanceState. * * This Instance is either in existence or not in existence. * * @return the any InstanceState */ inline static const InstanceState any(); }; /** * @brief * Class to hold sample DataState information. * * The DataState is part of dds::sub::SampleInfo but can also be used as data filter for * @ref dds::sub::DataReader "DataReaders". * * The DataState contains the following: * - The sample_state of the Data value (i.e., if the sample has already been READ or NOT_READ by that same DataReader). * - The view_state of the related instance (i.e., if the instance is NEW, or NOT_NEW for that DataReader). * - The instance_state of the related instance (i.e., if the instance is ALIVE, NOT_ALIVE_DISPOSED, or NOT_ALIVE_NO_WRITERS). * * @see for more information: @ref DCPS_Modules_Subscription_SampleInfo "SampleInfo" */ class OMG_DDS_API dds::sub::status::DataState { public: /** * Create a DataState instance. * * Construct a DataState with: * - SampleState::any * - ViewState::any * - InstanceState::any * */ DataState() : ss_(dds::sub::status::SampleState::any()), vs_(dds::sub::status::ViewState::any()), is_(dds::sub::status::InstanceState::any()) { } /** * Create a DataState instance. * * Construct a DataState with: * - Given SampleState ss * - ViewState::any * - InstanceState::any * * @param ss the SampleState to construct DataState from */ /* implicit */ DataState(const dds::sub::status::SampleState& ss) : ss_(ss), vs_(dds::sub::status::ViewState::any()), is_(dds::sub::status::InstanceState::any()) { } /** * Create a DataState instance. * * Construct a DataState with: * - SampleState::any * - Given ViewState vs * - InstanceState::any * * @param vs the ViewState to construct DataState from */ /* implicit */ DataState(const dds::sub::status::ViewState& vs) : ss_(dds::sub::status::SampleState::any()), vs_(vs), is_(dds::sub::status::InstanceState::any()) { } /** * Create a DataState instance. * * Construct a DataState with: * - SampleState::any * - ViewState::any * - Given InstanceState is * * @param is InstanceState to construct DataState from */ /* implicit */ DataState(const dds::sub::status::InstanceState& is) : ss_(dds::sub::status::SampleState::any()), vs_(dds::sub::status::ViewState::any()), is_(is) { } /** * Create a DataState instance. * * Construct a DataState with: * - Given SampleState ss * - Given ViewState vs * - Given InstanceState is * * @param ss SampleState * @param vs ViewState * @param is InstanceState */ DataState(const dds::sub::status::SampleState& ss, const dds::sub::status::ViewState& vs, const dds::sub::status::InstanceState& is) : ss_(ss), vs_(vs), is_(is) { } /** * Set SampleState. * * @param ss SampleState */ DataState& operator << (const dds::sub::status::SampleState& ss) { ss_ = ss; return *this; } /** * Set InstanceState. * * @param is InstanceState */ DataState& operator << (const dds::sub::status::InstanceState& is) { is_ = is; return *this; } /** * Set ViewState. * * @param vs ViewState */ DataState& operator << (const dds::sub::status::ViewState& vs) { vs_ = vs; return *this; } /** * Get SampleState. * * @param ss SampleState * @return the DataState */ const DataState& operator >> (dds::sub::status::SampleState& ss) const { ss = ss_; return *this; } /** * Get InstanceState. * * @param is InstanceState * @return the DataState */ const DataState& operator >> (dds::sub::status::InstanceState& is) const { is = is_; return *this; } /** * Get ViewState. * * @param vs ViewState * @return the DataState */ const DataState& operator >> (dds::sub::status::ViewState& vs) const { vs = vs_; return *this; } /** * Check if this DataState is equal with another * * @return true if equal */ bool operator ==(const DataState& o) const { return ((ss_ == o.ss_) && (vs_ == o.vs_) && (is_ == o.is_)); } /** * Check if this DataState is not equal with another * * @return true if not equal */ bool operator !=(const DataState& o) const { return !operator==(o); } /** * Get SampleState. * * @return the SampleState */ const dds::sub::status::SampleState& sample_state() const { return ss_; } /** * Set SampleState. * * @param ss SampleState */ void sample_state(const dds::sub::status::SampleState& ss) { *this << ss; } /** * Get InstanceState. * * @return the InstanceState */ const dds::sub::status::InstanceState& instance_state() const { return is_; } /** * Set InstanceState. * * @param is InstanceState */ void instance_state(const dds::sub::status::InstanceState& is) { *this << is; } /** * Get ViewState. * * @return the ViewState */ const dds::sub::status::ViewState& view_state() const { return vs_; } /** * Set ViewState. * * @param vs ViewState */ void view_state(const dds::sub::status::ViewState& vs) { *this << vs; } /** * Create a DataState instance. * * Return a DataState with: * - SampleState::any * - ViewState::any * - InstanceState::any * * @return the any DataState */ static DataState any() { return DataState(dds::sub::status::SampleState::any(), dds::sub::status::ViewState::any(), dds::sub::status::InstanceState::any()); } /** * Create a DataState instance. * * Return a DataState with: * - SampleState::not_read * - ViewState::any * - InstanceState::alive * * @return the new_data DataState */ static DataState new_data() { return DataState(dds::sub::status::SampleState::not_read(), dds::sub::status::ViewState::any(), dds::sub::status::InstanceState::alive()); } /** * Create a DataState instance. * * Return a DataState with: * - SampleState::any * - ViewState::any * - InstanceState::alive * * @return the any_data DataState */ static DataState any_data() { return DataState(dds::sub::status::SampleState::any(), dds::sub::status::ViewState::any(), dds::sub::status::InstanceState::alive()); } /** * Create a DataState instance. * * Return a DataState with: * - SampleState::any * - ViewState::new_view * - InstanceState::alive * * @return the new_instance DataState */ static DataState new_instance() { return DataState(dds::sub::status::SampleState::any(), dds::sub::status::ViewState::new_view(), dds::sub::status::InstanceState::alive()); } private: dds::sub::status::SampleState ss_; dds::sub::status::ViewState vs_; dds::sub::status::InstanceState is_; }; #endif /* OMG_DDS_SUB_DATA_STATE_HPP_ */