Skip to content

Commit

Permalink
Merge pull request #4609 from jrw972/dynamic-read-modify-write
Browse files Browse the repository at this point in the history
Samples from a DynamicDataReader are immutable
  • Loading branch information
jrw972 committed May 6, 2024
2 parents 62ad206 + 5a08a05 commit d5aeb63
Show file tree
Hide file tree
Showing 12 changed files with 264 additions and 330 deletions.
89 changes: 87 additions & 2 deletions dds/DCPS/XTypes/DynamicDataBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -346,9 +346,94 @@ DDS::ReturnCode_t DynamicDataBase::unsupported_method(const char* method_name, b
}

#ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
DDS::ReturnCode_t DynamicDataBase::get_simple_value(DCPS::Value& /*value*/, DDS::MemberId /*id*/)
namespace {
template <typename T>
DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DDS::DynamicData& dyn,
DDS::ReturnCode_t (DDS::DynamicData::* pmf)(T&, DDS::MemberId))
{
T v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v;
}
return ret;
}

DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DDS::DynamicData& dyn,
DDS::ReturnCode_t (DDS::DynamicData::* pmf)(char*&, DDS::MemberId))
{
CORBA::String_var v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v.in();
}
return ret;
}

DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DDS::DynamicData& dyn,
DDS::ReturnCode_t (DDS::DynamicData::* pmf)(ACE_CDR::WChar*&, DDS::MemberId))
{
CORBA::WString_var v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v.in();
}
return ret;
}
}

DDS::ReturnCode_t DynamicDataBase::get_simple_value(DCPS::Value& value, DDS::MemberId id)
{
return unsupported_method("DynamicDataBase::get_simple_value");
DDS::DynamicType_var member_type;
DDS::ReturnCode_t rc = get_member_type(member_type, type_, id);
if (rc != DDS::RETCODE_OK) {
return rc;
}
const TypeKind member_kind = member_type->get_kind();
switch (member_kind) {
case TK_BOOLEAN:
return get_some_value(value, id, *this, &DDS::DynamicData::get_boolean_value);
case TK_BYTE:
return get_some_value(value, id, *this, &DDS::DynamicData::get_byte_value);
case TK_INT8:
return get_some_value(value, id, *this, &DDS::DynamicData::get_int8_value);
case TK_INT16:
return get_some_value(value, id, *this, &DDS::DynamicData::get_int16_value);
case TK_INT32:
return get_some_value(value, id, *this, &DDS::DynamicData::get_int32_value);
case TK_INT64:
return get_some_value(value, id, *this, &DDS::DynamicData::get_int64_value);
case TK_UINT8:
return get_some_value(value, id, *this, &DDS::DynamicData::get_uint8_value);
case TK_UINT16:
return get_some_value(value, id, *this, &DDS::DynamicData::get_uint16_value);
case TK_UINT32:
return get_some_value(value, id, *this, &DDS::DynamicData::get_uint32_value);
case TK_UINT64:
return get_some_value(value, id, *this, &DDS::DynamicData::get_uint64_value);
case TK_FLOAT32:
return get_some_value(value, id, *this, &DDS::DynamicData::get_float32_value);
case TK_FLOAT64:
return get_some_value(value, id, *this, &DDS::DynamicData::get_float64_value);
case TK_FLOAT128:
return get_some_value(value, id, *this, &DDS::DynamicData::get_float128_value);
case TK_CHAR8:
return get_some_value(value, id, *this, &DDS::DynamicData::get_char8_value);
case TK_CHAR16:
return get_some_value(value, id, *this, &DDS::DynamicData::get_char16_value);
case TK_ENUM:
case TK_STRING8:
return get_some_value(value, id, *this, &DDS::DynamicData::get_string_value);
case TK_STRING16:
return get_some_value(value, id, *this, &DDS::DynamicData::get_wstring_value);
default:
if (log_level >= LogLevel::Notice) {
ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataBase::get_simple_value: "
"Member type %C is not supported by DCPS::Value\n",
typekind_to_string(member_kind)));
}
}
return DDS::RETCODE_ERROR;
}
#endif

Expand Down
165 changes: 1 addition & 164 deletions dds/DCPS/XTypes/DynamicDataImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ DynamicDataImpl::DynamicDataImpl(DDS::DynamicType_ptr type,
DDS::DynamicData_ptr backing_store)
: DynamicDataBase(type)
, container_(type_, this)
, backing_store_(backing_store)
, backing_store_(DDS::DynamicData::_duplicate(backing_store))
{
}

Expand Down Expand Up @@ -2130,169 +2130,6 @@ DDS::ReturnCode_t DynamicDataImpl::set_wstring_value(DDS::MemberId id, const COR
#endif
}

#ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
DDS::ReturnCode_t DynamicDataImpl::get_simple_value_boolean(DCPS::Value& value,
DDS::MemberId id) const
{
const_single_iterator single_it = container_.single_map_.find(id);
if (single_it != container_.single_map_.end()) {
value = single_it->second.get<ACE_OutputCDR::from_boolean>().val_;
return DDS::RETCODE_OK;
}
const_complex_iterator complex_it = container_.complex_map_.find(id);
if (complex_it != container_.complex_map_.end()) {
const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
if (!inner_dd) {
return DDS::RETCODE_ERROR;
}
const_single_iterator inner_it = inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
if (inner_it != inner_dd->container_.single_map_.end()) {
value = inner_it->second.get<ACE_OutputCDR::from_boolean>().val_;
return DDS::RETCODE_OK;
}
}
return DDS::RETCODE_ERROR;
}

DDS::ReturnCode_t DynamicDataImpl::get_simple_value_char(DCPS::Value& value,
DDS::MemberId id) const
{
const_single_iterator single_it = container_.single_map_.find(id);
if (single_it != container_.single_map_.end()) {
value = single_it->second.get<ACE_OutputCDR::from_char>().val_;
return DDS::RETCODE_OK;
}
const_complex_iterator complex_it = container_.complex_map_.find(id);
if (complex_it != container_.complex_map_.end()) {
const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
if (!inner_dd) {
return DDS::RETCODE_ERROR;
}
const_single_iterator inner_it = inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
if (inner_it != inner_dd->container_.single_map_.end()) {
value = inner_it->second.get<ACE_OutputCDR::from_char>().val_;
return DDS::RETCODE_OK;
}
}
return DDS::RETCODE_ERROR;
}

template<typename ValueType>
DDS::ReturnCode_t DynamicDataImpl::get_simple_value_primitive(DCPS::Value& value,
DDS::MemberId id) const
{
const_single_iterator single_it = container_.single_map_.find(id);
if (single_it != container_.single_map_.end()) {
value = single_it->second.get<ValueType>();
return DDS::RETCODE_OK;
}
const_complex_iterator complex_it = container_.complex_map_.find(id);
if (complex_it != container_.complex_map_.end()) {
const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
if (!inner_dd) {
return DDS::RETCODE_ERROR;
}
const_single_iterator inner_it = inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
if (inner_it != inner_dd->container_.single_map_.end()) {
value = inner_it->second.get<ValueType>();
return DDS::RETCODE_OK;
}
}
return DDS::RETCODE_ERROR;
}

DDS::ReturnCode_t DynamicDataImpl::get_simple_value_string(DCPS::Value& value,
DDS::MemberId id) const
{
const_single_iterator single_it = container_.single_map_.find(id);
if (single_it != container_.single_map_.end()) {
value = single_it->second.get<const char*>();
return DDS::RETCODE_OK;
}

const_complex_iterator complex_it = container_.complex_map_.find(id);
if (complex_it != container_.complex_map_.end()) {
// The string member has its own DynamicData object.
const DynamicDataImpl* str_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
char* str = 0;
if (!str_dd || !str_dd->read_basic_value(str)) {
return DDS::RETCODE_ERROR;
}
value = str;
return DDS::RETCODE_OK;
}
return DDS::RETCODE_ERROR;
}

DDS::ReturnCode_t DynamicDataImpl::get_simple_value_enum(DCPS::Value& value,
DDS::MemberId id) const
{
DDS::DynamicType_var mtype;
DDS::ReturnCode_t ret = get_member_type(mtype, type_, id);
if (ret != DDS::RETCODE_OK) {
return ret;
}

DDS::Int32 enumAsInteger;
ret = get_enum_value(enumAsInteger, mtype, interface_from_this(), id);
if (ret != DDS::RETCODE_OK) {
return ret;
}

DDS::String8_var str;
ret = get_enumerator_name(str, enumAsInteger, mtype);
if (ret != DDS::RETCODE_OK) {
return ret;
}

value = str.in();
return DDS::RETCODE_OK;
}

DDS::ReturnCode_t DynamicDataImpl::get_simple_value(DCPS::Value& value, DDS::MemberId id)
{
DDS::DynamicTypeMember_var dtm;
if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
return DDS::RETCODE_ERROR;
}
DDS::MemberDescriptor_var md;
if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
return DDS::RETCODE_ERROR;
}
DDS::DynamicType_var member_type = get_base_type(md->type());
const TypeKind member_kind = member_type->get_kind();
switch (member_kind) {
case TK_BOOLEAN:
return get_simple_value_boolean(value, id);
case TK_INT32:
return get_simple_value_primitive<CORBA::Long>(value, id);
case TK_UINT32:
return get_simple_value_primitive<CORBA::ULong>(value, id);
case TK_INT64:
return get_simple_value_primitive<CORBA::LongLong>(value, id);
case TK_UINT64:
return get_simple_value_primitive<CORBA::ULongLong>(value, id);
case TK_CHAR8:
return get_simple_value_char(value, id);
case TK_FLOAT64:
return get_simple_value_primitive<CORBA::Double>(value, id);
case TK_FLOAT128:
return get_simple_value_primitive<CORBA::LongDouble>(value, id);
case TK_STRING8:
return get_simple_value_string(value, id);
case TK_ENUM:
return get_simple_value_enum(value, id);
default:
if (log_level >= LogLevel::Notice) {
ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_simple_value:"
" Member type %C is not supported by DCPS::Value\n",
typekind_to_string(member_kind)));
}
}
return DDS::RETCODE_ERROR;
}
#endif

