OpenDDS  Snapshot(2023/04/07-19:43)
Public Types | Public Member Functions | Static Public Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::Encoding Class Reference

#include <Serializer.h>

Public Types

enum  Kind { KIND_XCDR1, KIND_XCDR2, KIND_UNALIGNED_CDR }
 
enum  Alignment { ALIGN_NONE = 0, ALIGN_CDR = 8, ALIGN_XCDR2 = 4, ALIGN_MAX = ALIGN_CDR }
 
enum  XcdrVersion { XCDR_VERSION_NONE, XCDR_VERSION_1, XCDR_VERSION_2 }
 

Public Member Functions

 Encoding ()
 Encoding with KIND_XCDR1 and ENDIAN_NATIVE. More...
 
 Encoding (Kind kind, Endianness endianness=ENDIAN_NATIVE)
 
 Encoding (Kind kind, bool swap_bytes)
 
Kind kind () const
 
void kind (Kind value)
 
Endianness endianness () const
 
void endianness (Endianness value)
 
Alignment alignment () const
 
void alignment (Alignment value)
 
size_t max_align () const
 Return the maximum alignment dictated by the alignment policy. More...
 
void align (size_t &value, size_t by=(std::numeric_limits< size_t >::max)()) const
 Align "value" to "by" and according to the stream's alignment. More...
 
XcdrVersion xcdr_version () const
 
void xcdr_version (XcdrVersion value)
 
String to_string () const
 
bool zero_init_padding () const
 
void zero_init_padding (bool value)
 
bool skip_sequence_dheader () const
 
void skip_sequence_dheader (bool value)
 

Static Public Member Functions

static String kind_to_string (Kind value)
 

Private Attributes

Kind kind_
 
Endianness endianness_
 
Alignment alignment_
 
bool zero_init_padding_
 
bool skip_sequence_dheader_
 
XcdrVersion xcdr_version_
 
bool is_encapsulated () const
 
static bool is_encapsulated (Kind kind)
 

Detailed Description

Represents the serialization rules. Used to construct a Serializer and to pass to functions that are used without a Serializer like serialized_size() and max_serialized_size()

Definition at line 115 of file Serializer.h.

Member Enumeration Documentation

◆ Alignment

Enumerator
ALIGN_NONE 

No Alignment Needed.

ALIGN_CDR 

Align for CDR and XCDR1.

ALIGN_XCDR2 

Align for XCDR2.

ALIGN_MAX 

Maximum alignment that could be used.

Definition at line 139 of file Serializer.h.

139  {
140  ALIGN_NONE = 0, ///< No Alignment Needed
141  ALIGN_CDR = 8, ///< Align for CDR and XCDR1
142  ALIGN_XCDR2 = 4, ///< Align for XCDR2
143  ALIGN_MAX = ALIGN_CDR ///< Maximum alignment that could be used
144  };
Align for CDR and XCDR1.
Definition: Serializer.h:141
Maximum alignment that could be used.
Definition: Serializer.h:143

◆ Kind

Kinds are the overall algorithm for serialization. A Kind value along with other details like alignment and endianness comprise an Encoding.

Enumerator
KIND_XCDR1 

Extensible CDR version 1 from XTypes. This represents standard non-XTypes CDR if the type is final.

KIND_XCDR2 

Extensible CDR version 2 from XTypes.

KIND_UNALIGNED_CDR 

This is the classic encoding of OpenDDS used when there is no RTPS transport being used. It has no padding bytes and no XCDR behavior.

Definition at line 122 of file Serializer.h.

122  {
123  /**
124  * Extensible CDR version 1 from XTypes.
125  * This represents standard non-XTypes CDR if the type is final.
126  */
127  KIND_XCDR1,
128  /**
129  * Extensible CDR version 2 from XTypes.
130  */
131  KIND_XCDR2,
132  /**
133  * This is the classic encoding of OpenDDS used when there is no RTPS
134  * transport being used. It has no padding bytes and no XCDR behavior.
135  */
137  };

◆ XcdrVersion

XCDR version derived from the Encoding kind.

Enumerator
XCDR_VERSION_NONE 
XCDR_VERSION_1 
XCDR_VERSION_2 

Definition at line 149 of file Serializer.h.

Constructor & Destructor Documentation

◆ Encoding() [1/3]

OpenDDS::DCPS::Encoding::Encoding ( )

Encoding with KIND_XCDR1 and ENDIAN_NATIVE.

