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)
219 (RTIXCdrUnsignedLong)
220 detail::lc_code<NestedBuilder>::value())) {
221 return NestedBuilder();
224 return AbstractBuilder::build_element_no_align<NestedBuilder>(
228 unsigned char* finish_sample_impl()
230 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
231 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
232 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
234 if (!stream().finish_dheader(dheader_position_)) {
235 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return NULL);
238 unsigned char *return_sample = stream().buffer();
241 return return_sample;
245 void finish_untyped_impl()
248 stream().finish_dheader(dheader_position_);
249 AbstractBuilder::finish_untyped_impl();
253 template <
typename OffsetType>
254 OffsetType finish_impl()
256 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
257 RTI_FLAT_BUILDER_CHECK_CAN_FINISH(
return OffsetType());
259 stream().finish_dheader(dheader_position_);
260 return AbstractBuilder::finish_impl<OffsetType>();
265 unsigned char * discard_sample_impl()
267 RTI_FLAT_BUILDER_CHECK_VALID(
return NULL);
268 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NULL);
269 RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(
return NULL);
271 unsigned char *buffer = this->buffer();
284 AbstractBuilder::finish_member();
289 bool begin_emheader(member_id_t
id, RTIXCdrUnsignedLong lc)
291 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return false);
293 if (!stream().serialize_emheader(emheader_position_,
id, lc)) {
294 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return false);
300 void finish_emheader()
302 if (emheader_position_ != NULL) {
303 stream().finish_emheader(emheader_position_);
304 emheader_position_ = NULL;
312 dheader_position_(NULL),
313 emheader_position_(NULL)
315 dheader_position_ = stream().serialize_dheader();
316 if (dheader_position_ == NULL) {
317 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(invalidate());
322 char * dheader_position_;
323 char * emheader_position_;
337template <
typename Discriminator>
346 unsigned char *initial_buffer,
348 bool initialize_members) :
353 template <
typename T>
354 bool add_primitive_member(member_id_t
id, Discriminator disc, T value)
356 RTI_FLAT_BUILDER_CHECK_VALID(
return false);
360 move_to_discriminator();
361 rti::xcdr::Stream::Memento stream_memento(stream());
363 if (!add_discriminator(disc)) {
367 if (!AggregationBuilder::add_primitive_member(
id, value)) {
371 stream_memento.discard();
375 template <
typename OffsetType>
376 OffsetType add_member(member_id_t
id, Discriminator disc)
378 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
380 move_to_discriminator();
381 rti::xcdr::Stream::Memento stream_memento(stream());
382 if (!add_discriminator(disc)) {
383 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return OffsetType());
386 return AggregationBuilder::add_member<OffsetType>(
id, stream_memento);
389 template <
typename NestedBuilder>
390 NestedBuilder build_member(member_id_t
id, Discriminator disc)
392 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
394 move_to_discriminator();
395 rti::xcdr::Stream::Memento stream_memento(stream());
396 add_discriminator(disc);
398 return AggregationBuilder::build_member<NestedBuilder>(
id, stream_memento);
408 void move_to_discriminator()
410 stream().current_position(begin_position() + RTI_XCDR_DHEADER_SIZE);
413 bool add_discriminator(Discriminator disc)
415 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:338
The RTI namespace.
Definition: AggregationBuilders.hpp:17