From cc32a248ec7c1e0363d48b1d7c70daa7b8af5584 Mon Sep 17 00:00:00 2001 From: Johnny Willemsen Date: Thu, 10 Aug 2023 09:15:02 +0200 Subject: [PATCH 1/3] Add (u)int8 CDR support * ridlbe/c++11/templates/cli/prx/array_cdr.erb: * ridlbe/c++11/templates/cli/src/union_cdr.erb: * tao/x11/array_cdr_t.h: * tao/x11/sequence_cdr_t.h: * tests/idl4/explicit_ints/explicit_ints.mpc: --- ridlbe/c++11/templates/cli/prx/array_cdr.erb | 8 +- ridlbe/c++11/templates/cli/src/union_cdr.erb | 12 +-- tao/x11/array_cdr_t.h | 21 +++++ tao/x11/sequence_cdr_t.h | 82 ++++++++++++++++++++ tests/idl4/explicit_ints/explicit_ints.mpc | 2 +- 5 files changed, 112 insertions(+), 13 deletions(-) diff --git a/ridlbe/c++11/templates/cli/prx/array_cdr.erb b/ridlbe/c++11/templates/cli/prx/array_cdr.erb index e643f126..d05ec457 100644 --- a/ridlbe/c++11/templates/cli/prx/array_cdr.erb +++ b/ridlbe/c++11/templates/cli/prx/array_cdr.erb @@ -27,15 +27,11 @@ TAO_BEGIN_VERSIONED_NAMESPACE_DECL //@{ inline TAO_CORBA::Boolean operator<< (TAO_OutputCDR &cdr, const IDL::traits<<%= scoped_cxxtype %>>::value_type &v) { - return taox11_array_cdr<<%= cxxdim_sizes.size-1 %>U, - <%= scoped_cxxtype %>::value_type, - <%= cxxdim_sizes.first %>>::insert (cdr, v); + return taox11_array_cdr<<%= cxxdim_sizes.size-1 %>U, <%= scoped_cxxtype %>::value_type, <%= cxxdim_sizes.first %>>::insert (cdr, v); } inline TAO_CORBA::Boolean operator>> (TAO_InputCDR &cdr, IDL::traits<<%= scoped_cxxtype %>>::value_type& v) { - return taox11_array_cdr<<%= cxxdim_sizes.size-1 %>U, - <%= scoped_cxxtype %>::value_type, - <%= cxxdim_sizes.first %>>::extract (cdr, v); + return taox11_array_cdr<<%= cxxdim_sizes.size-1 %>U, <%= scoped_cxxtype %>::value_type, <%= cxxdim_sizes.first %>>::extract (cdr, v); } //@} diff --git a/ridlbe/c++11/templates/cli/src/union_cdr.erb b/ridlbe/c++11/templates/cli/src/union_cdr.erb index 9541c590..2e048140 100644 --- a/ridlbe/c++11/templates/cli/src/union_cdr.erb +++ b/ridlbe/c++11/templates/cli/src/union_cdr.erb @@ -16,20 +16,20 @@ TAO_CORBA::Boolean operator<< ( % if (_defmem && _ndefmem.empty?) || (!_ndefmem.empty? && _ndefmem.first.labels.size>1) % # in these cases there is only a single member mapping all labels % _m = _defmem || _ndefmem.shift - result = strm <<<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; + result = strm << <%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; % else % # here we have 1 or 2 nondef members with or without a default % _m = _ndefmem.shift # get first non-default member % _lbl = _m.labels.first if (<%= _lbl == 'false' ? '!' : '' %>_tao_union._d ()) { - result = strm <<<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; + result = strm << <%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; } % if _defmem || !_ndefmem.empty? else { % _m = _defmem || _ndefmem.shift # get other (non-)default member - result = strm <<<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; + result = strm < <<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; } % end % end @@ -42,7 +42,7 @@ TAO_CORBA::Boolean operator<< ( case <%= _lbl %>: % end { - result = strm <<<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; + result = strm << <%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; } break; % end @@ -52,7 +52,7 @@ TAO_CORBA::Boolean operator<< ( % if has_default? % _m_def = default_member { - result = strm <<<%= _m_def.cdr_from_fmt % "_tao_union.#{_m_def.cxxname} ()" %>; + result = strm << <%= _m_def.cdr_from_fmt % "_tao_union.#{_m_def.cxxname} ()" %>; } % end break; @@ -66,7 +66,7 @@ TAO_CORBA::Boolean operator>> ( TAO_InputCDR &strm, <%= scoped_cxxname %> &_tao_union) { - <%= scoped_switch_cxxtype %> _tao_discriminant; + <%= scoped_switch_cxxtype %> _tao_discriminant<%= switchtype.zero_initializer %>; if (!(strm >> <%= switchtype.cdr_to_fmt % "_tao_discriminant" %>)) { return false; diff --git a/tao/x11/array_cdr_t.h b/tao/x11/array_cdr_t.h index 0a111d9d..fd2f8983 100644 --- a/tao/x11/array_cdr_t.h +++ b/tao/x11/array_cdr_t.h @@ -172,6 +172,27 @@ TAO_BEGIN_VERSIONED_NAMESPACE_DECL } }; + /// Octet array specialization + template + struct taox11_array_cdr<0U, int8_t, _Nm> + { + template + static inline bool insert ( + _Stream& strm , + const std::array& _v) + { + return strm.write_int8_array (_v.data (), _Nm); + } + + template + static inline bool extract ( + _Stream& strm , + std::array& _v) + { + return strm.read_int8_array (_v.data (), _Nm); + } + }; + /// Short array specialization template struct taox11_array_cdr<0U, int16_t, _Nm> diff --git a/tao/x11/sequence_cdr_t.h b/tao/x11/sequence_cdr_t.h index 120ebcdc..5453bffd 100644 --- a/tao/x11/sequence_cdr_t.h +++ b/tao/x11/sequence_cdr_t.h @@ -470,6 +470,88 @@ TAO_BEGIN_VERSIONED_NAMESPACE_DECL } }; + /// TinyShort sequence CDR streaming helper template + template <> + struct taox11_sequence_cdr + { + /// Unbounded insert + template + static inline bool insert ( + _Stream& _strm, + const std::vector& _seq) + { + uint32_t const length = ACE_Utils::truncate_cast (_seq.size ()); + + if (!(_strm << length)) + { + return false; + } + + return _strm.write_int8_array (_seq.data (), length); + } + + /// Bounded insert + template + static inline bool insert ( + _Stream& _strm, + const TAOX11_IDL::bounded_vector& _seq) + { + uint32_t const length = ACE_Utils::truncate_cast (_seq.size ()); + + if (_Bound && length > _Bound) + { + throw TAO_CORBA::BAD_PARAM (); + } + + return insert<_Stream> (_strm, _seq); + } + + /// Unbounded extract + template + static inline bool extract ( + _Stream& _strm, + std::vector& _seq) + { + uint32_t length {}; + + if (!(_strm >> length)) + { + return false; + } + + std::vector _new_seq (length); + if (!_strm.read_int8_array (_new_seq.data (), length)) + return false; + _seq.swap (_new_seq); + return true; + } + + /// Bounded extract + template + static inline bool extract ( + _Stream& _strm, + TAOX11_IDL::bounded_vector& _seq) + { + uint32_t length {}; + + if (!(_strm >> length)) + { + return false; + } + + if (_Bound && length > _Bound) + { + throw TAO_CORBA::BAD_PARAM (); + } + + std::vector _new_seq (length); + if (!_strm.read_int8_array (_new_seq.data (), length)) + return false; + _seq.swap (_new_seq); + return true; + } + }; + /// Short sequence CDR streaming helper template template <> struct taox11_sequence_cdr diff --git a/tests/idl4/explicit_ints/explicit_ints.mpc b/tests/idl4/explicit_ints/explicit_ints.mpc index 18df0ab9..5fa8c00a 100644 --- a/tests/idl4/explicit_ints/explicit_ints.mpc +++ b/tests/idl4/explicit_ints/explicit_ints.mpc @@ -2,7 +2,7 @@ project(*explicit_ints_gen_Idl): ridl_defaults { IDL_Files { test.idl - idlflags += --idl-version=4 -Scdr + idlflags += --idl-version=4 } custom_only = 1 } From f4f9ee354246f9e0fdd4b86892fb927dc14cc31b Mon Sep 17 00:00:00 2001 From: Johnny Willemsen Date: Thu, 10 Aug 2023 09:15:59 +0200 Subject: [PATCH 2/3] Update comment * tao/x11/array_cdr_t.h: --- tao/x11/array_cdr_t.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tao/x11/array_cdr_t.h b/tao/x11/array_cdr_t.h index fd2f8983..81866bca 100644 --- a/tao/x11/array_cdr_t.h +++ b/tao/x11/array_cdr_t.h @@ -172,7 +172,7 @@ TAO_BEGIN_VERSIONED_NAMESPACE_DECL } }; - /// Octet array specialization + /// TinyShort array specialization template struct taox11_array_cdr<0U, int8_t, _Nm> { From a58bb8e479e97d295a85016b3b688540d9ca0849 Mon Sep 17 00:00:00 2001 From: Johnny Willemsen Date: Thu, 10 Aug 2023 11:43:48 +0200 Subject: [PATCH 3/3] Fixed compile error * ridlbe/c++11/templates/cli/src/union_cdr.erb: --- ridlbe/c++11/templates/cli/src/union_cdr.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ridlbe/c++11/templates/cli/src/union_cdr.erb b/ridlbe/c++11/templates/cli/src/union_cdr.erb index 2e048140..c66db2b9 100644 --- a/ridlbe/c++11/templates/cli/src/union_cdr.erb +++ b/ridlbe/c++11/templates/cli/src/union_cdr.erb @@ -29,7 +29,7 @@ TAO_CORBA::Boolean operator<< ( else { % _m = _defmem || _ndefmem.shift # get other (non-)default member - result = strm < <<%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; + result = strm << <%= _m.cdr_from_fmt % "_tao_union.#{_m.cxxname} ()" %>; } % end % end