13#ifndef RTI_XCDR_STREAM_HPP_
14#define RTI_XCDR_STREAM_HPP_
16#include "xcdr/xcdr_stream.h"
18namespace rti {
namespace xcdr {
21#define RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_BODY(\
25 static void serialize_fast(RTIXCdrStream *stream, const TYPE* v)\
27 RTIXCdrStream_ ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
29 static void deserialize_fast(RTIXCdrStream *stream, TYPE* v)\
31 RTIXCdrStream_de ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
33 static bool serialize(RTIXCdrStream *stream, const TYPE* v)\
35 return RTIXCdrStream_ ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v, RTI_XCDR_TRUE);\
37 static bool deserialize(RTIXCdrStream *stream, TYPE* v)\
39 return RTIXCdrStream_de ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v, RTI_XCDR_TRUE);\
42#define RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
47struct primitive_type_traits<TYPE> {\
48RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_BODY(TYPE, CDR_TYPE, SERIALIZE_MACRO)\
51#define RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_W_ALIGNMENT_PARAM(\
57struct primitive_type_traits<TYPE> {\
58 static void serialize_fast(RTIXCdrStream *stream, const TYPE* v)\
60 RTIXCdrStream_ ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
62 static void deserialize_fast(RTIXCdrStream *stream, TYPE* v)\
64 RTIXCdrStream_de ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
66 static bool serialize(RTIXCdrStream *stream, const TYPE* v)\
68 return RTIXCdrStream_ ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v, RTI_XCDR_TRUE, ALIGNMENT);\
70 static bool deserialize(RTIXCdrStream *stream, TYPE* v)\
72 return RTIXCdrStream_de ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v, RTI_XCDR_TRUE, ALIGNMENT);\
76#define RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_NO_ALIGN_PARAM(\
81struct primitive_type_traits<TYPE> {\
82 static void serialize_fast(RTIXCdrStream *stream, const TYPE* v)\
84 RTIXCdrStream_ ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
86 static void deserialize_fast(RTIXCdrStream *stream, TYPE* v)\
88 RTIXCdrStream_de ## SERIALIZE_MACRO ## ByteFast(stream, (CDR_TYPE *) v);\
90 static bool serialize(RTIXCdrStream *stream, const TYPE* v)\
92 return RTIXCdrStream_ ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v);\
94 static bool deserialize(RTIXCdrStream *stream, TYPE* v)\
96 return RTIXCdrStream_de ## SERIALIZE_MACRO ## Byte(stream, (CDR_TYPE *) v);\
103struct primitive_type_traits {
104 RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_BODY(T, RTIXCdr4Byte, serialize4)
107RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_NO_ALIGN_PARAM(\
108 char, RTIXCdr1Byte, serialize1);
119#if !defined(RTI_AVOID_FIXED_WIDTH_INTEGERS)
120RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_NO_ALIGN_PARAM(\
121 uint8_t, RTIXCdr1Byte, serialize1);
123RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
124 int16_t, RTIXCdr2Byte, serialize2);
125RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
126 uint16_t, RTIXCdr2Byte, serialize2);
128RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
129 int32_t, RTIXCdr4Byte, serialize4);
130RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
131 uint32_t, RTIXCdr4Byte, serialize4);
133typedef uint32_t length_t;
135RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_NO_ALIGN_PARAM(\
136 unsigned char, RTIXCdr1Byte, serialize1);
138RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
139 short, RTIXCdr2Byte, serialize2);
140RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
141 unsigned short, RTIXCdr2Byte, serialize2);
145typedef unsigned int length_t;
148RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS(\
149 float, RTIXCdr4Byte, serialize4);
151RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_W_ALIGNMENT_PARAM(\
154RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_W_ALIGNMENT_PARAM(\
156RTI_XCDR_SPECIALIZE_PRIMITIVE_TYPE_TRAITS_W_ALIGNMENT_PARAM(\
157 double, RTIXCdr8Byte, serialize8, 4);
163void serialize_fast(RTIXCdrStream& stream,
const T& value)
165 primitive_type_traits<T>::serialize_fast(&stream, &value);
169void deserialize_fast(RTIXCdrStream& stream, T& value)
171 primitive_type_traits<T>::deserialize_fast(&stream, &value);
178 RTIXCdrStream_init(&stream_);
179 RTIXCdrStream_set(&stream_, NULL, 0);
181 stream_._tmpRelativeBuffer = NULL;
182 stream_._needByteSwap = 0;
183 stream_._endian = stream_._nativeEndian;
184 stream_._encapsulationKind = 0;
185 stream_._encapsulationOptions = 0;
188 explicit Stream(
const RTIXCdrStream& c_stream)
195 Stream(
const Stream& other)
197 stream_ = other.stream_;
203 unsigned char *buffer,
207 RTIXCdrFlatData_initializeStream(
214 Stream& operator=(
const Stream& other)
216 stream_ = other.stream_;
220 bool skip(length_t size)
222 if (!check_size(size)) {
225 RTIXCdrStream_increaseCurrentPosition(&stream_, size);
229 void skip_fast(length_t size)
231 RTIXCdrStream_increaseCurrentPosition(&stream_, size);
234 void skip_back(length_t bytes)
236 RTIXCdrStream_increaseCurrentPosition(
238 -
static_cast<int>(bytes));
241 unsigned char * buffer()
243 return reinterpret_cast<unsigned char*
>(stream_._buffer);
246 const unsigned char * buffer()
const
248 return reinterpret_cast<unsigned char*
>(stream_._buffer);
251 unsigned char * current_position()
253 return reinterpret_cast<unsigned char*
>(
254 RTIXCdrStream_getCurrentPosition(&stream_));
257 void current_position(
unsigned char * pos)
259 RTIXCdrStream_setCurrentPosition(
261 reinterpret_cast<char*
>(pos));
264 length_t used_size()
const
266 return static_cast<length_t
>(
267 RTIXCdrStream_getCurrentPosition(&stream_) - stream_._buffer);
270 length_t remaining_size()
const
272 return total_size() - used_size();
275 length_t total_size()
const
277 return stream_._bufferLength;
280 bool needs_byte_swap()
const
282 return stream_._needByteSwap == RTI_XCDR_TRUE;
285 template <
typename T>
286 bool serialize(T value)
288 return primitive_type_traits<T>::serialize(&stream_, &value);
291 template <
typename T>
292 void serialize_fast(T value)
294 primitive_type_traits<T>::serialize_fast(&stream_, &value);
297 template <
typename T>
298 bool serialize_no_align(T value)
300 if (!check_size(
sizeof(T))) {
303 primitive_type_traits<T>::serialize_fast(&stream_, &value);
307 template <
typename T>
311 primitive_type_traits<T>::deserialize_fast(&stream_, &value);
315 void serialize_fast(
const void *array, length_t bytes)
317 RTIXCdrStream_serializeNByteFast(&stream_, array, bytes);
320 char * serialize_dheader()
322 return RTIXCdrStream_serializeDHeader(&stream_);
325 bool finish_dheader(
char *dheader_position)
327 return RTIXCdrStream_serializeDHeaderLength(&stream_, dheader_position)
331 bool serialize_emheader(
333 RTIXCdrUnsignedLong parameter_id,
334 RTIXCdrUnsignedLong lc,
335 bool must_understand =
false)
337 RTIXCdrBoolean failure = 0;
338 position = RTIXCdrStream_serializeV2ParameterHeader(
342 must_understand ? RTI_XCDR_TRUE : RTI_XCDR_FALSE,
345 return failure == RTI_XCDR_FALSE;
348 void finish_emheader(
char * emheader_position)
350 RTIXCdrStream_finishV2ParameterHeader(&stream_, emheader_position);
353 bool align(
unsigned int alignment)
355 return RTIXCdrStream_align(&stream_, (RTIXCdrAlignment) alignment)
359 bool check_size(length_t size)
const
361 bool result = RTIXCdrStream_checkSize(&stream_, size) == RTI_XCDR_TRUE;
365 bool need_byte_swap()
const
367 return stream_._needByteSwap != 0;
370 RTIXCdrStream& c_stream()
386 explicit Memento(Stream& stream) :
388 original_position_(stream.current_position()),
389 relative_buffer_(stream.c_stream()._relativeBuffer)
402 if (original_position_ != NULL) {
403 stream_.current_position(original_position_);
404 stream_.c_stream()._relativeBuffer = relative_buffer_;
409 unsigned char * discard()
411 unsigned char *pos = original_position_;
412 original_position_ = NULL;
418 unsigned char *original_position_;
419 char *relative_buffer_;
424 RTIXCdrStream stream_;
RTICdrLongLong DDS_LongLong
Defines an extra-long integer data type, equivalent to IDL/CDR long long.
Definition: common.ifc:254
RTICdrUnsignedLongLong DDS_UnsignedLongLong
Defines an unsigned extra-long data type, equivalent to IDL/CDR unsigned long long.
Definition: common.ifc:259
The RTI namespace.
Definition: AggregationBuilders.hpp:17