OpenDDS  Snapshot(2023/04/28-20:55)
Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::InternalDataReader< T > Class Template Reference

#include <InternalDataReader.h>

Inheritance diagram for OpenDDS::DCPS::InternalDataReader< T >:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::InternalDataReader< T >:
Collaboration graph
[legend]

Classes

class  Instance
 

Public Types

typedef RcHandle< InternalDataReaderListener< T > > Listener_rch
 
typedef WeakRcHandle< InternalDataReaderListener< T > > Listener_wrch
 

Public Member Functions

typedef OPENDDS_VECTOR (T) SampleSequence
 
 InternalDataReader (const DDS::DataReaderQos qos, Listener_rch listener=Listener_rch())
 
InternalTopic and InternalWriter Interface
bool durable () const
 
void remove_publication (InternalEntity_wrch publication_handle, bool autodispose_unregistered_instances)
 
void write (InternalEntity_wrch publication_handle, const T &sample)
 
void dispose (InternalEntity_wrch publication_handle, const T &sample)
 
void unregister_instance (InternalEntity_wrch publication_handle, const T &sample)
 
User Interface
void set_listener (Listener_rch listener)
 
Listener_rch get_listener () const
 
void read (SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
void take (SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
void read_instance (SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, const T &key, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
void take_instance (SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, const T &key, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Private Member Functions

typedef OPENDDS_SET (InternalEntity_wrch) PublicationSet
 
typedef OPENDDS_MAP_T (T, Instance) InstanceMap
 

Private Attributes

const DDS::DataReaderQos qos_
 
Listener_wrch listener_
 
InstanceMap instance_map_
 
ACE_Thread_Mutex mutex_
 

Additional Inherited Members

- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 

Detailed Description

template<typename T>
class OpenDDS::DCPS::InternalDataReader< T >

Definition at line 95 of file InternalDataReader.h.

Member Typedef Documentation

◆ Listener_rch

Definition at line 98 of file InternalDataReader.h.

◆ Listener_wrch

Definition at line 99 of file InternalDataReader.h.

Constructor & Destructor Documentation

◆ InternalDataReader()

template<typename T>
OpenDDS::DCPS::InternalDataReader< T >::InternalDataReader ( const DDS::DataReaderQos  qos,
Listener_rch  listener = Listener_rch() 
)
inlineexplicit

Definition at line 101 of file InternalDataReader.h.

103  : qos_(qos)
104  , listener_(listener)
105  {}

Member Function Documentation

◆ dispose()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::dispose ( InternalEntity_wrch  publication_handle,
const T &  sample 
)
inline

Definition at line 148 of file InternalDataReader.h.

149  {
151 
152  typename InstanceMap::iterator pos = instance_map_.find(sample);
153  if (pos == instance_map_.end()) {
154  return;
155  }
156 
157  if (pos->second.dispose(publication_handle, qos_)) {
158  const Listener_rch listener = listener_.lock();
159  if (listener) {
160  listener->schedule(rchandle_from(this));
161  }
162  }
163  }
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310
#define ACE_GUARD(MUTEX, OBJ, LOCK)
RcHandle< InternalDataReaderListener< T > > Listener_rch
RcHandle< T > lock() const
Definition: RcObject.h:188

◆ durable()

template<typename T>
bool OpenDDS::DCPS::InternalDataReader< T >::durable ( ) const
inline

◆ get_listener()

template<typename T>
Listener_rch OpenDDS::DCPS::InternalDataReader< T >::get_listener ( ) const
inline

Definition at line 191 of file InternalDataReader.h.

192  {
194  return listener_.lock();
195  }
RcHandle< InternalDataReaderListener< T > > Listener_rch
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
RcHandle< T > lock() const
Definition: RcObject.h:188

◆ OPENDDS_MAP_T()

template<typename T>
typedef OpenDDS::DCPS::InternalDataReader< T >::OPENDDS_MAP_T ( ,
Instance   
)
private

◆ OPENDDS_SET()

template<typename T>
typedef OpenDDS::DCPS::InternalDataReader< T >::OPENDDS_SET ( InternalEntity_wrch  )
private

◆ OPENDDS_VECTOR()

template<typename T>
typedef OpenDDS::DCPS::InternalDataReader< T >::OPENDDS_VECTOR ( )

◆ read()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::read ( SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 197 of file InternalDataReader.h.

203  {
204  samples.clear();
205  infos.clear();
206 
207  // TODO: Index to avoid the loop.
209  for (typename InstanceMap::iterator pos = instance_map_.begin(), limit = instance_map_.end(); pos != limit; ) {
210  pos->second.read(pos->first, samples, infos, max_samples, sample_states, view_states, instance_states);
211  pos->second.purge_samples(qos_);
212  if (pos->second.can_purge_instance(qos_)) {
213  instance_map_.erase(pos++);
214  } else {
215  ++pos;
216  }
217  }
218  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
#define ACE_GUARD(MUTEX, OBJ, LOCK)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72

◆ read_instance()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::read_instance ( SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
const T &  key,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 243 of file InternalDataReader.h.

250  {
251  samples.clear();
252  infos.clear();
253 
255  typename InstanceMap::iterator pos = instance_map_.find(key);
256  if (pos != instance_map_.end()) {
257  pos->second.read(pos->first, samples, infos, max_samples, sample_states, view_states, instance_states);
258  pos->second.purge_samples(qos_);
259  if (pos->second.can_purge_instance(qos_)) {
260  instance_map_.erase(pos);
261  }
262  }
263  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
#define ACE_GUARD(MUTEX, OBJ, LOCK)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
sequence< octet > key
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72

◆ remove_publication()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::remove_publication ( InternalEntity_wrch  publication_handle,
bool  autodispose_unregistered_instances 
)
inline

Definition at line 111 of file InternalDataReader.h.

112  {
114 
115  // FUTURE: Index by publication_handle to avoid the loop.
116  bool schedule = false;
117  for (typename InstanceMap::iterator pos = instance_map_.begin(), limit = instance_map_.end(); pos != limit; ++pos) {
118  if (autodispose_unregistered_instances && pos->second.dispose(publication_handle, qos_)) {
119  schedule = true;
120  }
121  if (pos->second.unregister_instance(publication_handle, qos_)) {
122  schedule = true;
123  }
124  }
125 
126  if (schedule) {
127  const Listener_rch listener = listener_.lock();
128  if (listener) {
129  listener->schedule(rchandle_from(this));
130  // TODO: If the listener doesn't do anything, then clean up then possibly clean up the instance.
131  }
132  }
133  }
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310
#define ACE_GUARD(MUTEX, OBJ, LOCK)
RcHandle< InternalDataReaderListener< T > > Listener_rch
RcHandle< T > lock() const
Definition: RcObject.h:188

◆ set_listener()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::set_listener ( Listener_rch  listener)
inline

Definition at line 185 of file InternalDataReader.h.

186  {
188  listener_ = listener;
189  }
#define ACE_GUARD(MUTEX, OBJ, LOCK)

◆ take()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::take ( SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 220 of file InternalDataReader.h.

226  {
227  samples.clear();
228  infos.clear();
229 
230  // TODO: Index to avoid the loop.
232  for (typename InstanceMap::iterator pos = instance_map_.begin(), limit = instance_map_.end(); pos != limit; ) {
233  pos->second.take(pos->first, samples, infos, max_samples, sample_states, view_states, instance_states);
234  pos->second.purge_samples(qos_);
235  if (pos->second.can_purge_instance(qos_)) {
236  instance_map_.erase(pos++);
237  } else {
238  ++pos;
239  }
240  }
241  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
#define ACE_GUARD(MUTEX, OBJ, LOCK)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72

◆ take_instance()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::take_instance ( SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
const T &  key,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 265 of file InternalDataReader.h.

272  {
273  samples.clear();
274  infos.clear();
275 
277  typename InstanceMap::iterator pos = instance_map_.find(key);
278  if (pos != instance_map_.end()) {
279  pos->second.take(pos->first, samples, infos, max_samples, sample_states, view_states, instance_states);
280  pos->second.purge_samples(qos_);
281  if (pos->second.can_purge_instance(qos_)) {
282  instance_map_.erase(pos);
283  }
284  }
285  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
#define ACE_GUARD(MUTEX, OBJ, LOCK)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
sequence< octet > key
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72

◆ unregister_instance()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::unregister_instance ( InternalEntity_wrch  publication_handle,
const T &  sample 
)
inline

Definition at line 165 of file InternalDataReader.h.

166  {
168 
169  typename InstanceMap::iterator pos = instance_map_.find(sample);
170  if (pos == instance_map_.end()) {
171  return;
172  }
173 
174  if (pos->second.unregister_instance(publication_handle, qos_)) {
175  const Listener_rch listener = listener_.lock();
176  if (listener) {
177  listener->schedule(rchandle_from(this));
178  }
179  }
180  }
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310
#define ACE_GUARD(MUTEX, OBJ, LOCK)
RcHandle< InternalDataReaderListener< T > > Listener_rch
RcHandle< T > lock() const
Definition: RcObject.h:188

◆ write()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::write ( InternalEntity_wrch  publication_handle,
const T &  sample 
)
inline

Definition at line 135 of file InternalDataReader.h.

136  {
138 
139  const std::pair<typename InstanceMap::iterator, bool> p = instance_map_.insert(std::make_pair(sample, Instance()));
140  p.first->second.write(publication_handle, sample, qos_);
141 
142  const Listener_rch listener = listener_.lock();
143  if (listener) {
144  listener->schedule(rchandle_from(this));
145  }
146  }
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310
#define ACE_GUARD(MUTEX, OBJ, LOCK)
RcHandle< InternalDataReaderListener< T > > Listener_rch
RcHandle< T > lock() const
Definition: RcObject.h:188

Member Data Documentation

◆ instance_map_

template<typename T>
InstanceMap OpenDDS::DCPS::InternalDataReader< T >::instance_map_
private

Definition at line 563 of file InternalDataReader.h.

◆ listener_

template<typename T>
Listener_wrch OpenDDS::DCPS::InternalDataReader< T >::listener_
private

Definition at line 293 of file InternalDataReader.h.

◆ mutex_

template<typename T>
ACE_Thread_Mutex OpenDDS::DCPS::InternalDataReader< T >::mutex_
mutableprivate

Definition at line 565 of file InternalDataReader.h.

◆ qos_

template<typename T>
const DDS::DataReaderQos OpenDDS::DCPS::InternalDataReader< T >::qos_
private

Definition at line 289 of file InternalDataReader.h.


The documentation for this class was generated from the following file: