11#ifndef RTI_DDS_FLAT_AGGREGATIONBUILDERS_HPP_
12#define RTI_DDS_FLAT_AGGREGATIONBUILDERS_HPP_
14#include "rti/flat/BuilderHelper.hpp"
15#include "rti/flat/Builder.hpp"
16#include "xcdr/xcdr_interpreter.h"
18namespace rti {
namespace flat {
40 MemberParams() : key(
false), discriminator(
false), must_understand(
false)
56 static bool xcdr2_compliant(
57 const RTIXCdrXTypesComplianceMask check_mask,
58 const bool reload_mask)
60 static bool g_compliance_mask_set =
false;
61 static RTIXCdrXTypesComplianceMask g_compliance_mask = 0;
67 if (reload_mask || !g_compliance_mask_set) {
69 RTIXCdrInterpreter_getGlobalXtypeComplianceMask();
70 g_compliance_mask_set =
true;
73 return (g_compliance_mask & check_mask);
86 bool has_must_understand_bit()
const
88 return must_understand
90 RTI_XCDR_XTYPES_MUST_UNDERSTAND_IN_KEY_AND_DISCRIMINATOR_BIT,
92 && (key || discriminator));
117 dheader_position_(NULL),
118 emheader_position_(NULL)
124 unsigned char *initial_buffer,
126 bool initialize_members) :
128 dheader_position_(NULL),
129 emheader_position_(NULL)
131 dheader_position_ = stream().serialize_dheader();
132 if (dheader_position_ == NULL) {
133 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(invalidate());
144 void set_encapsulation_impl(RTIXCdrEncapsulationId encapsulation_id)
147 RTI_FLAT_CHECK_PRECONDITION(!
is_nested(),
return);
149 char *current_position = (
char *) owned_stream_.current_position();
152 RTI_FLAT_CHECK_PRECONDITION(
153 current_position == dheader_position_ + RTI_XCDR_DHEADER_SIZE,
156 owned_stream_.skip_back(
157 RTI_XCDR_DHEADER_SIZE + RTI_XCDR_ENCAPSULATION_HEADER_SIZE);
159 if (!RTIXCdrFlatSample_initializeEncapsulationAndStream(
160 (
char *) owned_stream_.buffer(),
161 &owned_stream_.c_stream(),
163 owned_stream_.total_size())) {
164 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return);
167 stream().serialize_dheader();
172#if defined(RTI_FLAT_DATA_CXX11_RVALUE_REFERENCES)
177 if (
this == &other) {
181 finish_untyped_impl();
185 dheader_position_ = other.dheader_position_;
186 emheader_position_ = other.emheader_position_;
193 struct UntypedAggregationBuilderMoveProxy : AbstractBuilderMoveProxy {
194 char * dheader_position_;
195 char * emheader_position_;
198 operator UntypedAggregationBuilderMoveProxy ()
throw()
200 UntypedAggregationBuilderMoveProxy other;
206 void move_from(UntypedAggregationBuilderMoveProxy& other)
208 AbstractBuilder::move_from(other);
209 dheader_position_ = other.dheader_position_;
210 emheader_position_ = other.emheader_position_;
213 void move_to(UntypedAggregationBuilderMoveProxy& other)
215 AbstractBuilder::move_to(other);
216 other.dheader_position_ = dheader_position_;
217 other.emheader_position_ = emheader_position_;
226 finish_untyped_impl();
229 template <
typename T>
230 bool add_primitive_member(
233 const MemberParams& params)
235 RTI_FLAT_BUILDER_CHECK_VALID(
return false);
237 rti::xcdr::Stream::Memento stream_memento(stream());
239 if (!begin_emheader(
id, detail::primitive_lc_code<T>::value, params)) {
240 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
244 if (!stream().serialize_no_align(value)) {
245 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
248 stream_memento.discard();
252 template <
typename T>
253 bool add_primitive_member(member_id_t
id, T value)
255 static const MemberParams default_params;
256 return add_primitive_member(
id, value, default_params);
259 template <
typename OffsetType>
260 OffsetType add_member(member_id_t
id,
const MemberParams& params)
262 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
265 rti::xcdr::Stream::Memento stream_memento(stream());
266 return add_member<OffsetType>(
id, stream_memento, params);
269 template <
typename OffsetType>
270 OffsetType add_member(member_id_t
id)
272 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
275 rti::xcdr::Stream::Memento stream_memento(stream());
276 static const MemberParams default_params;
277 return add_member<OffsetType>(
id, stream_memento, default_params);
280 template <
typename OffsetType>
281 OffsetType add_member(
283 rti::xcdr::Stream::Memento& stream_memento)
285 static const MemberParams default_params;
286 return add_member<OffsetType>(
id, stream_memento, default_params);
289 template <
typename OffsetType>
290 OffsetType add_member(
292 rti::xcdr::Stream::Memento& stream_memento,
293 const MemberParams& params)
299 detail::is_fixed_type_w_dheader<OffsetType>::value() ? 5
305 OffsetType result = AbstractBuilder::add_element<OffsetType>();
308 stream_memento.discard();
312 template <
typename NestedBuilder>
313 NestedBuilder build_member(member_id_t
id,
const MemberParams& params)
315 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
318 rti::xcdr::Stream::Memento stream_memento(stream());
319 return build_member<NestedBuilder>(
id, stream_memento, params);
322 template <
typename NestedBuilder>
323 NestedBuilder build_member(member_id_t
id)
325 static const MemberParams default_params;
326 return build_member<NestedBuilder>(
id, default_params);
329 template <
typename NestedBuilder>
330 NestedBuilder build_member(
332 rti::xcdr::Stream::Memento& stream_memento)
334 static const MemberParams default_params;
335 return build_member<NestedBuilder>(
id, stream_memento, default_params);
338 template <
typename NestedBuilder>
339 NestedBuilder build_member(
341 rti::xcdr::Stream::Memento& stream_memento,
342 const MemberParams& params)
346 static_cast<RTIXCdrUnsignedLong
>(
347 detail::lc_code<NestedBuilder>::value()),
349 return NestedBuilder();
352 return AbstractBuilder::build_element_no_align<NestedBuilder>(
356 unsigned char* finish_sample_impl()
358 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
359 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
360 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
362 if (!stream().finish_dheader(dheader_position_)) {
363 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return NULL);
366 unsigned char *return_sample = stream().buffer();
369 return return_sample;
373 void finish_untyped_impl()
376 stream().finish_dheader(dheader_position_);
377 AbstractBuilder::finish_untyped_impl();
381 template <
typename OffsetType>
382 OffsetType finish_impl()
384 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
385 RTI_FLAT_BUILDER_CHECK_CAN_FINISH(
return OffsetType());
387 stream().finish_dheader(dheader_position_);
388 return AbstractBuilder::finish_impl<OffsetType>();
393 unsigned char * discard_sample_impl()
395 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
396 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
397 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
399 unsigned char *buffer = this->buffer();
412 AbstractBuilder::finish_member();
418 RTIXCdrUnsignedLong lc,
419 const MemberParams& params)
421 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return false);
423 if (!stream().serialize_emheader(
427 params.has_must_understand_bit())) {
428 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
434 void finish_emheader()
436 if (emheader_position_ != NULL) {
437 stream().finish_emheader(emheader_position_);
438 emheader_position_ = NULL;
446 dheader_position_(NULL),
447 emheader_position_(NULL)
449 dheader_position_ = stream().serialize_dheader();
450 if (dheader_position_ == NULL) {
451 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(invalidate());
456 char * dheader_position_;
457 char * emheader_position_;
471template <
typename Discriminator>
480 unsigned char *initial_buffer,
482 bool initialize_members) :
487 template <
typename T>
488 bool add_primitive_member(member_id_t
id, Discriminator disc, T value)
490 RTI_FLAT_BUILDER_CHECK_VALID(
return false);
494 move_to_discriminator();
495 rti::xcdr::Stream::Memento stream_memento(stream());
497 if (!add_discriminator(disc)) {
501 if (!AggregationBuilder::add_primitive_member(
id, value)) {
505 stream_memento.discard();
509 template <
typename OffsetType>
510 OffsetType add_member(member_id_t
id, Discriminator disc)
512 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
514 move_to_discriminator();
515 rti::xcdr::Stream::Memento stream_memento(stream());
516 if (!add_discriminator(disc)) {
517 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return OffsetType());
520 return AggregationBuilder::add_member<OffsetType>(
id, stream_memento);
523 template <
typename NestedBuilder>
524 NestedBuilder build_member(member_id_t
id, Discriminator disc)
526 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
528 move_to_discriminator();
529 rti::xcdr::Stream::Memento stream_memento(stream());
530 add_discriminator(disc);
532 return AggregationBuilder::build_member<NestedBuilder>(
id, stream_memento);
542 void move_to_discriminator()
544 stream().current_position(begin_position() + RTI_XCDR_DHEADER_SIZE);
547 bool add_discriminator(Discriminator disc)
550 params.discriminator =
true;
551 return AggregationBuilder::add_primitive_member(0, disc, params);
Base class of all Builders.
Definition: Builder.hpp:512
bool is_valid() const
Whether this Builder is valid.
Definition: Builder.hpp:899
bool is_nested() const
Returns whether this is a member Builder.
Definition: Builder.hpp:882
Base class of struct and union builders.
Definition: AggregationBuilders.hpp:114
Base class of builders for user-defined mutable unions.
Definition: AggregationBuilders.hpp:472
The RTI namespace.
Definition: AggregationBuilders.hpp:18