Definition at line 77 of file Serializer.cpp.

References kind(), and KIND_XCDR1.

◆ Encoding() [2/3]

OpenDDS::DCPS::Encoding::Encoding ( Kind  kind,
Endianness  endianness = ENDIAN_NATIVE 
)
explicit

Definition at line 84 of file Serializer.cpp.

References kind().

86  , skip_sequence_dheader_(false)
87 {
88  kind(k);
89 }
Endianness endianness() const
Definition: Serializer.inl:64

◆ Encoding() [3/3]

OpenDDS::DCPS::Encoding::Encoding ( Kind  kind,
bool  swap_bytes 
)

Definition at line 91 of file Serializer.cpp.

References kind().

Member Function Documentation

◆ align()

ACE_INLINE void OpenDDS::DCPS::Encoding::align ( size_t &  value,
size_t  by = (std::numeric_limits<size_t>::max)() 
) const

Align "value" to "by" and according to the stream's alignment.

Definition at line 118 of file Serializer.inl.

References ACE_INLINE, OpenDDS::DCPS::align(), and max_align().

Referenced by marshal_generator::gen_enum(), OpenDDS::DCPS::primitive_serialized_size(), OpenDDS::DCPS::primitive_serialized_size_ulong(), OpenDDS::DCPS::primitive_serialized_size_wchar(), OpenDDS::DCPS::serialized_size_list_end_parameter_id(), OpenDDS::DCPS::serialized_size_parameter_id(), and OpenDDS::DCPS::RtpsUdpDataLink::submsgs_to_msgblock().

119 {
120  const size_t max_alignment = max_align();
121  if (max_alignment) {
122  DCPS::align(value, (std::min)(max_alignment, by));
123  }
124 }
const LogLevel::Value value
Definition: debug.cpp:61
OpenDDS_Dcps_Export void align(size_t &value, size_t by)
Align "value" by "by" if it&#39;s not already.
Definition: Serializer.inl:23
size_t max_align() const
Return the maximum alignment dictated by the alignment policy.
Definition: Serializer.inl:112

◆ alignment() [1/2]

ACE_INLINE Encoding::Alignment OpenDDS::DCPS::Encoding::alignment ( ) const

◆ alignment() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::alignment ( Alignment  value)

Definition at line 82 of file Serializer.inl.

References ACE_INLINE, alignment_, and value.

83 {
84  alignment_ = value;
85 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ endianness() [1/2]

ACE_INLINE Endianness OpenDDS::DCPS::Encoding::endianness ( ) const

◆ endianness() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::endianness ( Endianness  value)

Definition at line 70 of file Serializer.inl.

References ACE_INLINE, endianness_, and value.

71 {
73 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ is_encapsulated() [1/2]

ACE_INLINE bool OpenDDS::DCPS::Encoding::is_encapsulated ( Kind  kind)
static

Returns true if the encoding kind is excepted to have a header for RTPS serialized data payloads.

Definition at line 139 of file Serializer.inl.

References ACE_ERROR, ACE_INLINE, ACE_TEXT(), KIND_UNALIGNED_CDR, KIND_XCDR1, KIND_XCDR2, and LM_ERROR.

Referenced by OpenDDS::DCPS::FilterEvaluator::SerializedForEval::lookup().

140 {
141  switch (kind) {
142  case KIND_XCDR1:
143  case KIND_XCDR2:
144  return true;
145  case KIND_UNALIGNED_CDR:
146  return false;
147  default:
148  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Encoding::is_encapsulated: ")
149  ACE_TEXT("Invalid Argument: %u\n"), kind));
150  return false;
151  }
152 }
#define ACE_ERROR(X)
ACE_TEXT("TCP_Factory")

◆ is_encapsulated() [2/2]

ACE_INLINE bool OpenDDS::DCPS::Encoding::is_encapsulated ( ) const

Returns true if the encoding kind is excepted to have a header for RTPS serialized data payloads.

Definition at line 155 of file Serializer.inl.

References ACE_INLINE, and kind_.

156 {
157  return is_encapsulated(kind_);
158 }
bool is_encapsulated() const
Definition: Serializer.inl:155

◆ kind() [1/2]

ACE_INLINE Encoding::Kind OpenDDS::DCPS::Encoding::kind ( void  ) const

◆ kind() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::kind ( Kind  value)

Definition at line 35 of file Serializer.inl.

