LCOV - code coverage report
Current view: top level - DCPS/XTypes - DynamicDataImpl.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 5 13 38.5 %
Date: 2023-04-30 01:32:43 Functions: 1 2 50.0 %

          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_XTYPES_DYNAMIC_DATA_IMPL_H
       7             : #define OPENDDS_DCPS_XTYPES_DYNAMIC_DATA_IMPL_H
       8             : 
       9             : #ifndef OPENDDS_SAFETY_PROFILE
      10             : #  include "DynamicDataBase.h"
      11             : 
      12             : #  include <dds/DCPS/FilterEvaluator.h>
      13             : #  include <dds/DCPS/Sample.h>
      14             : 
      15             : OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
      16             : 
      17             : namespace OpenDDS {
      18             : 
      19             : namespace XTypes {
      20             : class DynamicDataImpl;
      21             : }
      22             : 
      23             : namespace DCPS {
      24             : OpenDDS_Dcps_Export
      25             : bool serialized_size(const Encoding& encoding, size_t& size, const XTypes::DynamicDataImpl& data);
      26             : OpenDDS_Dcps_Export
      27             : bool operator<<(Serializer& ser, const XTypes::DynamicDataImpl& data);
      28             : OpenDDS_Dcps_Export
      29             : bool serialized_size(const Encoding& encoding, size_t& size, const KeyOnly<const XTypes::DynamicDataImpl>& data);
      30             : OpenDDS_Dcps_Export
      31             : bool operator<<(Serializer& ser, const KeyOnly<const XTypes::DynamicDataImpl>& data);
      32             : }
      33             : 
      34             : namespace XTypes {
      35             : 
      36             : class OpenDDS_Dcps_Export DynamicDataImpl : public DynamicDataBase {
      37             : public:
      38             :   explicit DynamicDataImpl(DDS::DynamicType_ptr type);
      39             :   DynamicDataImpl(const DynamicDataImpl& other);
      40             : 
      41             :   DDS::ReturnCode_t set_descriptor(MemberId id, DDS::MemberDescriptor* value);
      42             : 
      43             :   MemberId get_member_id_at_index(ACE_CDR::ULong index);
      44             :   ACE_CDR::ULong get_item_count();
      45             : 
      46             :   DDS::ReturnCode_t clear_all_values();
      47             :   DDS::ReturnCode_t clear_nonkey_values();
      48             :   DDS::ReturnCode_t clear_value(DDS::MemberId id);
      49             : 
      50             :   DDS::DynamicData_ptr clone();
      51             : 
      52             :   DDS::ReturnCode_t get_int8_value(CORBA::Int8& value,
      53             :                                    DDS::MemberId id);
      54             :   DDS::ReturnCode_t set_int8_value(DDS::MemberId id,
      55             :                                    CORBA::Int8 value);
      56             : 
      57             :   DDS::ReturnCode_t get_uint8_value(CORBA::UInt8& value,
      58             :                                     DDS::MemberId id);
      59             :   DDS::ReturnCode_t set_uint8_value(DDS::MemberId id,
      60             :                                     CORBA::UInt8 value);
      61             : 
      62             :   DDS::ReturnCode_t get_int16_value(CORBA::Short& value,
      63             :                                     DDS::MemberId id);
      64             :   DDS::ReturnCode_t set_int16_value(DDS::MemberId id,
      65             :                                     CORBA::Short value);
      66             : 
      67             :   DDS::ReturnCode_t get_uint16_value(CORBA::UShort& value,
      68             :                                      DDS::MemberId id);
      69             :   DDS::ReturnCode_t set_uint16_value(DDS::MemberId id,
      70             :                                      CORBA::UShort value);
      71             : 
      72             :   DDS::ReturnCode_t get_int32_value(CORBA::Long& value,
      73             :                                     DDS::MemberId id);
      74             :   DDS::ReturnCode_t set_int32_value(DDS::MemberId id,
      75             :                                     CORBA::Long value);
      76             : 
      77             :   DDS::ReturnCode_t get_uint32_value(CORBA::ULong& value,
      78             :                                      DDS::MemberId);
      79             :   DDS::ReturnCode_t set_uint32_value(DDS::MemberId id,
      80             :                                      CORBA::ULong value);
      81             : 
      82             :   DDS::ReturnCode_t get_int64_value_impl(CORBA::LongLong& value, DDS::MemberId id);
      83             :   DDS::ReturnCode_t set_int64_value(DDS::MemberId id,
      84             :                                     CORBA::LongLong value);
      85             : 
      86             :   DDS::ReturnCode_t get_uint64_value_impl(CORBA::ULongLong& value, DDS::MemberId id);
      87             :   DDS::ReturnCode_t set_uint64_value(DDS::MemberId id,
      88             :                                      CORBA::ULongLong value);
      89             : 
      90             :   DDS::ReturnCode_t get_float32_value(CORBA::Float& value,
      91             :                                       DDS::MemberId id);
      92             :   DDS::ReturnCode_t set_float32_value(DDS::MemberId id,
      93             :                                       CORBA::Float value);
      94             : 
      95             :   DDS::ReturnCode_t get_float64_value(CORBA::Double& value,
      96             :                                       DDS::MemberId id);
      97             :   DDS::ReturnCode_t set_float64_value(DDS::MemberId id,
      98             :                                       CORBA::Double value);
      99             : 
     100             :   DDS::ReturnCode_t get_float128_value(CORBA::LongDouble& value,
     101             :                                        DDS::MemberId id);
     102             :   DDS::ReturnCode_t set_float128_value(DDS::MemberId id,
     103             :                                        CORBA::LongDouble value);
     104             : 
     105             :   DDS::ReturnCode_t get_char8_value(CORBA::Char& value,
     106             :                                     DDS::MemberId id);
     107             :   DDS::ReturnCode_t set_char8_value(DDS::MemberId id,
     108             :                                     CORBA::Char value);
     109             : 
     110             :   DDS::ReturnCode_t get_char16_value(CORBA::WChar& value,
     111             :                                      DDS::MemberId id);
     112             :   DDS::ReturnCode_t set_char16_value(DDS::MemberId id,
     113             :                                      CORBA::WChar value);
     114             : 
     115             :   DDS::ReturnCode_t get_byte_value(CORBA::Octet& value,
     116             :                                    DDS::MemberId id);
     117             :   DDS::ReturnCode_t set_byte_value(DDS::MemberId id,
     118             :                                    CORBA::Octet value);
     119             : 
     120             :   DDS::ReturnCode_t get_boolean_value(CORBA::Boolean& value,
     121             :                                       DDS::MemberId id);
     122             :   DDS::ReturnCode_t set_boolean_value(DDS::MemberId id,
     123             :                                       CORBA::Boolean value);
     124             : 
     125             :   DDS::ReturnCode_t get_string_value(char*& value,
     126             :                                      DDS::MemberId id);
     127             :   DDS::ReturnCode_t set_string_value(DDS::MemberId id,
     128             :                                      const char* value);
     129             : 
     130             :   DDS::ReturnCode_t get_wstring_value(CORBA::WChar*& value,
     131             :                                       DDS::MemberId id);
     132             :   DDS::ReturnCode_t set_wstring_value(DDS::MemberId id,
     133             :                                       const CORBA::WChar* value);
     134             : 
     135             :   DDS::ReturnCode_t get_complex_value(DDS::DynamicData_ptr& value,
     136             :                                       DDS::MemberId id);
     137             :   DDS::ReturnCode_t set_complex_value(DDS::MemberId id,
     138             :                                       DDS::DynamicData_ptr value);
     139             : 
     140             :   DDS::ReturnCode_t get_int32_values(DDS::Int32Seq& value,
     141             :                                      DDS::MemberId id);
     142             :   DDS::ReturnCode_t set_int32_values(DDS::MemberId id,
     143             :                                      const DDS::Int32Seq& value);
     144             : 
     145             :   DDS::ReturnCode_t get_uint32_values(DDS::UInt32Seq& value,
     146             :                                       DDS::MemberId id);
     147             :   DDS::ReturnCode_t set_uint32_values(DDS::MemberId id,
     148             :                                       const DDS::UInt32Seq& value);
     149             : 
     150             :   DDS::ReturnCode_t get_int8_values(DDS::Int8Seq& value,
     151             :                                     DDS::MemberId id);
     152             :   DDS::ReturnCode_t set_int8_values(DDS::MemberId id,
     153             :                                     const DDS::Int8Seq& value);
     154             : 
     155             :   DDS::ReturnCode_t get_uint8_values(DDS::UInt8Seq& value,
     156             :                                      DDS::MemberId id);
     157             :   DDS::ReturnCode_t set_uint8_values(DDS::MemberId id,
     158             :                                      const DDS::UInt8Seq& value);
     159             : 
     160             :   DDS::ReturnCode_t get_int16_values(DDS::Int16Seq& value,
     161             :                                      DDS::MemberId id);
     162             :   DDS::ReturnCode_t set_int16_values(DDS::MemberId id,
     163             :                                      const DDS::Int16Seq& value);
     164             : 
     165             :   DDS::ReturnCode_t get_uint16_values(DDS::UInt16Seq& value,
     166             :                                       DDS::MemberId id);
     167             :   DDS::ReturnCode_t set_uint16_values(DDS::MemberId id,
     168             :                                       const DDS::UInt16Seq& value);
     169             : 
     170             :   DDS::ReturnCode_t get_int64_values(DDS::Int64Seq& value,
     171             :                                      DDS::MemberId id);
     172             :   DDS::ReturnCode_t set_int64_values(DDS::MemberId id,
     173             :                                      const DDS::Int64Seq& value);
     174             : 
     175             :   DDS::ReturnCode_t get_uint64_values(DDS::UInt64Seq& value,
     176             :                                       DDS::MemberId id);
     177             :   DDS::ReturnCode_t set_uint64_values(DDS::MemberId id,
     178             :                                       const DDS::UInt64Seq& value);
     179             : 
     180             :   DDS::ReturnCode_t get_float32_values(DDS::Float32Seq& value,
     181             :                                        DDS::MemberId id);
     182             :   DDS::ReturnCode_t set_float32_values(DDS::MemberId id,
     183             :                                        const DDS::Float32Seq& value);
     184             : 
     185             :   DDS::ReturnCode_t get_float64_values(DDS::Float64Seq& value,
     186             :                                        DDS::MemberId id);
     187             :   DDS::ReturnCode_t set_float64_values(DDS::MemberId id,
     188             :                                        const DDS::Float64Seq& value);
     189             : 
     190             :   DDS::ReturnCode_t get_float128_values(DDS::Float128Seq& value,
     191             :                                         DDS::MemberId id);
     192             :   DDS::ReturnCode_t set_float128_values(DDS::MemberId id,
     193             :                                         const DDS::Float128Seq& value);
     194             : 
     195             :   DDS::ReturnCode_t get_char8_values(DDS::CharSeq& value,
     196             :                                      DDS::MemberId id);
     197             :   DDS::ReturnCode_t set_char8_values(DDS::MemberId id,
     198             :                                      const DDS::CharSeq& value);
     199             : 
     200             :   DDS::ReturnCode_t get_char16_values(DDS::WcharSeq& value,
     201             :                                       DDS::MemberId id);
     202             :   DDS::ReturnCode_t set_char16_values(DDS::MemberId id,
     203             :                                       const DDS::WcharSeq& value);
     204             : 
     205             :   DDS::ReturnCode_t get_byte_values(DDS::ByteSeq& value,
     206             :                                     DDS::MemberId id);
     207             :   DDS::ReturnCode_t set_byte_values(DDS::MemberId id,
     208             :                                     const DDS::ByteSeq& value);
     209             : 
     210             :   DDS::ReturnCode_t get_boolean_values(DDS::BooleanSeq& value,
     211             :                                        DDS::MemberId id);
     212             :   DDS::ReturnCode_t set_boolean_values(DDS::MemberId id,
     213             :                                        const DDS::BooleanSeq& value);
     214             : 
     215             :   DDS::ReturnCode_t get_string_values(DDS::StringSeq& value,
     216             :                                       DDS::MemberId id);
     217             :   DDS::ReturnCode_t set_string_values(DDS::MemberId id,
     218             :                                       const DDS::StringSeq& value);
     219             : 
     220             :   DDS::ReturnCode_t get_wstring_values(DDS::WstringSeq& value,
     221             :                                        DDS::MemberId id);
     222             :   DDS::ReturnCode_t set_wstring_values(DDS::MemberId id,
     223             :                                        const DDS::WstringSeq& value);
     224             : 
     225             : #ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
     226             :   DDS::ReturnCode_t get_simple_value(DCPS::Value& value, DDS::MemberId id);
     227             : #endif
     228             : 
     229             : private:
     230             : #ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
     231             :   DDS::ReturnCode_t get_simple_value_boolean(DCPS::Value& value, DDS::MemberId id) const;
     232             :   DDS::ReturnCode_t get_simple_value_char(DCPS::Value& value, DDS::MemberId id) const;
     233             :   template<typename ValueType>
     234             :   DDS::ReturnCode_t get_simple_value_primitive(DCPS::Value& value, DDS::MemberId id) const;
     235             :   DDS::ReturnCode_t get_simple_value_string(DCPS::Value& value, DDS::MemberId id) const;
     236             :   DDS::ReturnCode_t get_simple_value_enum(DCPS::Value& value, DDS::MemberId id) const;
     237             : #endif
     238             : 
     239             :   CORBA::ULong get_sequence_size() const;
     240             :   void erase_member(DDS::MemberId id);
     241             : 
     242             :   /// Group of functions to read a basic value represented by this DynamicData instance
     243             :   bool read_basic_value(ACE_OutputCDR::from_int8& value);
     244             :   bool read_basic_value(ACE_OutputCDR::from_uint8& value);
     245             :   bool read_basic_value(CORBA::Short& value);
     246             :   bool read_basic_value(CORBA::UShort& value);
     247             :   bool read_basic_value(CORBA::Long& value);
     248             :   bool read_basic_value(CORBA::ULong& value);
     249             :   bool read_basic_value(CORBA::LongLong& value);
     250             :   bool read_basic_value(CORBA::ULongLong& value);
     251             :   bool read_basic_value(CORBA::Float& value);
     252             :   bool read_basic_value(CORBA::Double& value);
     253             :   bool read_basic_value(CORBA::LongDouble& value);
     254             :   bool read_basic_value(ACE_OutputCDR::from_char& value);
     255             :   bool read_basic_value(ACE_OutputCDR::from_wchar& value);
     256             :   bool read_basic_value(ACE_OutputCDR::from_octet& value);
     257             :   bool read_basic_value(ACE_OutputCDR::from_boolean& value);
     258             :   bool read_basic_value(char*& value) const;
     259             : #ifdef DDS_HAS_WCHAR
     260             :   bool read_basic_value(CORBA::WChar*& value) const;
     261             : #endif
     262             : 
     263             :   void cast_to_enum_value(ACE_OutputCDR::from_int8& dst, CORBA::Long src) const;
     264             :   void cast_to_enum_value(CORBA::Short& dst, CORBA::Long src) const;
     265             :   void cast_to_enum_value(CORBA::Long& dst, CORBA::Long src) const;
     266             : 
     267             :   template<typename ValueType>
     268             :   void cast_to_enum_value(ValueType& dst, CORBA::Long src) const;
     269             : 
     270             :   /// Read a basic member from a containing type
     271             :   template<typename ValueType>
     272             :   bool read_basic_in_single_map(ValueType& value, DDS::MemberId id);
     273             : 
     274             :   template<typename ValueType>
     275             :   bool read_basic_in_complex_map(ValueType& value, DDS::MemberId id);
     276             : 
     277             :   template<typename ValueType>
     278             :   bool read_basic_member(ValueType& value, DDS::MemberId id);
     279             : 
     280             :   template<typename ValueType>
     281             :   bool get_value_from_self(ValueType& value, DDS::MemberId id);
     282             : 
     283             :   template<TypeKind ValueTypeKind, typename ValueType>
     284             :   bool get_value_from_enum(ValueType& value, DDS::MemberId id);
     285             : 
     286             :   template<TypeKind ValueTypeKind, typename ValueType>
     287             :   bool get_value_from_bitmask(ValueType& value, DDS::MemberId id);
     288             : 
     289             :   template<TypeKind ValueTypeKind, typename ValueType>
     290             :   bool get_value_from_struct(ValueType& value, DDS::MemberId id);
     291             : 
     292             :   template<TypeKind ValueTypeKind, typename ValueType>
     293             :   bool get_value_from_union(ValueType& value, DDS::MemberId id);
     294             : 
     295             :   template<TypeKind ValueTypeKind, typename ValueType>
     296             :   bool get_value_from_collection(ValueType& value, DDS::MemberId id);
     297             : 
     298             :   template<TypeKind CharKind, TypeKind StringKind, typename FromCharT, typename CharT>
     299             :   DDS::ReturnCode_t get_char_common(CharT& value, DDS::MemberId id);
     300             : 
     301             :   template<typename UIntType>
     302             :   bool get_boolean_from_bitmask(CORBA::ULong index, CORBA::Boolean& value);
     303             : 
     304             :   template<TypeKind MemberTypeKind, typename MemberType>
     305             :   bool set_value_to_struct(DDS::MemberId id, const MemberType& value);
     306             : 
     307             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_boolean& value) const;
     308             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_octet& value) const;
     309             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_char& value) const;
     310             : #ifdef DDS_HAS_WCHAR
     311             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_wchar& value) const;
     312             : #endif
     313             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_int8& value) const;
     314             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const ACE_OutputCDR::from_uint8& value) const;
     315             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::Short& value) const;
     316             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::UShort& value) const;
     317             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::Long& value) const;
     318             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::ULong& value) const;
     319             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::LongLong& value) const;
     320             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const CORBA::ULongLong& value) const;
     321             : 
     322             :   template<typename MemberType>
     323             :   bool cast_to_discriminator_value(CORBA::Long& disc_value, const MemberType& value) const;
     324             : 
     325             :   template<TypeKind MemberTypeKind, typename MemberType>
     326             :   bool set_value_to_union(DDS::MemberId id, const MemberType& value,
     327             :     TypeKind enum_or_bitmask = TK_NONE, LBound lower = 0, LBound upper = 0);
     328             : 
     329             :   template<TypeKind ElementTypeKind, typename ElementType>
     330             :   bool set_value_to_collection(DDS::MemberId id, const ElementType& value,
     331             :     TypeKind coll_tk, TypeKind enum_or_bitmask = TK_NONE, LBound lower = 0, LBound upper = 0);
     332             : 
     333             :   template<TypeKind ValueTypeKind, typename ValueType>
     334             :   DDS::ReturnCode_t set_single_value(DDS::MemberId id, const ValueType& value,
     335             :     TypeKind enum_or_bitmask = TK_NONE, LBound lower = 0, LBound upper = 0);
     336             : 
     337             :   template<TypeKind CharKind, TypeKind StringKind, typename FromCharT>
     338             :   DDS::ReturnCode_t set_char_common(DDS::MemberId id, const FromCharT& value);
     339             : 
     340             :   bool check_index_from_id(TypeKind tk, DDS::MemberId id, CORBA::ULong bound) const;
     341             :   static bool is_valid_discriminator_type(TypeKind tk);
     342             :   bool is_default_member_selected(CORBA::Long disc_val, DDS::MemberId default_id) const;
     343             :   bool read_discriminator(CORBA::Long& disc_val) const;
     344             :   DDS::MemberId find_selected_member() const;
     345             :   bool validate_discriminator(CORBA::Long disc_val, const DDS::MemberDescriptor_var& md) const;
     346             : 
     347             :   bool set_complex_to_struct(DDS::MemberId id, DDS::DynamicData_var value);
     348             :   bool set_complex_to_union(DDS::MemberId id, DDS::DynamicData_var value);
     349             :   bool set_complex_to_collection(DDS::MemberId id, DDS::DynamicData_var value, TypeKind tk);
     350             :   bool validate_member_id_collection(DDS::MemberId id, TypeKind collection_tk) const;
     351             : 
     352             :   DDS::ReturnCode_t clear_value_i(DDS::MemberId id, const DDS::DynamicType_var& member_type);
     353             : 
     354             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_int8& value);
     355             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_uint8& value);
     356             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_char& value);
     357             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_octet& value);
     358             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_boolean& value);
     359             : #ifdef DDS_HAS_WCHAR
     360             :   bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_wchar& value);
     361             : #endif
     362             :   template<typename SingleType>
     363             :   bool insert_single(DDS::MemberId id, const SingleType& value);
     364             : 
     365             :   bool insert_complex(DDS::MemberId id, const DDS::DynamicData_var& value);
     366             : 
     367             :   template<typename SequenceType>
     368             :   bool insert_sequence(DDS::MemberId id, const SequenceType& value);
     369             : 
     370             :   template<TypeKind ElementTypeKind>
     371             :   bool check_seqmem_in_struct_and_union(DDS::MemberId id, TypeKind enum_or_bitmask,
     372             :                                         LBound lower, LBound upper) const;
     373             :   template<TypeKind ElementTypeKind>
     374             :   bool check_seqmem_in_sequence_and_array(DDS::MemberId id, CORBA::ULong bound,
     375             :                                           TypeKind enum_or_bitmask, LBound lower, LBound upper) const;
     376             : 
     377             :   template<TypeKind ElementTypeKind, typename SequenceType>
     378             :   bool set_values_to_struct(DDS::MemberId id, const SequenceType& value,
     379             :                             TypeKind enum_or_bitmask, LBound lower, LBound upper);
     380             : 
     381             :   template<TypeKind ElementTypeKind, typename SequenceType>
     382             :   bool set_values_to_union(DDS::MemberId id, const SequenceType& value,
     383             :                            TypeKind enum_or_bitmask, LBound lower, LBound upper);
     384             : 
     385             :   template<TypeKind ElementTypeKind, typename SequenceType>
     386             :   bool set_values_to_sequence(DDS::MemberId id, const SequenceType& value,
     387             :                               TypeKind enum_or_bitmask, LBound lower, LBound upper);
     388             : 
     389             :   template<TypeKind ElementTypeKind, typename SequenceType>
     390             :   bool set_values_to_array(DDS::MemberId id, const SequenceType& value,
     391             :                            TypeKind enum_or_bitmask, LBound lower, LBound upper);
     392             : 
     393             :   template<TypeKind ElementTypeKind, typename SequenceType>
     394             :   DDS::ReturnCode_t set_sequence_values(DDS::MemberId id, const SequenceType& value,
     395             :                                         TypeKind enum_or_bitmask = TK_NONE,
     396             :                                         LBound lower = 0, LBound upper = 0);
     397             : 
     398             :   template<TypeKind ValueTypeKind, typename ValueType>
     399             :   DDS::ReturnCode_t get_single_value(ValueType& value, DDS::MemberId id);
     400             : 
     401             :   // Contain data for an instance of a basic type.
     402             :   struct SingleValue {
     403             :     SingleValue(CORBA::Long int32);
     404             :     SingleValue(CORBA::ULong uint32);
     405             :     SingleValue(ACE_OutputCDR::from_int8 from_int8);
     406             :     SingleValue(ACE_OutputCDR::from_uint8 from_uint8);
     407             :     SingleValue(CORBA::Short int16);
     408             :     SingleValue(CORBA::UShort uint16);
     409             :     SingleValue(CORBA::LongLong int64);
     410             :     SingleValue(CORBA::ULongLong uint64);
     411             :     SingleValue(CORBA::Float float32);
     412             :     SingleValue(CORBA::Double float64);
     413             :     SingleValue(CORBA::LongDouble float128);
     414             :     SingleValue(ACE_OutputCDR::from_char from_char);
     415             :     SingleValue(ACE_OutputCDR::from_octet from_octet);
     416             :     SingleValue(ACE_OutputCDR::from_boolean from_bool);
     417             :     SingleValue(const char* str);
     418             : #ifdef DDS_HAS_WCHAR
     419             :     SingleValue(ACE_OutputCDR::from_wchar from_wchar);
     420             :     SingleValue(const CORBA::WChar* wstr);
     421             : #endif
     422             :     SingleValue(const SingleValue& other);
     423             : 
     424             :     ~SingleValue();
     425             : 
     426             :     // Return a reference to the stored value. Mostly for serialization.
     427             :     template<typename T> const T& get() const;
     428             : 
     429             :     // Return a duplication of the stored string/wstring.
     430             :     // Used for the get_* interfaces of DynamicData.
     431             :     // Caller is responsible for release the returned string.
     432             :     char* get_string() const;
     433             :     CORBA::WChar* get_wstring() const;
     434             : 
     435             :     TypeKind kind_;
     436             :     // Used for types that need ACE_OutputCDR disambiguators.
     437             :     void* active_;
     438             :     union {
     439             :       CORBA::Long int32_;
     440             :       CORBA::ULong uint32_;
     441             :       unsigned char int8_[sizeof(ACE_OutputCDR::from_int8)];
     442             :       unsigned char uint8_[sizeof(ACE_OutputCDR::from_uint8)];
     443             :       CORBA::Short int16_;
     444             :       CORBA::UShort uint16_;
     445             :       CORBA::LongLong int64_;
     446             :       CORBA::ULongLong uint64_;
     447             :       CORBA::Float float32_;
     448             :       CORBA::Double float64_;
     449             :       CORBA::LongDouble float128_;
     450             :       unsigned char char8_[sizeof(ACE_OutputCDR::from_char)];
     451             :       unsigned char byte_[sizeof(ACE_OutputCDR::from_octet)];
     452             :       unsigned char boolean_[sizeof(ACE_OutputCDR::from_boolean)];
     453             :       const char* str_;
     454             : #ifdef DDS_HAS_WCHAR
     455             :       unsigned char char16_[sizeof(ACE_OutputCDR::from_wchar)];
     456             :       const CORBA::WChar* wstr_;
     457             : #endif
     458             :     };
     459             : 
     460             :   private:
     461             :     SingleValue& operator=(const SingleValue&); // = delete
     462             :   };
     463             : 
     464             :   struct SequenceValue {
     465             :     SequenceValue(const DDS::Int32Seq& int32_seq);
     466             :     SequenceValue(const DDS::UInt32Seq& uint32_seq);
     467             :     SequenceValue(const DDS::Int8Seq& int8_seq);
     468             :     SequenceValue(const DDS::UInt8Seq& uint8_seq);
     469             :     SequenceValue(const DDS::Int16Seq& int16_seq);
     470             :     SequenceValue(const DDS::UInt16Seq& uint16_seq);
     471             :     SequenceValue(const DDS::Int64Seq& int64_seq);
     472             :     SequenceValue(const DDS::UInt64Seq& uint64_seq);
     473             :     SequenceValue(const DDS::Float32Seq& float32_seq);
     474             :     SequenceValue(const DDS::Float64Seq& float64_seq);
     475             :     SequenceValue(const DDS::Float128Seq& float128_seq);
     476             :     SequenceValue(const DDS::CharSeq& char8_seq);
     477             :     SequenceValue(const DDS::ByteSeq& byte_seq);
     478             :     SequenceValue(const DDS::BooleanSeq& boolean_seq);
     479             :     SequenceValue(const DDS::StringSeq& str_seq);
     480             : #ifdef DDS_HAS_WCHAR
     481             :     SequenceValue(const DDS::WcharSeq& char16_seq);
     482             :     SequenceValue(const DDS::WstringSeq& wstr_seq);
     483             : #endif
     484             : 
     485             :     SequenceValue(const SequenceValue& rhs);
     486             :     ~SequenceValue();
     487             : 
     488             :     template<typename T> const T& get() const;
     489             : 
     490             :     TypeKind elem_kind_;
     491             :     void* active_;
     492             :     union {
     493             : #define SEQUENCE_VALUE_MEMBER(T, N) unsigned char N ## _[sizeof(T)]
     494             :       SEQUENCE_VALUE_MEMBER(DDS::Int32Seq, int32_seq);
     495             :       SEQUENCE_VALUE_MEMBER(DDS::UInt32Seq, uint32_seq);
     496             :       SEQUENCE_VALUE_MEMBER(DDS::Int8Seq, int8_seq);
     497             :       SEQUENCE_VALUE_MEMBER(DDS::UInt8Seq, uint8_seq);
     498             :       SEQUENCE_VALUE_MEMBER(DDS::Int16Seq, int16_seq);
     499             :       SEQUENCE_VALUE_MEMBER(DDS::UInt16Seq, uint16_seq);
     500             :       SEQUENCE_VALUE_MEMBER(DDS::Int64Seq, int64_seq);
     501             :       SEQUENCE_VALUE_MEMBER(DDS::UInt64Seq, uint64_seq);
     502             :       SEQUENCE_VALUE_MEMBER(DDS::Float32Seq, float32_seq);
     503             :       SEQUENCE_VALUE_MEMBER(DDS::Float64Seq, float64_seq);
     504             :       SEQUENCE_VALUE_MEMBER(DDS::Float128Seq, float128_seq);
     505             :       SEQUENCE_VALUE_MEMBER(DDS::CharSeq, char8_seq);
     506             :       SEQUENCE_VALUE_MEMBER(DDS::ByteSeq, byte_seq);
     507             :       SEQUENCE_VALUE_MEMBER(DDS::BooleanSeq, boolean_seq);
     508             :       SEQUENCE_VALUE_MEMBER(DDS::StringSeq, string_seq);
     509             : #ifdef DDS_HAS_WCHAR
     510             :       SEQUENCE_VALUE_MEMBER(DDS::WcharSeq, char16_seq);
     511             :       SEQUENCE_VALUE_MEMBER(DDS::WstringSeq, wstring_seq);
     512             : #endif
     513             : #undef SEQUENCE_VALUE_MEMBER
     514             :     };
     515             : 
     516             :   private:
     517             :     SequenceValue& operator=(const SequenceValue& rhs);
     518             :   };
     519             : 
     520             :   typedef OPENDDS_VECTOR(CORBA::ULong) IndexToIdMap;
     521             : 
     522             :   // Container for all data written to this DynamicData object.
     523             :   // At anytime, there can be at most 1 entry for any given MemberId in all maps.
     524             :   // That is, each member is stored in at most 1 map.
     525             :   struct DataContainer {
     526             :     typedef OPENDDS_MAP(DDS::MemberId, SingleValue)::const_iterator const_single_iterator;
     527             :     typedef OPENDDS_MAP(DDS::MemberId, SequenceValue)::const_iterator const_sequence_iterator;
     528             :     typedef OPENDDS_MAP(DDS::MemberId, DDS::DynamicData_var)::const_iterator const_complex_iterator;
     529             : 
     530         346 :     DataContainer(const DDS::DynamicType_var& type, const DynamicDataImpl* data)
     531         692 :       : type_(type)
     532         346 :       , type_desc_(data->type_desc_)
     533         346 :       , data_(data)
     534         346 :     {}
     535             : 
     536           0 :     DataContainer(const DataContainer& other, const DynamicDataImpl* data)
     537           0 :       : single_map_(other.single_map_)
     538           0 :       , sequence_map_(other.sequence_map_)
     539           0 :       , complex_map_(other.complex_map_)
     540           0 :       , type_(data->type_)
     541           0 :       , type_desc_(data->type_desc_)
     542           0 :       , data_(data)
     543           0 :     {}
     544             : 
     545             :     void clear();
     546             : 
     547             :     // Get the largest index of all elements in each map.
     548             :     // Call only for collection-like types (sequence, string, etc).
     549             :     // Must be called with a non-empty map.
     550             :     bool get_largest_single_index(CORBA::ULong& index) const;
     551             :     bool get_largest_sequence_index(CORBA::ULong& index) const;
     552             :     bool get_largest_complex_index(CORBA::ULong& index) const;
     553             : 
     554             :     // Get the largest index in a collection of a basic type (sequence, string, array).
     555             :     // This assumes there is at least 1 value of a basic type stored.
     556             :     bool get_largest_index_basic(CORBA::ULong& index) const;
     557             : 
     558             :     // Get the largest index in a collection of sequences of basic type
     559             :     // (each element of the collection is a sequence of a basic type).
     560             :     // Assuming at least 1 sequence is stored.
     561             :     bool get_largest_index_basic_sequence(CORBA::ULong& index) const;
     562             : 
     563             :     bool serialize_single_value(DCPS::Serializer& ser, const SingleValue& sv) const;
     564             : 
     565             :     template<typename PrimitiveType>
     566             :     bool serialize_primitive_value(DCPS::Serializer& ser, PrimitiveType default_value) const;
     567             :     bool serialized_size_enum(const DCPS::Encoding& encoding,
     568             :                               size_t& size, const DDS::DynamicType_var& enum_type) const;
     569             :     bool serialize_enum_default_value(DCPS::Serializer& ser,
     570             :                                       const DDS::DynamicType_var& enum_type) const;
     571             :     bool serialize_enum_value(DCPS::Serializer& ser) const;
     572             :     bool serialized_size_bitmask(const DCPS::Encoding& encoding,
     573             :                                  size_t& size, const DDS::DynamicType_var& bitmask_type) const;
     574             :     bool serialize_bitmask_default_value(DCPS::Serializer& ser,
     575             :                                          const DDS::DynamicType_var& bitmask_type) const;
     576             :     bool serialize_bitmask_value(DCPS::Serializer& ser) const;
     577             :     bool reconstruct_string_value(CORBA::Char* str) const;
     578             :     bool serialized_size_string(const DCPS::Encoding& encoding, size_t& size) const;
     579             :     bool serialize_string_value(DCPS::Serializer& ser) const;
     580             :     bool reconstruct_wstring_value(CORBA::WChar* wstr) const;
     581             :     bool serialized_size_wstring(const DCPS::Encoding& encoding, size_t& size) const;
     582             :     bool serialize_wstring_value(DCPS::Serializer& ser) const;
     583             :     void serialized_size_primitive_sequence(const DCPS::Encoding& encoding, size_t& size,
     584             :                                             TypeKind elem_tk, CORBA::ULong length) const;
     585             : 
     586             :     void set_default_basic_value(CORBA::Long& value) const;
     587             :     void set_default_basic_value(CORBA::ULong& value) const;
     588             :     void set_default_basic_value(ACE_OutputCDR::from_int8& value) const;
     589             :     void set_default_basic_value(ACE_OutputCDR::from_uint8& value) const;
     590             :     void set_default_basic_value(CORBA::Short& value) const;
     591             :     void set_default_basic_value(CORBA::UShort& value) const;
     592             :     void set_default_basic_value(CORBA::LongLong& value) const;
     593             :     void set_default_basic_value(CORBA::ULongLong& value) const;
     594             :     void set_default_basic_value(CORBA::Float& value) const;
     595             :     void set_default_basic_value(CORBA::Double& value) const;
     596             :     void set_default_basic_value(CORBA::LongDouble& value) const;
     597             :     void set_default_basic_value(ACE_OutputCDR::from_char& value) const;
     598             :     void set_default_basic_value(ACE_OutputCDR::from_octet& value) const;
     599             :     void set_default_basic_value(const char*& value) const;
     600             :     void set_default_basic_value(char*& value) const;
     601             :     void set_default_basic_value(ACE_OutputCDR::from_boolean& value) const;
     602             : #ifdef DDS_HAS_WCHAR
     603             :     void set_default_basic_value(ACE_OutputCDR::from_wchar& value) const;
     604             :     void set_default_basic_value(const CORBA::WChar*& value) const;
     605             :     void set_default_basic_value(CORBA::WChar*& value) const;
     606             : #endif
     607             : 
     608             :     bool set_default_enum_value(const DDS::DynamicType_var& dt, CORBA::Long& value) const;
     609             : 
     610             :     void set_default_bitmask_value(ACE_OutputCDR::from_uint8& value) const;
     611             :     void set_default_bitmask_value(CORBA::UShort& value) const;
     612             :     void set_default_bitmask_value(CORBA::ULong& value) const;
     613             :     void set_default_bitmask_value(CORBA::ULongLong& value) const;
     614             : 
     615             :     template<typename Type>
     616             :     void set_default_bitmask_value(Type& value) const;
     617             : 
     618             :     void set_default_primitive_values(DDS::Int8Seq& collection) const;
     619             :     void set_default_primitive_values(DDS::UInt8Seq& collection) const;
     620             :     void set_default_primitive_values(DDS::CharSeq& collection) const;
     621             :     void set_default_primitive_values(DDS::ByteSeq& collection) const;
     622             :     void set_default_primitive_values(DDS::BooleanSeq& collection) const;
     623             : #ifdef DDS_HAS_WCHAR
     624             :     void set_default_primitive_values(DDS::WcharSeq& collection) const;
     625             : #endif
     626             : 
     627             :     template<typename CollectionType>
     628             :     void set_default_primitive_values(CollectionType& collection) const;
     629             : 
     630             :     template<typename ElementType, typename CollectionType>
     631             :     bool set_primitive_values(CollectionType& collection, CORBA::ULong bound,
     632             :                               const ElementType& elem_tag) const;
     633             : 
     634             :     template<typename ElementType, typename CollectionType>
     635             :     bool reconstruct_primitive_collection(CollectionType& collection,
     636             :       CORBA::ULong size, CORBA::ULong bound, const ElementType& elem_tag) const;
     637             : 
     638             :     bool serialize_primitive_sequence(DCPS::Serializer& ser, TypeKind elem_tk,
     639             :                                       CORBA::ULong size, CORBA::ULong bound) const;
     640             : 
     641             :     void serialized_size_string_common(const DCPS::Encoding& encoding, size_t& size,
     642             :                                        const char* str) const;
     643             : #ifdef DDS_HAS_WCHAR
     644             :     void serialized_size_string_common(const DCPS::Encoding& encoding, size_t& size,
     645             :                                        const CORBA::WChar* wstr) const;
     646             : #endif
     647             :     void serialized_size_string_common(const DCPS::Encoding& encoding, size_t& size,
     648             :                                        const SingleValue& sv) const;
     649             : 
     650             :     template<typename StringType>
     651             :     bool serialized_size_generic_string_collection(const DCPS::Encoding& encoding, size_t& size,
     652             :                                                    const IndexToIdMap& index_to_id) const;
     653             :     template<typename StringType>
     654             :     bool serialized_size_generic_string_sequence(const DCPS::Encoding& encoding, size_t& size,
     655             :                                                  const IndexToIdMap& index_to_id) const;
     656             :     template<typename StringType>
     657             :     bool serialize_generic_string_collection(DCPS::Serializer& ser,
     658             :                                              const IndexToIdMap& index_to_id) const;
     659             :     template<typename StringType>
     660             :     bool serialize_generic_string_sequence(DCPS::Serializer& ser, CORBA::ULong length,
     661             :                                            CORBA::ULong bound) const;
     662             : 
     663             :     template<typename ElementType, typename CollectionType>
     664             :     bool set_default_enum_values(CollectionType& collection,
     665             :                                  const DDS::DynamicType_var& enum_type) const;
     666             : 
     667             :     template<typename ElementType, typename WrapElementType, typename CollectionType>
     668             :     bool reconstruct_enum_collection(CollectionType& collection, CORBA::ULong size,
     669             :       CORBA::ULong bound, const DDS::DynamicType_var& enum_type, const WrapElementType& elem_tag) const;
     670             : 
     671             :     void serialized_size_enum_sequence_as_int8s(const DCPS::Encoding& encoding, size_t& size,
     672             :                                                 CORBA::ULong length) const;
     673             :     void serialized_size_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     674             :                                        const DDS::Int8Seq& seq) const;
     675             :     bool serialize_enum_sequence_as_ints_i(DCPS::Serializer& ser, const DDS::Int8Seq& enumseq) const;
     676             :     bool serialize_enum_sequence_as_int8s(DCPS::Serializer& ser, CORBA::ULong size,
     677             :       CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const;
     678             :     void serialized_size_enum_sequence_as_int16s(const DCPS::Encoding& encoding, size_t& size,
     679             :                                                  CORBA::ULong length) const;
     680             :     void serialized_size_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     681             :                                        const DDS::Int16Seq& seq) const;
     682             :     bool serialize_enum_sequence_as_ints_i(DCPS::Serializer& ser, const DDS::Int16Seq& enumseq) const;
     683             :     bool serialize_enum_sequence_as_int16s(DCPS::Serializer& ser, CORBA::ULong size,
     684             :       CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const;
     685             :     void serialized_size_enum_sequence_as_int32s(const DCPS::Encoding& encoding, size_t& size,
     686             :                                                  CORBA::ULong length) const;
     687             :     void serialized_size_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     688             :                                        const DDS::Int32Seq& seq) const;
     689             :     bool serialize_enum_sequence_as_ints_i(DCPS::Serializer& ser, const DDS::Int32Seq& enumseq) const;
     690             :     bool serialize_enum_sequence_as_int32s(DCPS::Serializer& ser, CORBA::ULong size,
     691             :       CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const;
     692             : 
     693             :     void serialized_size_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     694             :                                        CORBA::ULong length, CORBA::ULong bitbound) const;
     695             :     bool serialize_enum_sequence(DCPS::Serializer& ser, CORBA::ULong size, CORBA::ULong bitbound,
     696             :                                  CORBA::ULong seqbound, const DDS::DynamicType_var& enum_type) const;
     697             : 
     698             :     template<typename CollectionType>
     699             :     void set_default_bitmask_values(CollectionType& col) const;
     700             : 
     701             :     template<typename WrapElementType, typename CollectionType>
     702             :     bool reconstruct_bitmask_collection(CollectionType& collection, CORBA::ULong size,
     703             :                                         CORBA::ULong bound, const WrapElementType& elem_tag) const;
     704             :     void serialized_size_bitmask_sequence_as_uint8s(const DCPS::Encoding& encoding,
     705             :                                                     size_t& size, CORBA::ULong length) const;
     706             :     void serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     707             :                                           const DDS::UInt8Seq& seq) const;
     708             :     bool serialize_bitmask_sequence_as_uints_i(DCPS::Serializer& ser,
     709             :                                                const DDS::UInt8Seq& bitmask_seq) const;
     710             :     bool serialize_bitmask_sequence_as_uint8s(DCPS::Serializer& ser, CORBA::ULong size,
     711             :                                               CORBA::ULong bound) const;
     712             :     void serialized_size_bitmask_sequence_as_uint16s(const DCPS::Encoding& encoding, size_t& size,
     713             :                                                      CORBA::ULong length) const;
     714             :     void serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     715             :                                           const DDS::UInt16Seq& seq) const;
     716             :     bool serialize_bitmask_sequence_as_uints_i(DCPS::Serializer& ser,
     717             :                                                const DDS::UInt16Seq& bitmask_seq) const;
     718             :     bool serialize_bitmask_sequence_as_uint16s(DCPS::Serializer& ser, CORBA::ULong size,
     719             :                                                CORBA::ULong bound) const;
     720             :     void serialized_size_bitmask_sequence_as_uint32s(const DCPS::Encoding& encoding, size_t& size,
     721             :                                                      CORBA::ULong length) const;
     722             :     void serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     723             :                                           const DDS::UInt32Seq& seq) const;
     724             :     bool serialize_bitmask_sequence_as_uints_i(DCPS::Serializer& ser,
     725             :                                                const DDS::UInt32Seq& bitmask_seq) const;
     726             :     bool serialize_bitmask_sequence_as_uint32s(DCPS::Serializer& ser, CORBA::ULong size,
     727             :                                                CORBA::ULong bound) const;
     728             :     void serialized_size_bitmask_sequence_as_uint64s(const DCPS::Encoding& encoding, size_t& size,
     729             :                                                      CORBA::ULong length) const;
     730             :     void serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     731             :                                           const DDS::UInt64Seq& seq) const;
     732             :     bool serialize_bitmask_sequence_as_uints_i(DCPS::Serializer& ser,
     733             :                                                const DDS::UInt64Seq& bitmask_seq) const;
     734             :     bool serialize_bitmask_sequence_as_uint64s(DCPS::Serializer& ser, CORBA::ULong size,
     735             :                                                CORBA::ULong bound) const;
     736             :     void serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     737             :                                           CORBA::ULong length, CORBA::ULong bitbound) const;
     738             :     bool serialize_bitmask_sequence(DCPS::Serializer& ser, CORBA::ULong size,
     739             :                                     CORBA::ULong bitbound, CORBA::ULong seqbound) const;
     740             : 
     741             :     bool serialized_size_sequence_value(const DCPS::Encoding& encoding, size_t& size,
     742             :                                         const SequenceValue& sv) const;
     743             :     bool serialize_sequence_value(DCPS::Serializer& ser, const SequenceValue& sv) const;
     744             :     bool get_index_to_id_map(IndexToIdMap& index_to_id, CORBA::ULong bound) const;
     745             :     bool serialized_size_complex_member_i(const DCPS::Encoding& encoding, size_t& size,
     746             :                                           DDS::MemberId id, DCPS::Sample::Extent ext) const;
     747             : 
     748             :     template<typename SequenceType>
     749             :     bool serialized_size_nested_basic_sequences(const DCPS::Encoding& encoding, size_t& size,
     750             :       const IndexToIdMap& index_to_id, SequenceType protoseq) const;
     751             : 
     752             :     template<typename SequenceType>
     753             :     bool serialized_size_nesting_basic_sequence(const DCPS::Encoding& encoding, size_t& size,
     754             :       const IndexToIdMap& index_to_id, SequenceType protoseq) const;
     755             : 
     756             :     bool serialize_complex_member_i(DCPS::Serializer& ser, DDS::MemberId id, DCPS::Sample::Extent ext) const;
     757             : 
     758             :     template<typename SequenceType>
     759             :     bool serialize_nested_basic_sequences(DCPS::Serializer& ser, const IndexToIdMap& index_to_id,
     760             :                                           SequenceType protoseq) const;
     761             : 
     762             :     template<typename SequenceType>
     763             :     bool serialize_nesting_basic_sequence_i(DCPS::Serializer& ser, CORBA::ULong size,
     764             :                                             CORBA::ULong bound, SequenceType protoseq) const;
     765             : 
     766             :     bool serialized_size_nesting_basic_sequence(const DCPS::Encoding& encoding, size_t& size,
     767             :       TypeKind nested_elem_tk, const IndexToIdMap& index_to_id) const;
     768             :     bool serialize_nesting_basic_sequence(DCPS::Serializer& ser, TypeKind nested_elem_tk,
     769             :                                           CORBA::ULong size, CORBA::ULong bound) const;
     770             :     bool serialized_size_nested_enum_sequences(const DCPS::Encoding& encoding, size_t& size,
     771             :                                                const IndexToIdMap& index_to_id) const;
     772             :     bool serialized_size_nesting_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     773             :                                                const IndexToIdMap& index_to_id) const;
     774             :     bool serialize_nested_enum_sequences(DCPS::Serializer& ser, const IndexToIdMap& index_to_id) const;
     775             :     bool serialize_nesting_enum_sequence(DCPS::Serializer& ser, CORBA::ULong size,
     776             :                                          CORBA::ULong bound) const;
     777             :     bool serialized_size_nested_bitmask_sequences(const DCPS::Encoding& encoding, size_t& size,
     778             :                                                   const IndexToIdMap& index_to_id) const;
     779             :     bool serialized_size_nesting_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     780             :                                                   const IndexToIdMap& index_to_id) const;
     781             :     bool serialize_nested_bitmask_sequences(DCPS::Serializer& ser,
     782             :                                             const IndexToIdMap& index_to_id) const;
     783             :     bool serialize_nesting_bitmask_sequence(DCPS::Serializer& ser, CORBA::ULong size,
     784             :                                             CORBA::ULong bound) const;
     785             :     bool serialized_size_complex_member(const DCPS::Encoding& encoding, size_t& size,
     786             :                                         DDS::MemberId id, const DDS::DynamicType_var& elem_type,
     787             :                                         DCPS::Sample::Extent ext) const;
     788             :     bool serialized_size_complex_sequence(const DCPS::Encoding& encoding, size_t& size,
     789             :       const IndexToIdMap& index_to_id, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const;
     790             :     bool serialize_complex_sequence_i(DCPS::Serializer& ser, const IndexToIdMap& index_to_id,
     791             :                                       const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const;
     792             :     bool serialize_complex_sequence(DCPS::Serializer& ser, CORBA::ULong size, CORBA::ULong bound,
     793             :                                     const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const;
     794             :     bool get_index_to_id_from_complex(IndexToIdMap& index_to_id, CORBA::ULong bound) const;
     795             :     bool serialized_size_sequence(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     796             :     bool serialize_sequence(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     797             : 
     798             :     // Serialize array
     799             :     void serialized_size_primitive_array(const DCPS::Encoding& encoding, size_t& size,
     800             :                                          TypeKind elem_tk, CORBA::ULong length) const;
     801             :     bool serialize_primitive_array(DCPS::Serializer& ser, TypeKind elem_tk, CORBA::ULong length) const;
     802             : 
     803             :     template<typename StringType>
     804             :     bool serialized_size_generic_string_array(const DCPS::Encoding& encoding, size_t& size,
     805             :                                               const IndexToIdMap& index_to_id) const;
     806             :     template<typename StringType>
     807             :     bool serialize_generic_string_array(DCPS::Serializer& ser, CORBA::ULong length) const;
     808             :     void serialized_size_enum_array_as_int8s(const DCPS::Encoding& encoding, size_t& size,
     809             :                                              CORBA::ULong length) const;
     810             :     bool serialize_enum_array_as_ints_i(DCPS::Serializer& ser, const DDS::Int8Seq& enumarr) const;
     811             :     bool serialize_enum_array_as_int8s(DCPS::Serializer& ser, CORBA::ULong length,
     812             :                                        const DDS::DynamicType_var& enum_type) const;
     813             :     void serialized_size_enum_array_as_int16s(const DCPS::Encoding& encoding, size_t& size,
     814             :                                               CORBA::ULong length) const;
     815             :     bool serialize_enum_array_as_ints_i(DCPS::Serializer& ser, const DDS::Int16Seq& enumarr) const;
     816             :     bool serialize_enum_array_as_int16s(DCPS::Serializer& ser, CORBA::ULong length,
     817             :                                         const DDS::DynamicType_var& enum_type) const;
     818             :     void serialized_size_enum_array_as_int32s(const DCPS::Encoding& encoding, size_t& size,
     819             :                                               CORBA::ULong length) const;
     820             :     bool serialize_enum_array_as_ints_i(DCPS::Serializer& ser, const DDS::Int32Seq& enumarr) const;
     821             :     bool serialize_enum_array_as_int32s(DCPS::Serializer& ser, CORBA::ULong length,
     822             :                                         const DDS::DynamicType_var& enum_type) const;
     823             :     void serialized_size_enum_array(const DCPS::Encoding& encoding, size_t& size,
     824             :                                     CORBA::ULong length, CORBA::ULong bitbound) const;
     825             :     bool serialize_enum_array(DCPS::Serializer& ser, CORBA::ULong bitbound, CORBA::ULong length,
     826             :                               const DDS::DynamicType_var& enum_type) const;
     827             : 
     828             :     void serialized_size_bitmask_array_as_uint8s(const DCPS::Encoding& encoding, size_t& size,
     829             :                                                  CORBA::ULong length) const;
     830             :     bool serialize_bitmask_array_as_uints_i(DCPS::Serializer& ser,
     831             :                                             const DDS::UInt8Seq& bitmask_arr) const;
     832             :     bool serialize_bitmask_array_as_uint8s(DCPS::Serializer& ser, CORBA::ULong length) const;
     833             :     void serialized_size_bitmask_array_as_uint16s(const DCPS::Encoding& encoding, size_t& size,
     834             :                                                   CORBA::ULong length) const;
     835             :     bool serialize_bitmask_array_as_uints_i(DCPS::Serializer& ser,
     836             :                                             const DDS::UInt16Seq& bitmask_arr) const;
     837             :     bool serialize_bitmask_array_as_uint16s(DCPS::Serializer& ser, CORBA::ULong length) const;
     838             :     void serialized_size_bitmask_array_as_uint32s(const DCPS::Encoding& encoding, size_t& size,
     839             :                                                   CORBA::ULong length) const;
     840             :     bool serialize_bitmask_array_as_uints_i(DCPS::Serializer& ser,
     841             :                                             const DDS::UInt32Seq& bitmask_arr) const;
     842             :     bool serialize_bitmask_array_as_uint32s(DCPS::Serializer& ser, CORBA::ULong length) const;
     843             :     void serialized_size_bitmask_array_as_uint64s(const DCPS::Encoding& encoding, size_t& size,
     844             :                                                   CORBA::ULong length) const;
     845             :     bool serialize_bitmask_array_as_uints_i(DCPS::Serializer& ser,
     846             :                                             const DDS::UInt64Seq& bitmask_arr) const;
     847             :     bool serialize_bitmask_array_as_uint64s(DCPS::Serializer& ser, CORBA::ULong length) const;
     848             :     void serialized_size_bitmask_array(const DCPS::Encoding& encoding, size_t& size,
     849             :                                        CORBA::ULong length, CORBA::ULong bitbound) const;
     850             :     bool serialize_bitmask_array(DCPS::Serializer& ser, CORBA::ULong bitbound,
     851             :                                  CORBA::ULong length) const;
     852             : 
     853             :     template<typename SequenceType>
     854             :     bool serialized_size_nesting_basic_array(const DCPS::Encoding& encoding, size_t& size,
     855             :       const IndexToIdMap& index_to_id, SequenceType protoseq) const;
     856             : 
     857             :     template<typename SequenceType>
     858             :     bool serialize_nesting_basic_array_i(DCPS::Serializer& ser, CORBA::ULong length,
     859             :                                          SequenceType protoseq) const;
     860             :     bool serialized_size_nesting_basic_array(const DCPS::Encoding& encoding, size_t& size,
     861             :       TypeKind nested_elem_tk, const IndexToIdMap& index_to_id) const;
     862             :     bool serialize_nesting_basic_array(DCPS::Serializer& ser, TypeKind nested_elem_tk,
     863             :                                        CORBA::ULong length) const;
     864             :     bool serialized_size_nesting_enum_array(const DCPS::Encoding& encoding, size_t& size,
     865             :                                             const IndexToIdMap& index_to_id) const;
     866             :     bool serialize_nesting_enum_array(DCPS::Serializer& ser, CORBA::ULong length) const;
     867             :     bool serialized_size_nesting_bitmask_array(const DCPS::Encoding& encoding, size_t& size,
     868             :                                                const IndexToIdMap& index_to_id) const;
     869             :     bool serialize_nesting_bitmask_array(DCPS::Serializer& ser, CORBA::ULong length) const;
     870             :     bool serialized_size_complex_array(const DCPS::Encoding& encoding, size_t& size,
     871             :       const IndexToIdMap& index_to_id, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const;
     872             :     bool serialize_complex_array(DCPS::Serializer& ser, CORBA::ULong length,
     873             :                                  const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const;
     874             :     bool serialized_size_array(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     875             :     bool serialize_array(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     876             : 
     877             :     bool serialized_size_primitive_member(const DCPS::Encoding& encoding, size_t& size,
     878             :                                           TypeKind member_tk) const;
     879             : 
     880             :     bool serialized_size_basic_member_default_value(const DCPS::Encoding& encoding, size_t& size,
     881             :                                                     TypeKind member_tk) const;
     882             :     bool serialized_size_basic_member(const DCPS::Encoding& encoding, size_t& size,
     883             :                                       TypeKind member_tk, const_single_iterator it) const;
     884             :     bool serialize_basic_member_default_value(DCPS::Serializer& ser, TypeKind member_tk) const;
     885             : 
     886             :     bool serialized_size_single_aggregated_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     887             :       const_single_iterator it, const DDS::DynamicType_var& member_type, bool optional,
     888             :       DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const;
     889             :     bool serialize_single_aggregated_member_xcdr2(DCPS::Serializer& ser, const_single_iterator it,
     890             :       const DDS::DynamicType_var& member_type, bool optional, bool must_understand,
     891             :       DDS::ExtensibilityKind extensibility) const;
     892             :     bool serialized_size_complex_aggregated_member_xcdr2_default(const DCPS::Encoding& encoding,
     893             :       size_t& size, const DDS::DynamicType_var& member_type, bool optional,
     894             :       DDS::ExtensibilityKind extensibility, size_t& mutable_running_total, DCPS::Sample::Extent ext) const;
     895             :     bool serialize_complex_aggregated_member_xcdr2_default(DCPS::Serializer& ser, DDS::MemberId id,
     896             :       const DDS::DynamicType_var& member_type, bool optional, bool must_understand,
     897             :       DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const;
     898             :     bool serialized_size_complex_aggregated_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     899             :       const_complex_iterator it, bool optional, DDS::ExtensibilityKind extensibility,
     900             :       size_t& mutable_running_total, DCPS::Sample::Extent ext) const;
     901             :     bool serialize_complex_aggregated_member_xcdr2(DCPS::Serializer& ser, const_complex_iterator it,
     902             :       bool optional, bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const;
     903             :     bool serialized_size_basic_struct_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     904             :       DDS::MemberId id, const DDS::DynamicType_var& member_type, bool optional,
     905             :       DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const;
     906             :     bool serialize_basic_struct_member_xcdr2(DCPS::Serializer& ser, DDS::MemberId id,
     907             :       const DDS::DynamicType_var& member_type, bool optional, bool must_understand,
     908             :       DDS::ExtensibilityKind extensibility) const;
     909             : 
     910             :     void serialized_size_sequence_member_default_value(const DCPS::Encoding& encoding,
     911             :                                                        size_t& size, TypeKind elem_tk) const;
     912             :     bool serialize_sequence_member_default_value(DCPS::Serializer& ser, TypeKind elem_tk) const;
     913             : 
     914             :     bool serialized_size_basic_sequence(const DCPS::Encoding& encoding, size_t& size,
     915             :                                         const_sequence_iterator it) const;
     916             :     bool serialize_basic_sequence(DCPS::Serializer& ser, const_sequence_iterator it) const;
     917             :     bool serialized_size_enum_sequence(const DCPS::Encoding& encoding, size_t& size,
     918             :                                        const_sequence_iterator it) const;
     919             :     bool serialize_enum_sequence(DCPS::Serializer& ser, const_sequence_iterator it) const;
     920             :     bool serialized_size_bitmask_sequence(const DCPS::Encoding& encoding, size_t& size,
     921             :                                           const_sequence_iterator it) const;
     922             :     bool serialize_bitmask_sequence(DCPS::Serializer& ser, const_sequence_iterator it) const;
     923             :     void serialized_size_sequence_aggregated_member_xcdr2(const DCPS::Encoding& encoding,
     924             :       size_t& size, const_sequence_iterator it, TypeKind elem_tk, bool optional,
     925             :       DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const;
     926             :     bool serialize_sequence_aggregated_member_xcdr2(DCPS::Serializer& ser, const_sequence_iterator it,
     927             :       TypeKind elem_tk, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility) const;
     928             :     bool serialized_size_sequence_struct_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     929             :       DDS::MemberId id, TypeKind elem_tk, bool optional,
     930             :       DDS::ExtensibilityKind extensibility, size_t& mutable_running_total, DCPS::Sample::Extent ext) const;
     931             :     bool serialize_sequence_struct_member_xcdr2(DCPS::Serializer& ser, DDS::MemberId id,
     932             :       TypeKind elem_tk, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const;
     933             :     bool serialized_size_structure_xcdr2(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     934             :     bool serialize_structure_xcdr2(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     935             :     bool serialized_size_structure_xcdr1(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     936             :     bool serialize_structure_xcdr1(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     937             :     bool serialized_size_structure(const DCPS::Encoding& encoding, size_t& size,
     938             :                                    DCPS::Sample::Extent ext) const;
     939             :     bool serialize_structure(DCPS::Serializer& ser, DCPS::Sample::Extent) const;
     940             : 
     941             :     bool set_default_discriminator_value(CORBA::Long& value,
     942             :                                          const DDS::DynamicType_var& disc_type) const;
     943             :     bool get_discriminator_value(CORBA::Long& value, const_single_iterator single_it,
     944             :       const_complex_iterator complex_it, const DDS::DynamicType_var& disc_type) const;
     945             :     bool serialized_size_discriminator_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     946             :       const DDS::DynamicType_var& disc_type, DDS::ExtensibilityKind extensibility,
     947             :       size_t& mutable_running_total) const;
     948             :     bool serialize_discriminator_member_xcdr2(DCPS::Serializer& ser, CORBA::Long value,
     949             :       const DDS::DynamicType_var& disc_type, DDS::ExtensibilityKind extensibility) const;
     950             :     bool serialized_size_selected_member_xcdr2(const DCPS::Encoding& encoding, size_t& size,
     951             :       DDS::MemberId selected_id, DDS::ExtensibilityKind extensibility,
     952             :       size_t& mutable_running_total) const;
     953             :     bool serialize_selected_member_xcdr2(DCPS::Serializer& ser, DDS::MemberId selected_id,
     954             :                                          DDS::ExtensibilityKind extensibility) const;
     955             :     bool serialized_size_union_xcdr2(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     956             :     bool serialize_union_xcdr2(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     957             :     bool serialized_size_union_xcdr1(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
     958             :     bool serialize_union_xcdr1(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     959             :     bool serialized_size_union(const DCPS::Encoding& encoding, size_t& size,
     960             :                                DCPS::Sample::Extent ext) const;
     961             :     bool serialize_union(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
     962             : 
     963             :     // Internal data
     964             :     OPENDDS_MAP(DDS::MemberId, SingleValue) single_map_;
     965             :     OPENDDS_MAP(DDS::MemberId, SequenceValue) sequence_map_;
     966             :     OPENDDS_MAP(DDS::MemberId, DDS::DynamicData_var) complex_map_;
     967             : 
     968             :     const DDS::DynamicType_var& type_;
     969             :     const DDS::TypeDescriptor_var& type_desc_;
     970             :     const DynamicDataImpl* data_;
     971             :   };
     972             : 
     973             :   // Copy a value of a basic member from single map to a DynamicData object.
     974             :   bool move_single_to_complex(const DataContainer::const_single_iterator& it,
     975             :                               DynamicDataImpl* data);
     976             :   bool move_single_to_complex_i(const DataContainer::const_single_iterator& it,
     977             :                                 DynamicDataImpl* data, const TypeKind treat_as);
     978             : 
     979             :   template<typename SequenceType>
     980             :   void move_sequence_helper(const DataContainer::const_sequence_iterator& it,
     981             :                             DynamicDataImpl* data);
     982             : 
     983             :   // Copy values of a basic sequence member from sequence map to a DynamicData object.
     984             :   bool move_sequence_to_complex(const DataContainer::const_sequence_iterator& it,
     985             :                                 DynamicDataImpl* data);
     986             : 
     987             :   // Indicate whether the value of a member is found in the complex map or
     988             :   // one of the other two maps or not found from any map in the container.
     989             :   enum FoundStatus { FOUND_IN_COMPLEX_MAP, FOUND_IN_NON_COMPLEX_MAP, NOT_FOUND };
     990             :   bool get_complex_from_aggregated(DDS::DynamicData_var& value, DDS::MemberId id,
     991             :                                    FoundStatus& found_status);
     992             : 
     993             :   bool get_complex_from_struct(DDS::DynamicData_ptr& value, DDS::MemberId id);
     994             :   bool write_discriminator_helper(CORBA::Long value, TypeKind treat_as);
     995             :   bool write_discriminator(CORBA::Long value);
     996             :   bool get_complex_from_union(DDS::DynamicData_ptr& value, DDS::MemberId id);
     997             :   bool get_complex_from_collection(DDS::DynamicData_ptr& value, DDS::MemberId id);
     998             : 
     999             :   bool read_discriminator(CORBA::Long& disc_val, const DDS::DynamicType_var& disc_type,
    1000             :                           DataContainer::const_single_iterator it) const;
    1001             : 
    1002             :   // Add a single value for any valid discriminator value that selects the given member
    1003             :   bool insert_valid_discriminator(DDS::MemberDescriptor* memberSelected);
    1004             :   bool insert_discriminator(ACE_CDR::Long value);
    1005             :   void clear_container();
    1006             : 
    1007             :   DataContainer container_;
    1008             : 
    1009             :   bool serialized_size_i(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const;
    1010             :   bool serialize_i(DCPS::Serializer& ser, DCPS::Sample::Extent ext) const;
    1011             : 
    1012             :   friend OpenDDS_Dcps_Export
    1013             :   bool DCPS::serialized_size(const DCPS::Encoding& encoding, size_t& size, const DynamicDataImpl& data);
    1014             : 
    1015             :   friend OpenDDS_Dcps_Export
    1016             :   bool DCPS::operator<<(DCPS::Serializer& ser, const DynamicDataImpl& data);
    1017             : 
    1018             :   friend OpenDDS_Dcps_Export
    1019             :   bool DCPS::serialized_size(const DCPS::Encoding& encoding, size_t& size, const DCPS::KeyOnly<const DynamicDataImpl>& data);
    1020             : 
    1021             :   friend OpenDDS_Dcps_Export
    1022             :   bool DCPS::operator<<(DCPS::Serializer& ser, const DCPS::KeyOnly<const DynamicDataImpl>& data);
    1023             : };
    1024             : 
    1025             : } // namespace XTypes
    1026             : } // namespace OpenDDS
    1027             : 
    1028             : OPENDDS_END_VERSIONED_NAMESPACE_DECL
    1029             : 
    1030             : #endif // OPENDDS_SAFETY_PROFILE
    1031             : 
    1032             : #endif // OPENDDS_DCPS_XTYPES_DYNAMIC_DATA_IMPL_H

Generated by: LCOV version 1.16