11 #ifndef RTI_DDS_FLAT_BUILDER_HPP_ 12 #define RTI_DDS_FLAT_BUILDER_HPP_ 14 #include "xcdr/xcdr_stream.h" 15 #include "xcdr/xcdr_stream_impl.h" 16 #include "xcdr/xcdr_interpreter.h" 17 #include "xcdr/xcdr_interpreter.h" 19 #include "rti/xcdr/Stream.hpp" 20 #include "rti/flat/ExceptionHelper.hpp" 21 #include "rti/flat/SequenceOffsets.hpp" 124 #ifdef DOXYGEN_DOCUMENTATION_ONLY 243 unsigned char *buffer,
245 bool initialize_members =
false)
279 bool add_my_primitive(int32_t value);
284 bool add_my_optional_primitive(int32_t value);
322 FlatMutableBarBuilder build_my_mutable();
403 bool add_my_primitive(int32_t value);
429 namespace rti {
namespace flat {
436 #if defined(RTI_FLAT_DATA_CXX11_RVALUE_REFERENCES) 437 #define RTI_FLAT_BUILDER_DEFINE_MOVE_OPERATIONS_IMPL(TYPE, BASE, PROXY) 438 #define RTI_FLAT_BUILDER_DEFINE_MOVE_OPERATIONS(TYPE, BASE) 439 #define RTI_FLAT_MOVE_BUILDER(BUILDER) BUILDER 441 #define RTI_FLAT_BUILDER_DEFINE_MOVE_OPERATIONS_IMPL(TYPE, BASE, PROXY) \ 443 TYPE(PROXY other) throw() \ 447 TYPE& operator=(PROXY other) throw() \ 449 finish_untyped_impl(); \ 455 return TYPE(PROXY(*this)); \ 459 TYPE& operator=(TYPE&); 462 #define RTI_FLAT_BUILDER_DEFINE_MOVE_OPERATIONS(TYPE, BASE) \ 463 RTI_FLAT_BUILDER_DEFINE_MOVE_OPERATIONS_IMPL( \ 464 TYPE, BASE, UntypedAggregationBuilderMoveProxy) 466 #define RTI_FLAT_MOVE_BUILDER(BUILDER) (BUILDER).move() 471 template <
typename Builder1,
typename Builder2>
472 void move_abstract_builder(Builder1& to, Builder2& from)
474 if (from.parent_builder_ == NULL) {
475 to.owned_stream_ = from.owned_stream_;
478 to.parent_stream_ = from.parent_stream_;
479 to.parent_builder_ = from.parent_builder_;
480 to.begin_position_ = from.begin_position_;
481 to.bind_position_ = from.bind_position_;
482 to.initialize_on_add_ = from.initialize_on_add_;
483 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 484 to.failure_ = from.failure_;
487 from.parent_stream_ = NULL;
488 from.parent_builder_ = NULL;
489 from.bind_position_ = NULL;
490 from.begin_position_ = NULL;
515 : parent_stream_(NULL),
516 parent_builder_(NULL),
517 begin_position_(NULL),
518 bind_position_(NULL),
519 initialize_on_add_(
false)
520 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 529 AbstractBuilder(
unsigned char *buffer, offset_t size,
bool initialize_members)
530 : parent_stream_(NULL),
531 parent_builder_(NULL),
532 bind_position_(NULL),
533 initialize_on_add_(initialize_members)
534 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 540 if (!RTIXCdrFlatSample_initializeEncapsulationAndStream(
542 &owned_stream_.c_stream(),
543 RTIXCdrEncapsulationId_getNativePlCdr2(),
545 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return);
548 begin_position_ = owned_stream_.current_position();
552 template <
typename Builder1,
typename Builder2>
553 friend void detail::move_abstract_builder(Builder1& to, Builder2& from);
555 #if defined(RTI_FLAT_DATA_CXX11_RVALUE_REFERENCES) 558 detail::move_abstract_builder(*
this, other);
563 if (
this == &other) {
567 finish_untyped_impl();
569 detail::move_abstract_builder(*
this, other);
575 struct AbstractBuilderMoveProxy {
576 rti::xcdr::Stream owned_stream_;
577 rti::xcdr::Stream *parent_stream_;
579 unsigned char *begin_position_;
580 unsigned char *bind_position_;
581 bool initialize_on_add_;
582 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 587 void move_from(AbstractBuilderMoveProxy& other)
589 detail::move_abstract_builder(*
this, other);
592 void move_to(AbstractBuilderMoveProxy& other)
594 detail::move_abstract_builder(other, *
this);
597 operator AbstractBuilderMoveProxy ()
throw()
599 AbstractBuilderMoveProxy other;
622 finish_untyped_impl();
625 struct nested_tag_t {};
645 unsigned int alignment)
647 parent_stream_(&parent.stream()),
648 parent_builder_(&parent),
649 begin_position_(NULL),
650 bind_position_(NULL),
651 initialize_on_add_(parent.initialize_on_add_)
652 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 656 if (alignment != 0) {
657 if (!stream().align(alignment)) {
658 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return);
661 begin_position_ = stream().current_position();
664 unsigned char * buffer()
666 return stream().buffer();
669 unsigned char * begin_position()
671 return begin_position_;
680 template <
typename OffsetType>
681 OffsetType add_element()
683 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
684 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return OffsetType());
686 offset_t member_size = OffsetType::serialized_size(0);
687 unsigned char *pos = stream().current_position();
689 if (!stream().skip(member_size)) {
690 RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(
return OffsetType());
693 if (initialize_on_add_) {
695 (SampleBase *) stream().buffer(),
696 detail::ptrdiff(pos, stream().buffer()));
698 detail::final_offset_initializer<OffsetType>::initialize(offset);
703 (SampleBase *) stream().buffer(),
704 detail::ptrdiff(pos, stream().buffer()));
726 template <
typename NestedBuilder>
727 NestedBuilder build_element(rti::xcdr::Stream::Memento& stream_memento)
729 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
730 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NestedBuilder());
732 NestedBuilder nested_builder(nested_tag_t(), *
this);
733 RTI_FLAT_BUILDER_CHECK_CREATE_BUILDER(
735 return NestedBuilder());
737 bind_position_ = stream_memento.discard();
738 return RTI_FLAT_MOVE_BUILDER(nested_builder);
741 template <
typename NestedBuilder>
742 NestedBuilder build_element_no_align(rti::xcdr::Stream::Memento& stream_memento)
744 RTI_FLAT_BUILDER_CHECK_VALID(
return NestedBuilder());
745 RTI_FLAT_BUILDER_CHECK_NOT_BOUND(
return NestedBuilder());
749 NestedBuilder nested_builder(nested_tag_t(), *
this, 0);
750 RTI_FLAT_BUILDER_CHECK_CREATE_BUILDER(
752 return NestedBuilder());
754 bind_position_ = stream_memento.discard();
755 return RTI_FLAT_MOVE_BUILDER(nested_builder);
769 unsigned int current_size()
771 return detail::ptrdiff(stream().current_position(), begin_position_);
781 void finish_untyped_impl()
783 if (!is_valid() || !is_nested()) {
787 parent_builder_->finish_member();
815 template <
typename OffsetType>
816 OffsetType finish_impl()
818 RTI_FLAT_BUILDER_CHECK_VALID(
return OffsetType());
820 unsigned char *begin_pos = this->begin_position_;
821 unsigned char *sample_base = stream().buffer();
822 unsigned char *current_pos = stream().current_position();
823 finish_untyped_impl();
826 reinterpret_cast<SampleBase *>(sample_base),
827 detail::ptrdiff(begin_pos, sample_base),
828 detail::ptrdiff(current_pos, begin_pos));
847 RTI_FLAT_BUILDER_CHECK_VALID(
return);
848 RTI_FLAT_BUILDER_CHECK_CAN_FINISH(
return);
850 parent_builder_->discard_member();
866 return parent_builder_ != NULL;
883 return begin_position_ != NULL;
896 return stream().total_size();
905 parent_stream_ = NULL;
906 parent_builder_ = NULL;
907 bind_position_ = NULL;
908 begin_position_ = NULL;
913 virtual void finish_member()
919 bind_position_ = NULL;
922 void discard_member()
924 RTI_FLAT_BUILDER_CHECK_VALID(
return);
926 stream().current_position(bind_position_);
927 bind_position_ = NULL;
930 rti::xcdr::Stream& stream()
932 if (parent_stream_ != NULL) {
933 return *parent_stream_;
935 return owned_stream_;
939 const rti::xcdr::Stream& stream()
const 941 if (parent_stream_ != NULL) {
942 return *parent_stream_;
944 return owned_stream_;
949 rti::xcdr::Stream owned_stream_;
950 rti::xcdr::Stream *parent_stream_;
952 unsigned char *begin_position_;
953 unsigned char *bind_position_;
954 bool initialize_on_add_;
956 #ifdef RTI_FLAT_DATA_NO_EXCEPTIONS 970 bool failure = failure_;
988 #endif // RTI_DDS_FLAT_BUILDER_HPP_ The generic definition of FlatData topic-types.
Definition: FlatSample.hpp:148
Represents the Offset to an arbitrary user-defined FlatData mutable IDL struct.
Definition: Offset.hpp:203
Represents the Offset to an arbitrary user-defined FlatData mutable IDL union.
Definition: Offset.hpp:375
void discard()
Discards a member in process of being built.
Definition: Builder.hpp:845
bool is_valid() const
Whether this Builder is valid.
Definition: Builder.hpp:881
Offset to an array of primitive elements.
Definition: SequenceOffsets.hpp:208
Base class of all Builders.
Definition: Builder.hpp:512
MyFlatMutableBuilder()
Creates an invalid Builder.
Definition: Builder.hpp:222
MyFlatUnionOffset Offset
The related offset type.
Definition: Builder.hpp:366
MyFlatMutableOffset Offset
The related offset type.
Definition: Builder.hpp:211
bool is_nested() const
Returns whether this is a member Builder.
Definition: Builder.hpp:864
OffsetType Offset
The related Offset type.
Definition: FlatSample.hpp:155
Base class of builders for user-defined mutable unions.
Definition: AggregationBuilders.hpp:333
Represents the Builder for an arbitrary user-defined mutable type.
Definition: Builder.hpp:206
Represents the Offset to an arbitrary user-defined FlatData final IDL struct.
Definition: Offset.hpp:125
Represents the Builder for an arbitrary user-defined mutable IDL union.
Definition: Builder.hpp:361
Offset to an array of final elements.
Definition: SequenceOffsets.hpp:715
Base class of struct and union builders.
Definition: AggregationBuilders.hpp:37
rti::xcdr::length_t capacity() const
Returns the total capacity in bytes.
Definition: Builder.hpp:894
Builds a sequence member of variable-size elements.
Definition: BuilderHelper.hpp:20
MyFlatMutableBuilder(unsigned char *buffer, int32_t size, bool initialize_members=false)
Construct a Builder with an arbitrary buffer.
Definition: Builder.hpp:242
Builds an array member of variable-size elements.
Definition: BuilderHelper.hpp:26
Definition: AggregationBuilders.hpp:17
Builds a sequence member of fixed-size elements.
Definition: BuilderHelper.hpp:23
Builds a sequence of primitive members.
Definition: BuilderHelper.hpp:17
MyFlatUnionBuilder()
Creates an invalid Builder.
Definition: Builder.hpp:378
bool check_failure()
Checks if the previous operation failed and resets the failure flag.
Definition: Builder.hpp:968
Builds a string.
Definition: SequenceBuilders.hpp:709
virtual ~AbstractBuilder()
If this is a member Builder, it calls finish().
Definition: Builder.hpp:620