References ACE_ERROR, ACE_INLINE, ACE_TEXT(), ALIGN_CDR, ALIGN_NONE, ALIGN_XCDR2, alignment(), kind_, KIND_UNALIGNED_CDR, KIND_XCDR1, KIND_XCDR2, LM_ERROR, value, xcdr_version(), XCDR_VERSION_1, XCDR_VERSION_2, XCDR_VERSION_NONE, and zero_init_padding().

36 {
37  zero_init_padding(true);
38 
39  switch (value) {
40  case KIND_XCDR1:
43  break;
44 
45  case KIND_XCDR2:
48  break;
49 
50  case KIND_UNALIGNED_CDR:
53  break;
54 
55  default:
56  ACE_ERROR((LM_ERROR,
57  ACE_TEXT("(%P|%t) ERROR: Encoding::kind: Invalid Argument: %u\n"), value));
58  }
59 
60  kind_ = value;
61 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
Align for CDR and XCDR1.
Definition: Serializer.h:141
XcdrVersion xcdr_version() const
Definition: Serializer.inl:127
bool zero_init_padding() const
Definition: Serializer.inl:88
ACE_TEXT("TCP_Factory")
Alignment alignment() const
Definition: Serializer.inl:76

◆ kind_to_string()

String OpenDDS::DCPS::Encoding::kind_to_string ( Kind  value)
static

Definition at line 326 of file Serializer.cpp.

References OpenDDS::DCPS::to_dds_string().

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::dds_demarshal(), OpenDDS::DCPS::EncapsulationHeader::from_encoding(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::lookup_instance(), OpenDDS::DCPS::DataReaderImpl::setup_deserialization(), OpenDDS::DCPS::DataWriterImpl::setup_serialization(), and to_string().

327 {
328  switch (value) {
329  case KIND_XCDR1:
330  return "CDR/XCDR1";
331  case KIND_XCDR2:
332  return "XCDR2";
333  case KIND_UNALIGNED_CDR:
334  return "Unaligned CDR";
335  default:
336  return "Unknown: " + to_dds_string(static_cast<unsigned>(value), true);
337  }
338 }
const LogLevel::Value value
Definition: debug.cpp:61
String to_dds_string(unsigned short to_convert)

◆ max_align()

ACE_INLINE size_t OpenDDS::DCPS::Encoding::max_align ( ) const

Return the maximum alignment dictated by the alignment policy.

Definition at line 112 of file Serializer.inl.

References ACE_INLINE, and alignment_.

Referenced by align(), OpenDDS::DCPS::Serializer::align_cont_r(), OpenDDS::DCPS::Serializer::align_cont_w(), OpenDDS::DCPS::Serializer::align_r(), OpenDDS::DCPS::Serializer::align_w(), OpenDDS::DCPS::Serializer::reset_alignment(), and OpenDDS::DCPS::Serializer::skip().

113 {
114  return static_cast<size_t>(alignment_);
115 }

◆ skip_sequence_dheader() [1/2]

ACE_INLINE bool OpenDDS::DCPS::Encoding::skip_sequence_dheader ( ) const

Should the XCDR2 sequence DHEADER be skipped? This is not spec compliant – used for compatibility with earlier OpenDDS versions that had a bug. Only used for XTypes::TypeObject and related structs.

Definition at line 100 of file Serializer.inl.

References ACE_INLINE, and skip_sequence_dheader_.

Referenced by OpenDDS::DCPS::TypeSupportImpl::add_types(), OpenDDS::DCPS::serialized_size(), OpenDDS::DCPS::TypeSupportImpl::to_type_info_i(), and typeobject_generator::use_old_typeobject_encoding().

101 {
102  return skip_sequence_dheader_;
103 }

◆ skip_sequence_dheader() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::skip_sequence_dheader ( bool  value)

Should the XCDR2 sequence DHEADER be skipped? This is not spec compliant – used for compatibility with earlier OpenDDS versions that had a bug. Only used for XTypes::TypeObject and related structs.

Definition at line 106 of file Serializer.inl.

References ACE_INLINE, skip_sequence_dheader_, and value.

107 {
109 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ to_string()

String OpenDDS::DCPS::Encoding::to_string ( void  ) const

Definition at line 340 of file Serializer.cpp.

References OpenDDS::DCPS::Serializer::ALIGN_PAD, OpenDDS::DCPS::endianness_to_string(), OpenDDS::DCPS::EncapsulationHeader::kind_, and kind_to_string().

341 {
342  String rv = Encoding::kind_to_string(kind_) + ", " +
344  if (!zero_init_padding_) {
345  rv += ", non-initialized padding";
346  }
347  return rv;
348 }
static String kind_to_string(Kind value)
Definition: Serializer.cpp:326
std::string String
String endianness_to_string(Endianness endianness)
Definition: Serializer.cpp:57

◆ xcdr_version() [1/2]

ACE_INLINE Encoding::XcdrVersion OpenDDS::DCPS::Encoding::xcdr_version ( ) const

Definition at line 127 of file Serializer.inl.

References ACE_INLINE, and xcdr_version_.

Referenced by OpenDDS::XTypes::DynamicDataXcdrReadImpl::DynamicDataXcdrReadImpl(), kind(), OpenDDS::DCPS::Serializer::read_delimiter(), OpenDDS::DCPS::Serializer::read_parameter_id(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_bitmask_array_as_uints_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_bitmask_sequence_as_uints_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_complex_array(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_complex_sequence(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_enum_array_as_ints_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_enum_sequence_as_ints_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_generic_string_array(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_generic_string_sequence(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nested_bitmask_sequences(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nested_enum_sequences(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_basic_array_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_basic_sequence_i(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_bitmask_array(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_bitmask_sequence(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_enum_array(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_nesting_enum_sequence(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_sequence_member_default_value(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_structure(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialize_union(), OpenDDS::DCPS::serialized_size_delimiter(), OpenDDS::DCPS::serialized_size_list_end_parameter_id(), OpenDDS::DCPS::serialized_size_parameter_id(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialized_size_structure(), OpenDDS::XTypes::DynamicDataImpl::DataContainer::serialized_size_union(), OpenDDS::DCPS::Serializer::skip_delimiter(), OpenDDS::DCPS::Serializer::write_delimiter(), OpenDDS::DCPS::Serializer::write_list_end_parameter_id(), and OpenDDS::DCPS::Serializer::write_parameter_id().

128 {
129  return xcdr_version_;
130 }
XcdrVersion xcdr_version_
Definition: Serializer.h:218

◆ xcdr_version() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::xcdr_version ( XcdrVersion  value)

Definition at line 133 of file Serializer.inl.

References ACE_INLINE, value, and xcdr_version_.

134 {
136 }
const LogLevel::Value value
Definition: debug.cpp:61
XcdrVersion xcdr_version_
Definition: Serializer.h:218

◆ zero_init_padding() [1/2]

ACE_INLINE bool OpenDDS::DCPS::Encoding::zero_init_padding ( ) const

Should the padding bytes being inserted into the stream be zero initialized?

Definition at line 88 of file Serializer.inl.

References ACE_INLINE, and zero_init_padding_.

Referenced by OpenDDS::DCPS::Serializer::align_w(), and kind().

89 {
90  return zero_init_padding_;
91 }

◆ zero_init_padding() [2/2]

ACE_INLINE void OpenDDS::DCPS::Encoding::zero_init_padding ( bool  value)

Should the padding bytes being inserted into the stream be zero initialized?

Definition at line 94 of file Serializer.inl.

References ACE_INLINE, value, and zero_init_padding_.

95 {
97 }
const LogLevel::Value value
Definition: debug.cpp:61

Member Data Documentation

◆ alignment_

Alignment OpenDDS::DCPS::Encoding::alignment_
private

Definition at line 215 of file Serializer.h.

Referenced by alignment(), and max_align().

◆ endianness_

Endianness OpenDDS::DCPS::Encoding::endianness_
private

Definition at line 214 of file Serializer.h.

Referenced by endianness().

◆ kind_

Kind OpenDDS::DCPS::Encoding::kind_
private

◆ skip_sequence_dheader_

bool OpenDDS::DCPS::Encoding::skip_sequence_dheader_
private

Definition at line 217 of file Serializer.h.

Referenced by skip_sequence_dheader().

◆ xcdr_version_

XcdrVersion OpenDDS::DCPS::Encoding::xcdr_version_
private

Definition at line 218 of file Serializer.h.

Referenced by xcdr_version().

◆ zero_init_padding_

bool OpenDDS::DCPS::Encoding::zero_init_padding_
private

Definition at line 216 of file Serializer.h.

Referenced by zero_init_padding().


The documentation for this class was generated from the following files: