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"
17namespace rti {
namespace flat {
40 dheader_position_(NULL),
41 emheader_position_(NULL)
47 unsigned char *initial_buffer,
49 bool initialize_members) :
51 dheader_position_(NULL),
52 emheader_position_(NULL)
54 dheader_position_ = stream().serialize_dheader();
55 if (dheader_position_ == NULL) {
56 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(invalidate());
67 void set_encapsulation_impl(RTIXCdrEncapsulationId encapsulation_id)
70 RTI_FLAT_CHECK_PRECONDITION(!
is_nested(),
return);
72 char *current_position = (
char *) owned_stream_.current_position();
75 RTI_FLAT_CHECK_PRECONDITION(
76 current_position == dheader_position_ + RTI_XCDR_DHEADER_SIZE,
79 owned_stream_.skip_back(
80 RTI_XCDR_DHEADER_SIZE + RTI_XCDR_ENCAPSULATION_HEADER_SIZE);
82 if (!RTIXCdrFlatSample_initializeEncapsulationAndStream(
83 (
char *) owned_stream_.buffer(),
84 &owned_stream_.c_stream(),
86 owned_stream_.total_size())) {
87 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return);
90 stream().serialize_dheader();
95#if defined(RTI_FLAT_DATA_CXX11_RVALUE_REFERENCES)
100 if (
this == &other) {
104 finish_untyped_impl();
108 dheader_position_ = other.dheader_position_;
109 emheader_position_ = other.emheader_position_;
116 struct UntypedAggregationBuilderMoveProxy : AbstractBuilderMoveProxy {
117 char * dheader_position_;
118 char * emheader_position_;
121 operator UntypedAggregationBuilderMoveProxy ()
throw()
123 UntypedAggregationBuilderMoveProxy other;
129 void move_from(UntypedAggregationBuilderMoveProxy& other)
131 AbstractBuilder::move_from(other);
132 dheader_position_ = other.dheader_position_;
133 emheader_position_ = other.emheader_position_;
136 void move_to(UntypedAggregationBuilderMoveProxy& other)
138 AbstractBuilder::move_to(other);
139 other.dheader_position_ = dheader_position_;
140 other.emheader_position_ = emheader_position_;
149 finish_untyped_impl();
152 template <
typename T>
153 bool add_primitive_member(member_id_t
id, T value)
155 RTI_FLAT_BUILDER_CHECK_VALID(
return false);
157 rti::xcdr::Stream::Memento stream_memento(stream());
159 if (!begin_emheader(
id, detail::primitive_lc_code<T>::value)) {
160 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
164 if (!stream().serialize_no_align(value)) {
165 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
168 stream_memento.discard();
172 template <
typename OffsetType>
173 OffsetType add_member(member_id_t
id)
175 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
178 rti::xcdr::Stream::Memento stream_memento(stream());
179 return add_member<OffsetType>(
id, stream_memento);
182 template <
typename OffsetType>
183 OffsetType add_member(
185 rti::xcdr::Stream::Memento& stream_memento)
191 detail::is_fixed_type_w_dheader<OffsetType>::value() ? 5 : 4)) {
195 OffsetType result = AbstractBuilder::add_element<OffsetType>();
198 stream_memento.discard();
202 template <
typename NestedBuilder>
203 NestedBuilder build_member(member_id_t
id)
205 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
208 rti::xcdr::Stream::Memento stream_memento(stream());
209 return build_member<NestedBuilder>(
id, stream_memento);
212 template <
typename NestedBuilder>
213 NestedBuilder build_member(
215 rti::xcdr::Stream::Memento& stream_memento)
217 if (!begin_emheader(
id, detail::lc_code<NestedBuilder>::value())) {
218 return NestedBuilder();
221 return AbstractBuilder::build_element_no_align<NestedBuilder>(
225 unsigned char* finish_sample_impl()
227 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
228 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
229 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
231 if (!stream().finish_dheader(dheader_position_)) {
232 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return NULL);
235 unsigned char *return_sample = stream().buffer();
238 return return_sample;
242 void finish_untyped_impl()
245 stream().finish_dheader(dheader_position_);
246 AbstractBuilder::finish_untyped_impl();
250 template <
typename OffsetType>
251 OffsetType finish_impl()
253 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
254 RTI_FLAT_BUILDER_CHECK_CAN_FINISH(
return OffsetType());
256 stream().finish_dheader(dheader_position_);
257 return AbstractBuilder::finish_impl<OffsetType>();
262 unsigned char * discard_sample_impl()
264 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
265 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
266 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
268 unsigned char *buffer = this->buffer();
281 AbstractBuilder::finish_member();
286 bool begin_emheader(member_id_t
id, RTIXCdrUnsignedLong lc)
288 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return false);
290 if (!stream().serialize_emheader(emheader_position_,
id, lc)) {
291 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
297 void finish_emheader()
299 if (emheader_position_ != NULL) {
300 stream().finish_emheader(emheader_position_);
301 emheader_position_ = NULL;
309 dheader_position_(NULL),
310 emheader_position_(NULL)
312 dheader_position_ = stream().serialize_dheader();
313 if (dheader_position_ == NULL) {
314 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(invalidate());
319 char * dheader_position_;
320 char * emheader_position_;
334template <
typename Discriminator>
343 unsigned char *initial_buffer,
345 bool initialize_members) :
350 template <
typename T>
351 bool add_primitive_member(member_id_t
id, Discriminator disc, T value)
353 RTI_FLAT_BUILDER_CHECK_VALID(
return false);
357 move_to_discriminator();
358 rti::xcdr::Stream::Memento stream_memento(stream());
360 if (!add_discriminator(disc)) {
364 if (!AggregationBuilder::add_primitive_member(
id, value)) {
368 stream_memento.discard();
372 template <
typename OffsetType>
373 OffsetType add_member(member_id_t
id, Discriminator disc)
375 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
377 move_to_discriminator();
378 rti::xcdr::Stream::Memento stream_memento(stream());
379 if (!add_discriminator(disc)) {
380 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return OffsetType());
383 return AggregationBuilder::add_member<OffsetType>(
id, stream_memento);
386 template <
typename NestedBuilder>
387 NestedBuilder build_member(member_id_t
id, Discriminator disc)
389 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
391 move_to_discriminator();
392 rti::xcdr::Stream::Memento stream_memento(stream());
393 add_discriminator(disc);
395 return AggregationBuilder::build_member<NestedBuilder>(
id, stream_memento);
405 void move_to_discriminator()
407 stream().current_position(begin_position() + RTI_XCDR_DHEADER_SIZE);
410 bool add_discriminator(Discriminator disc)
412 return AggregationBuilder::add_primitive_member(0, disc);
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:37
Base class of builders for user-defined mutable unions.
Definition: AggregationBuilders.hpp:335
The RTI namespace.
Definition: AggregationBuilders.hpp:17