OpenDDS  Snapshot(2023/04/28-20:55)
Sample.h
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.opendds.org/license.html
4  */
5 
6 #ifndef OPENDDS_DCPS_SAMPLE_H
7 #define OPENDDS_DCPS_SAMPLE_H
8 
9 #include "Serializer.h"
10 #include "TypeSupportImpl.h"
11 #include "RcHandle_T.h"
12 #include "FilterEvaluator.h"
13 
14 #include <dds/DdsDynamicDataC.h>
15 
17 
18 namespace OpenDDS {
19 
20 #ifndef OPENDDS_SAFETY_PROFILE
21 namespace XTypes {
22  // These are here because including DynamicDataAdapter.h creates a include loop.
23  template <typename T, typename Tag>
24  DDS::DynamicData_ptr get_dynamic_data_adapter(DDS::DynamicType_ptr type, const T& value);
25 
26  template <typename T, typename Tag>
27  DDS::DynamicData_ptr get_dynamic_data_adapter(DDS::DynamicType_ptr type, T& value);
28 }
29 #endif
30 
31 namespace DCPS {
32 
33 class Sample;
36 
37 /**
38  * Represents a sample that can either be an instance of a C++ generated type
39  * from opendds_idl or a DynamicData. This is meant to be used by
40  * DataReaderImpl and DataWriterImpl.
41  */
43 public:
44  enum Mutability {
46  ReadOnly
47  };
48 
49  enum Extent {
53  };
54 
56  : mutability_(Mutable)
57  , extent_(Full)
58  {
59  }
60 
61  Sample(Mutability mutability, Extent extent)
62  : mutability_(mutability)
63  , extent_(extent)
64  {
65  OPENDDS_ASSERT(extent != NestedKeyOnly);
66  }
67 
68  virtual ~Sample() {}
69 
70  bool read_only() const
71  {
72  return mutability_ == ReadOnly;
73  }
74 
75  bool key_only() const
76  {
77  return extent_ == KeyOnly;
78  }
79 
80  virtual bool serialize(Serializer& ser) const = 0;
81  virtual bool deserialize(Serializer& ser) = 0;
82  virtual size_t serialized_size(const Encoding& enc) const = 0;
83  virtual bool compare(const Sample& other) const = 0;
84  virtual bool to_message_block(ACE_Message_Block& mb) const = 0;
85  virtual bool from_message_block(const ACE_Message_Block& mb) = 0;
86  virtual Sample_rch copy(Mutability mutability, Extent extent) const = 0;
87 
88  Sample_rch copy(Mutability mutability) const
89  {
90  return copy(mutability, extent_);
91  }
92 
93 #ifndef OPENDDS_SAFETY_PROFILE
94  virtual DDS::DynamicData_var get_dynamic_data(DDS::DynamicType_ptr type) const = 0;
95 #endif
96 
97  virtual const void* native_data() const = 0;
98 
99 #ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
100  virtual bool eval(FilterEvaluator& evaluator, const DDS::StringSeq& params) const = 0;
101 #endif
102 
103 protected:
106 };
107 
109  bool operator()(const Sample_rch& lhs, const Sample_rch& rhs) const
110  {
111  return lhs->compare(*rhs);
112  }
113 };
114 
115 template <typename NativeType>
116 class Sample_T : public Sample {
117 public:
123 
124  explicit Sample_T(const NativeType& data, Extent extent = Full)
125  : Sample(ReadOnly, extent)
126  , owns_data_(false)
127  , data_(&data)
129  , dynamic_data_(0)
130 #endif
131  {
132  }
133 
134  explicit Sample_T(const NativeType* data, Extent extent = Full)
135  : Sample(ReadOnly, extent)
136  , owns_data_(true)
137  , data_(data)
139  , dynamic_data_(0)
140 #endif
141  {
142  }
143 
144  explicit Sample_T(NativeType& data, Extent extent = Full)
145  : Sample(Mutable, extent)
146  , owns_data_(false)
147  , data_(&data)
149  , dynamic_data_(0)
150 #endif
151  {
152  }
153 
154  explicit Sample_T(NativeType* data, Extent extent = Full)
155  : Sample(Mutable, extent)
156  , owns_data_(true)
157  , data_(data)
159  , dynamic_data_(0)
160 #endif
161  {
162  }
163 
164  virtual ~Sample_T()
165  {
166  if (owns_data_) {
167  delete data_;
168  }
169  }
170 
171  const NativeType& data() const
172  {
173  return *data_;
174  }
175 
176  NativeType& mutable_data() const
177  {
178  OPENDDS_ASSERT(!read_only());
179  return *const_cast<NativeType*>(data_);
180  }
181 
182  KeyOnlyType key_only_data() const
183  {
184  return KeyOnlyType(*data_);
185  }
186 
187  MutableKeyOnlyType mutable_key_only_data() const
188  {
189  return MutableKeyOnlyType(mutable_data());
190  }
191 
192  bool serialize(Serializer& ser) const
193  {
194  if (key_only()) {
195  return ser << key_only_data();
196  } else {
197  return ser << data();
198  }
199  }
200 
202  {
203  if (key_only()) {
204  return ser >> mutable_key_only_data();
205  } else {
206  return ser >> mutable_data();
207  }
208  }
209 
210  size_t serialized_size(const Encoding& enc) const
211  {
212  if (key_only()) {
213  return OpenDDS::DCPS::serialized_size(enc, key_only_data());
214  } else {
215  return OpenDDS::DCPS::serialized_size(enc, data());
216  }
217  }
218 
219  bool compare(const Sample& other) const
220  {
221  const Sample_T<NativeType>* const other_same_kind =
222  dynamic_cast<const Sample_T<NativeType>*>(&other);
223  OPENDDS_ASSERT(other_same_kind);
224  return typename TraitsType::LessThanType()(*data_, *other_same_kind->data_);
225  }
226 
228  {
229  return MarshalTraitsType::to_message_block(mb, data());
230  }
231 
233  {
234  return MarshalTraitsType::from_message_block(mutable_data(), mb);
235  }
236 
237  Sample_rch copy(Mutability mutability, Extent extent) const
238  {
239  NativeType* new_data = new NativeType;
240  *new_data = *data_;
241  return dynamic_rchandle_cast<Sample>(mutability == ReadOnly ?
242  make_rch<Sample_T<NativeType> >(const_cast<const NativeType*>(new_data), extent) :
243  make_rch<Sample_T<NativeType> >(new_data, extent));
244  }
245 
246 #ifndef OPENDDS_SAFETY_PROFILE
247  DDS::DynamicData_var get_dynamic_data(DDS::DynamicType_ptr type) const
248  {
249 # if OPENDDS_HAS_DYNAMIC_DATA_ADAPTER
250  if (!dynamic_data_ && data_) {
251  dynamic_data_ = read_only() ?
252  XTypes::get_dynamic_data_adapter<NativeType, NativeType>(type, *data_) :
253  XTypes::get_dynamic_data_adapter<NativeType, NativeType>(type, mutable_data());
254  }
255  return dynamic_data_;
256 # else
257  ACE_UNUSED_ARG(type);
258  return 0;
259 # endif
260  }
261 #endif
262 
263  const void* native_data() const
264  {
265  return data_;
266  }
267 
268 #ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
269  bool eval(FilterEvaluator& evaluator, const DDS::StringSeq& params) const
270  {
271  return evaluator.eval(*data_, params);
272  }
273 #endif
274 
275 private:
276  const bool owns_data_;
277  const NativeType* data_;
278 #if OPENDDS_HAS_DYNAMIC_DATA_ADAPTER
279  mutable DDS::DynamicData_var dynamic_data_;
280 #endif
281 };
282 
283 } // namespace DCPS
284 } // namespace OpenDDS
285 
287 
288 #endif
NativeType & mutable_data() const
Definition: Sample.h:176
DDS::DynamicData_var get_dynamic_data(DDS::DynamicType_ptr type) const
Definition: Sample.h:247
bool eval(FilterEvaluator &evaluator, const DDS::StringSeq &params) const
Definition: Sample.h:269
const LogLevel::Value value
Definition: debug.cpp:61
if(!(yy_init))
Sample_rch copy(Mutability mutability, Extent extent) const
Definition: Sample.h:237
const NativeType & data() const
Definition: Sample.h:171
size_t serialized_size(const Encoding &enc) const
Definition: Sample.h:210
RcHandle< Sample_T< NativeType > > Rch
Definition: Sample.h:120
RcHandle< const Sample > ConstSample_rch
Definition: Sample.h:35
#define OpenDDS_Dcps_Export
Definition: dcps_export.h:24
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:72
bool from_message_block(const ACE_Message_Block &mb)
Definition: Sample.h:232
DDSTraits< NativeType > TraitsType
Definition: Sample.h:118
MarshalTraits< NativeType > MarshalTraitsType
Definition: Sample.h:119
bool key_only() const
Definition: Sample.h:75
void serialized_size(const Encoding &encoding, size_t &size, const SequenceNumber &)
const NativeType * data_
Definition: Sample.h:277
virtual ~Sample_T()
Definition: Sample.h:164
DCPS::KeyOnly< const NativeType > KeyOnlyType
Definition: Sample.h:121
DCPS::KeyOnly< NativeType > MutableKeyOnlyType
Definition: Sample.h:122
Class to serialize and deserialize data for DDS.
Definition: Serializer.h:369
Sample_T(NativeType &data, Extent extent=Full)
Definition: Sample.h:144
Sample_rch copy(Mutability mutability) const
Definition: Sample.h:88
MutableKeyOnlyType mutable_key_only_data() const
Definition: Sample.h:187
Sample_T(NativeType *data, Extent extent=Full)
Definition: Sample.h:154
#define OPENDDS_HAS_DYNAMIC_DATA_ADAPTER
Definition: Definitions.h:62
Sample_T(const NativeType *data, Extent extent=Full)
Definition: Sample.h:134
bool operator()(const Sample_rch &lhs, const Sample_rch &rhs) const
Definition: Sample.h:109
DDS::DynamicData_var dynamic_data_
Definition: Sample.h:279
const void * native_data() const
Definition: Sample.h:263
bool to_message_block(ACE_Message_Block &mb) const
Definition: Sample.h:227
const bool owns_data_
Definition: Sample.h:276
Mutability mutability_
Definition: Sample.h:104
bool compare(const Sample &other) const
Definition: Sample.h:219
Sample_T(const NativeType &data, Extent extent=Full)
Definition: Sample.h:124
bool eval(const T &sample, const DDS::StringSeq &params) const
RcHandle< Sample > Sample_rch
Definition: Sample.h:33
DDS::ReturnCode_t copy(DDS::DynamicData_ptr dest, DDS::DynamicData_ptr src)
bool read_only() const
Definition: Sample.h:70
bool serialize(Serializer &ser) const
Definition: Sample.h:192
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
RcHandle< T > dynamic_rchandle_cast(const RcHandle< U > &h)
Definition: RcHandle_T.h:214
DDS::DynamicData_ptr get_dynamic_data_adapter(DDS::DynamicType_ptr type, const T &value)
KeyOnlyType key_only_data() const
Definition: Sample.h:182
Sample(Mutability mutability, Extent extent)
Definition: Sample.h:61
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
virtual ~Sample()
Definition: Sample.h:68
sequence< string > StringSeq
Definition: DdsDcpsCore.idl:50
bool deserialize(Serializer &ser)
Definition: Sample.h:201