OpenDDS  Snapshot(2023/04/28-20:55)
ValueDispatcher.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_VALUE_DISPATCHER_H
7 #define OPENDDS_DCPS_VALUE_DISPATCHER_H
8 
9 #include "TypeSupportImpl.h"
10 #include "ValueReader.h"
11 #include "ValueWriter.h"
12 
14 
15 namespace OpenDDS {
16 namespace DCPS {
17 
19  virtual ~ValueDispatcher() {}
20 
21  virtual void* new_value() const = 0;
22  virtual void delete_value(void* data) const = 0;
23 
24  virtual bool read(ValueReader& value_reader, void* data) const = 0;
25  virtual void write(ValueWriter& value_writer, const void* data) const = 0;
26 
27  virtual DDS::InstanceHandle_t register_instance_helper(DDS::DataWriter* dw, const void* data) const = 0;
28  virtual DDS::ReturnCode_t write_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const = 0;
29  virtual DDS::ReturnCode_t unregister_instance_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const = 0;
30  virtual DDS::ReturnCode_t dispose_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const = 0;
31 };
32 
33 template <typename T>
34 struct ValueDispatcher_T : public virtual ValueDispatcher {
35  virtual ~ValueDispatcher_T() {}
36 
37  virtual void* new_value() const
38  {
39  return new T();
40  }
41 
42  virtual void delete_value(void* data) const
43  {
44  T* tbd = static_cast<T*>(data);
45  delete tbd;
46  }
47 
48  virtual bool read(ValueReader& value_reader, void* data) const
49  {
50  return vread(value_reader, *static_cast<T*>(data));
51  }
52 
53  virtual void write(ValueWriter& value_writer, const void* data) const
54  {
55  vwrite(value_writer, *static_cast<const T*>(data));
56  }
57 
59  typedef typename TraitsType::DataWriterType DataWriterType;
60 
61  virtual DDS::InstanceHandle_t register_instance_helper(DDS::DataWriter* dw, const void* data) const
62  {
63  DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw);
64  return dw_t ? dw_t->register_instance(*static_cast<const T*>(data)) : DDS::HANDLE_NIL;
65  }
66 
67  virtual DDS::ReturnCode_t write_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const
68  {
69  DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw);
70  return dw_t ? dw_t->write(*static_cast<const T*>(data), inst) : DDS::RETCODE_BAD_PARAMETER;
71  }
72 
74  {
75  DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw);
76  return dw_t ? dw_t->unregister_instance(*static_cast<const T*>(data), inst) : DDS::RETCODE_BAD_PARAMETER;
77  }
78 
79  virtual DDS::ReturnCode_t dispose_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const
80  {
81  DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw);
82  return dw_t ? dw_t->dispose(*static_cast<const T*>(data), inst) : DDS::RETCODE_BAD_PARAMETER;
83  }
84 };
85 
86 } // namespace DCPS
87 } // namespace OpenDDS
88 
90 
91 #endif /* OPENDDS_DCPS_VALUE_DISPATCHER_H */
void vwrite(ValueWriter &vw, const Observer::Sample &sample)
Definition: Observer.cpp:51
virtual DDS::ReturnCode_t dispose_helper(DDS::DataWriter *dw, const void *data, DDS::InstanceHandle_t inst) const
const InstanceHandle_t HANDLE_NIL
#define OpenDDS_Dcps_Export
Definition: dcps_export.h:24
OpenDDS::DCPS::DDSTraits< T > TraitsType
bool vread(ValueReader &, XTypes::TypeIdentifier &)
virtual DDS::ReturnCode_t unregister_instance_helper(DDS::DataWriter *dw, const void *data, DDS::InstanceHandle_t inst) const
virtual void delete_value(void *data) const
virtual void write(ValueWriter &value_writer, const void *data) const
ssize_t read(ACE_HANDLE handle, void *buf, size_t len)
virtual DDS::ReturnCode_t write_helper(DDS::DataWriter *dw, const void *data, DDS::InstanceHandle_t inst) const
virtual DDS::InstanceHandle_t register_instance_helper(DDS::DataWriter *dw, const void *data) const
TraitsType::DataWriterType DataWriterType
HANDLE_TYPE_NATIVE InstanceHandle_t
Definition: DdsDcpsCore.idl:51
virtual bool read(ValueReader &value_reader, void *data) const
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
::DDS::ReturnCode_t write(in<%SCOPED%> instance_data, in ::DDS::InstanceHandle_t handle)
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
virtual void * new_value() const
const ReturnCode_t RETCODE_BAD_PARAMETER