Line data Source code
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 : 13 : OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL 14 : 15 : namespace OpenDDS { 16 : namespace DCPS { 17 : 18 : struct OpenDDS_Dcps_Export ValueDispatcher { 19 134 : 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 134 : virtual ~ValueDispatcher_T() {} 36 : 37 0 : virtual void* new_value() const 38 : { 39 0 : return new T(); 40 : } 41 : 42 0 : virtual void delete_value(void* data) const 43 : { 44 0 : T* tbd = static_cast<T*>(data); 45 0 : delete tbd; 46 0 : } 47 : 48 0 : virtual bool read(ValueReader& value_reader, void* data) const 49 : { 50 0 : return vread(value_reader, *static_cast<T*>(data)); 51 : } 52 : 53 0 : virtual void write(ValueWriter& value_writer, const void* data) const 54 : { 55 0 : vwrite(value_writer, *static_cast<const T*>(data)); 56 0 : } 57 : 58 : typedef typename OpenDDS::DCPS::DDSTraits<T> TraitsType; 59 : typedef typename TraitsType::DataWriterType DataWriterType; 60 : 61 0 : virtual DDS::InstanceHandle_t register_instance_helper(DDS::DataWriter* dw, const void* data) const 62 : { 63 0 : DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw); 64 0 : return dw_t ? dw_t->register_instance(*static_cast<const T*>(data)) : DDS::HANDLE_NIL; 65 : } 66 : 67 0 : virtual DDS::ReturnCode_t write_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const 68 : { 69 0 : DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw); 70 0 : return dw_t ? dw_t->write(*static_cast<const T*>(data), inst) : DDS::RETCODE_BAD_PARAMETER; 71 : } 72 : 73 0 : virtual DDS::ReturnCode_t unregister_instance_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const 74 : { 75 0 : DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw); 76 0 : return dw_t ? dw_t->unregister_instance(*static_cast<const T*>(data), inst) : DDS::RETCODE_BAD_PARAMETER; 77 : } 78 : 79 0 : virtual DDS::ReturnCode_t dispose_helper(DDS::DataWriter* dw, const void* data, DDS::InstanceHandle_t inst) const 80 : { 81 0 : DataWriterType* dw_t = dynamic_cast<DataWriterType*>(dw); 82 0 : 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 : 89 : OPENDDS_END_VERSIONED_NAMESPACE_DECL 90 : 91 : #endif /* OPENDDS_DCPS_VALUE_DISPATCHER_H */