bool DynamicDataImpl::serialized_size(const DCPS::Encoding& enc, size_t& size, DCPS::Sample::Extent ext) const
{
DynamicDataImpl* non_const_this = const_cast<DynamicDataImpl*>(this);
Expand Down
13 changes: 0 additions & 13 deletions dds/DCPS/XTypes/DynamicDataImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,23 +213,10 @@ class OpenDDS_Dcps_Export DynamicDataImpl : public DynamicDataBase {
DDS::ReturnCode_t set_wstring_values(DDS::MemberId id,
const DDS::WstringSeq& value);

#ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
DDS::ReturnCode_t get_simple_value(DCPS::Value& value, DDS::MemberId id);
#endif

bool serialized_size(const DCPS::Encoding& enc, size_t& size, DCPS::Sample::Extent ext) const;
bool serialize(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;

private:
#ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
DDS::ReturnCode_t get_simple_value_boolean(DCPS::Value& value, DDS::MemberId id) const;
DDS::ReturnCode_t get_simple_value_char(DCPS::Value& value, DDS::MemberId id) const;
template<typename ValueType>
DDS::ReturnCode_t get_simple_value_primitive(DCPS::Value& value, DDS::MemberId id) const;
DDS::ReturnCode_t get_simple_value_string(DCPS::Value& value, DDS::MemberId id) const;
DDS::ReturnCode_t get_simple_value_enum(DCPS::Value& value, DDS::MemberId id) const;
#endif

CORBA::ULong get_string_item_count() const;
CORBA::ULong get_sequence_item_count() const;
bool has_member(DDS::MemberId id) const;
Expand Down
91 changes: 0 additions & 91 deletions dds/DCPS/XTypes/DynamicDataXcdrReadImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2901,97 +2901,6 @@ bool DynamicDataXcdrReadImpl::check_xcdr1_mutable_i(DDS::DynamicType_ptr dt, Dyn
return true;
}

#ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
namespace {
template <typename T>
DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DynamicDataXcdrReadImpl& dyn,
DDS::ReturnCode_t (DynamicDataXcdrReadImpl::* pmf)(T&, DDS::MemberId))
{
T v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v;
}
return ret;
}

DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DynamicDataXcdrReadImpl& dyn,
DDS::ReturnCode_t (DynamicDataXcdrReadImpl::* pmf)(char*&, DDS::MemberId))
{
CORBA::String_var v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v.in();
}
return ret;
}

DDS::ReturnCode_t get_some_value(DCPS::Value& value, DDS::MemberId id, DynamicDataXcdrReadImpl& dyn,
DDS::ReturnCode_t (DynamicDataXcdrReadImpl::* pmf)(ACE_CDR::WChar*&, DDS::MemberId))
{
CORBA::WString_var v;
const DDS::ReturnCode_t ret = (dyn.*pmf)(v, id);
if (ret == DDS::RETCODE_OK) {
value = v.in();
}
return ret;
}
}

DDS::ReturnCode_t DynamicDataXcdrReadImpl::get_simple_value(DCPS::Value& value, DDS::MemberId id)
{
DDS::DynamicTypeMember_var dtm;
if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
return DDS::RETCODE_ERROR;
}
DDS::MemberDescriptor_var md;
if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
return DDS::RETCODE_ERROR;
}
DDS::DynamicType_var member_type = get_base_type(md->type());
const TypeKind member_kind = member_type->get_kind();
switch (member_kind) {
case TK_BOOLEAN:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_boolean_value);
case TK_BYTE:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_byte_value);
case TK_INT8:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int8_value);
case TK_INT16:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int16_value);
case TK_INT32:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int32_value);
case TK_INT64:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int64_value_impl);
case TK_UINT8:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint8_value);
case TK_UINT16:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint16_value);
case TK_UINT32:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint32_value);
case TK_UINT64:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint64_value_impl);
case TK_FLOAT32:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float32_value);
case TK_FLOAT64:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float64_value);
case TK_FLOAT128:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float128_value);
case TK_CHAR8:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_char8_value);
case TK_CHAR16:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_char16_value);
case TK_ENUM:
case TK_STRING8:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_string_value);
case TK_STRING16:
return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_wstring_value);
default:
return DDS::RETCODE_UNSUPPORTED;
}
}
#endif

#ifndef OPENDDS_SAFETY_PROFILE
bool print_member(DDS::DynamicData_ptr dd, DCPS::String& type_string, DCPS::String& indent,
MemberId member_id);
Expand Down

0 comments on commit d5aeb63

Please sign in to comment.