diff --git a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg index 60bd5c71..b30f2f17 100644 --- a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg +++ b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg @@ -18,28 +18,29 @@ import "com/eprosima/fastdds/idl/templates/eprosima.stg" import "FastCdrCommon.stg" main(ctx, definitions) ::= << -$fileHeader(ctx=ctx, file=[ctx.filename, ".h"], description=["This header file contains the declaration of the described types in the IDL file."])$ +$fileHeader(ctx=ctx, file=[ctx.filename, ".hpp"], description=["This header file contains the declaration of the described types in the IDL file."])$ -#ifndef _FAST_DDS_GENERATED_$ctx.headerGuardName$_H_ -#define _FAST_DDS_GENERATED_$ctx.headerGuardName$_H_ +#ifndef _FAST_DDS_GENERATED_$ctx.headerGuardName$_HPP_ +#define _FAST_DDS_GENERATED_$ctx.headerGuardName$_HPP_ #include #include #include #include #include +#include #include #include #include #include +#include -$if(ctx.printexception)$ -#include <$ctx.product$/exceptions/UserException.h> -$endif$ - -$ctx.directIncludeDependencies : {include | #include "$include$.h"}; separator="\n"$ +$ctx.directIncludeDependencies : {include | #include "$include$.hpp"}; separator="\n"$ +$if(ctx.generateTypeObject)$ +#include "$ctx.filename$TypeObject.h" +$endif$ #if defined(_WIN32) #if defined(EPROSIMA_USER_DLL_EXPORT) @@ -65,37 +66,9 @@ $ctx.directIncludeDependencies : {include | #include "$include$.h"}; separator=" #define $ctx.fileNameUpper$_DllAPI #endif // _WIN32 -$if(ctx.cdr)$ -namespace eprosima { -namespace fastcdr { -class Cdr; -$if(ctx.cdr)$ -class CdrSizeCalculator; -$endif$ -} // namespace fastcdr -} // namespace eprosima - -$endif$ - -$if(ctx.fastcdr)$ -namespace eprosima { -namespace fastcdr { -class FastCdr; -} // namespace fastcdr -} // namespace eprosima - -$endif$ - -$if(ctx.generateTypesC)$ -$ctx.typeCodesToDefine : { type | -$sequences_definition(type.value)$ -}; separator="\n"$ -$endif$ - - $definitions; separator="\n"$ -#endif // _FAST_DDS_GENERATED_$ctx.headerGuardName$_H_ +#endif // _FAST_DDS_GENERATED_$ctx.headerGuardName$_HPP_ $"\n"$ >> @@ -132,22 +105,17 @@ public: }; >> -const_decl(ctx, parent, const, const_type) ::= <<$const_type$$if(ctx.inScopedFile)$$if(const.parent)$$if(const.parent.isInterface)$static $endif$$endif$const $const.typeCode.cppTypename$ $const.name$$if(!const.parent)$ = $const.value$$elseif(!const.parent.isInterface)$ = $const.value$$elseif(!const.typeCode.isType_5)$$if(!const.typeCode.isType_6)$ = $const.value$$endif$$endif$;$endif$>> +const_decl(ctx, parent, const, const_type) ::= << +$const_type$ +const $const.typeCode.cppTypename$ $const.name$ = $const.value$; +>> typedef_decl(ctx, parent, typedefs, typedefs_type, declarator_type) ::= << $declarator_type$ $typedefs_type$ $typedefs : { typedef | -$if(ctx.generateTypesC)$ -$if(typedef.typedefContentTypeCode.isSequenceType)$ -$sequences_definition_impl(typecode=typedef.typedefContentTypeCode, typename=typedef.name)$ -$else$ -typedef $typedef.typedefContentTypeCode.cppTypename$ $typedef.name$; -$endif$ -$else$ typedef $typedef.typedefContentTypeCode.cppTypename$ $typedef.name$; -$endif$ }; separator="\n"$ >> @@ -164,58 +132,135 @@ public: /*! * @brief Default constructor. */ - eProsima_user_DllExport $struct.name$(); + eProsima_user_DllExport $struct.name$() + $if(struct.inheritance)$ + : $struct_inherit_default_init(struct.inheritance)$ + $endif$ + { + $if(ctx.generateTypeObject)$ + // Just to register all known types + register$ctx.filename$Types(); + $endif$ + } /*! * @brief Default destructor. */ - eProsima_user_DllExport ~$struct.name$(); + eProsima_user_DllExport ~$struct.name$() + { + $struct.members:{ member |$member_destructor(ctx=ctx, member=member)$}; separator="\n"$ + } /*! * @brief Copy constructor. * @param x Reference to the object $struct.scopedname$ that will be copied. */ eProsima_user_DllExport $struct.name$( - const $struct.name$& x); + const $struct.name$& x) + $if(struct.inheritance)$ + : $struct_inherit_copy_init(struct.inheritance)$ + $endif$ + { + $if(struct.members)$ + $struct.members:{ member | + m_$member.name$ = x.m_$member.name$; + }; separator="\n"$ + $else$ + static_cast(x); + $endif$ + } /*! * @brief Move constructor. * @param x Reference to the object $struct.scopedname$ that will be copied. */ eProsima_user_DllExport $struct.name$( - $struct.name$&& x) noexcept; + $struct.name$&& x) noexcept + $if(struct.inheritance)$ + : $struct_inherit_move_init(struct.inheritance)$ + $endif$ + + { + $if(struct.members)$ + $struct.members:{ member | $member_move(member=member)$}; separator="\n"$ + $else$ + static_cast(x); + $endif$ + } /*! * @brief Copy assignment. * @param x Reference to the object $struct.scopedname$ that will be copied. */ eProsima_user_DllExport $struct.name$& operator =( - const $struct.name$& x); + const $struct.name$& x) + { + $if(struct.inheritance)$$struct.inheritance.scopedname$::operator =(x);$endif$ + + $if(struct.members)$ + $struct.members:{ member | + m_$member.name$ = x.m_$member.name$; + }; separator="\n"$ + $else$ + static_cast(x); + $endif$ + + return *this; + } /*! * @brief Move assignment. * @param x Reference to the object $struct.scopedname$ that will be copied. */ eProsima_user_DllExport $struct.name$& operator =( - $struct.name$&& x) noexcept; + $struct.name$&& x) noexcept + { + $if(struct.inheritance)$$struct.inheritance.scopedname$::operator =(std::move(x));$endif$ + + $if(struct.members)$ + $struct.members:{ member | $member_move(member=member)$}; separator="\n"$ + $else$ + static_cast(x); + $endif$ + + return *this; + } /*! * @brief Comparison operator. * @param x $struct.scopedname$ object to compare. */ eProsima_user_DllExport bool operator ==( - const $struct.name$& x) const; + const $struct.name$& x) const + { + $if(struct.inheritance)$if ($struct.inheritance.scopedname$::operator !=(x)) + { + return false; + } + $endif$ + + $if(!struct.members)$ + static_cast(x); + return true; + $else$ + return ($struct.members:{ member | m_$member.name$ == x.m_$member.name$}; separator=" &&\n "$); + $endif$ + } /*! * @brief Comparison operator. * @param x $struct.scopedname$ object to compare. */ eProsima_user_DllExport bool operator !=( - const $struct.name$& x) const; + const $struct.name$& x) const + { + return !(*this == x); + } $struct.members:{ member | $public_member_declaration(member)$}; separator="\n"$ - $serialization_functions(struct)$ + $extensions : { extension | $extension$}; separator="\n"$ + private: $struct.members:{ member | $private_member_declaration(member=member)$}; separator="\n"$ @@ -236,78 +281,169 @@ public: /*! * @brief Default constructor. */ - eProsima_user_DllExport $union.name$(); + eProsima_user_DllExport $union.name$() + { + $if(union.defaultvalue)$ + m__d = $union.defaultvalue$; + $else$ + m__d = $first(first(union.members).labels)$; + $endif$ + } /*! * @brief Default destructor. */ - eProsima_user_DllExport ~$union.name$(); + eProsima_user_DllExport ~$union.name$() + { + } /*! * @brief Copy constructor. * @param x Reference to the object $union.scopedname$ that will be copied. */ eProsima_user_DllExport $union.name$( - const $union.name$& x); + const $union.name$& x) + { + m__d = x.m__d; + + switch (m__d) + { + $union.members:{ member | $unionmember_copy(member)$}; separator="\n"$ + $unionmemberdefault_copy(union.defaultMember)$ + } + } /*! * @brief Move constructor. * @param x Reference to the object $union.scopedname$ that will be copied. */ eProsima_user_DllExport $union.name$( - $union.name$&& x) noexcept; + $union.name$&& x) noexcept + { + m__d = x.m__d; + + switch (m__d) + { + $union.members:{ member | $unionmember_move(member)$}; separator="\n"$ + $unionmemberdefault_move(union.defaultMember)$ + } + } /*! * @brief Copy assignment. * @param x Reference to the object $union.scopedname$ that will be copied. */ eProsima_user_DllExport $union.name$& operator =( - const $union.name$& x); + const $union.name$& x) + { + m__d = x.m__d; + + switch (m__d) + { + $union.members:{ member | $unionmember_copy(member)$}; separator="\n"$ + $unionmemberdefault_copy(union.defaultMember)$ + } + + return *this; + } /*! * @brief Move assignment. * @param x Reference to the object $union.scopedname$ that will be copied. */ eProsima_user_DllExport $union.name$& operator =( - $union.name$&& x) noexcept; + $union.name$&& x) noexcept + { + m__d = x.m__d; + + switch (m__d) + { + $union.members:{ member | $unionmember_move(member)$}; separator="\n"$ + $unionmemberdefault_move(union.defaultMember)$ + } + + return *this; + } /*! * @brief Comparison operator. * @param x $union.scopedname$ object to compare. */ eProsima_user_DllExport bool operator ==( - const $union.name$& x) const; + const $union.name$& x) const + { + if (m__d != x.m__d) + { + return false; + } + + switch (m__d) + { + $union.members:{ member | $unionmember_compare(member)$}; separator="\n"$ + $unionmemberdefault_compare(union.defaultMember)$ + } + return false; + } /*! * @brief Comparison operator. * @param x $union.scopedname$ object to compare. */ eProsima_user_DllExport bool operator !=( - const $union.name$& x) const; + const $union.name$& x) const + { + return !(*this == x); + } /*! * @brief This function sets the discriminator value. * @param __d New value for the discriminator. - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the new value doesn't correspond to the selected union member. + * @exception eprosima::fastcdr::exception::BadParamException This exception is thrown if the new value doesn't correspond to the selected union member. */ eProsima_user_DllExport void _d( - $union.discriminator.typecode.cppTypename$ __d); + $union.discriminator.typecode.cppTypename$ __d) + { + bool b = false; + + switch (m__d) + { + $union.members:{ member | $unionmember_discriminator_case(member=member, totallabels=union.totallabels)$}; separator="\n"$ + $if(!union.defaultMember)$ + default: + break; + $endif$ + } + + if (!b) + { + throw eprosima::fastcdr::exception::BadParamException("Discriminator doesn't correspond with the selected union member"); + } + + m__d = __d; + } /*! * @brief This function returns the value of the discriminator. * @return Value of the discriminator */ - eProsima_user_DllExport $union.discriminator.typecode.cppTypename$ _d() const; + eProsima_user_DllExport $union.discriminator.typecode.cppTypename$ _d() const + { + return m__d; + } /*! * @brief This function returns a reference to the discriminator. * @return Reference to the discriminator. */ - eProsima_user_DllExport $union.discriminator.typecode.cppTypename$& _d(); + eProsima_user_DllExport $union.discriminator.typecode.cppTypename$& _d() + { + return m__d; + } + + $union.members:{ member | $public_unionmember_declaration(union, member)$}; separator="\n"$ - $union.members:{ member | $public_unionmember_declaration(member)$}; separator="\n"$ - $serialization_functions(union)$ $extensions : {extension | $extension$}; separator="\n"$ + private: $union.discriminator.typecode.cppTypename$ m__d; @@ -328,63 +464,134 @@ public: /*! * @brief Default constructor. */ - eProsima_user_DllExport $bitset.name$(); + eProsima_user_DllExport $bitset.name$() + $if(bitset.inheritance)$ + : $struct_inherit_default_init(bitset.inheritance)$ + $endif$ + { + $if(ctx.generateTypeObject)$ + // Just to register all known types + register$ctx.filename$Types(); + $endif$ + } /*! * @brief Default destructor. */ - eProsima_user_DllExport ~$bitset.name$(); + eProsima_user_DllExport ~$bitset.name$() + { + } /*! * @brief Copy constructor. * @param x Reference to the object $bitset.scopedname$ that will be copied. */ eProsima_user_DllExport $bitset.name$( - const $bitset.name$& x); + const $bitset.name$& x) + $if(bitset.inheritance)$ + : $struct_inherit_copy_init(bitset.inheritance)$ + $endif$ + { + m_bitset = x.m_bitset; + } /*! * @brief Move constructor. * @param x Reference to the object $bitset.scopedname$ that will be copied. */ eProsima_user_DllExport $bitset.name$( - $bitset.name$&& x) noexcept; + $bitset.name$&& x) noexcept + $if(bitset.inheritance)$ + : $struct_inherit_move_init(bitset.inheritance)$ + $endif$ + { + m_bitset = x.m_bitset; + } /*! * @brief Copy assignment. * @param x Reference to the object $bitset.scopedname$ that will be copied. */ eProsima_user_DllExport $bitset.name$& operator =( - const $bitset.name$& x); + const $bitset.name$& x) + { + $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::operator =(x);$endif$ + + m_bitset = x.m_bitset; + + return *this; + } /*! * @brief Move assignment. * @param x Reference to the object $bitset.scopedname$ that will be copied. */ eProsima_user_DllExport $bitset.name$& operator =( - $bitset.name$&& x) noexcept; + $bitset.name$&& x) noexcept + { + $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::operator =(std::move(x));$endif$ + + m_bitset = x.m_bitset; + + return *this; + } /*! * @brief Comparison operator. * @param x $bitset.scopedname$ object to compare. */ eProsima_user_DllExport bool operator ==( - const $bitset.name$& x) const; + const $bitset.name$& x) const + { + $if(bitset.inheritance)$ if ($bitset.inheritance.scopedname$::operator !=(x)) return false;$endif$ + + return m_bitset == x.m_bitset; + } /*! * @brief Comparison operator. * @param x $bitset.scopedname$ object to compare. */ eProsima_user_DllExport bool operator !=( - const $bitset.name$& x) const; + const $bitset.name$& x) const + { + return !(*this == x); + } $bitset.bitfields:{ bitset | $public_bitfield_declaration(bitset)$}; separator="\n"$ - eProsima_user_DllExport std::bitset<$bitset.fullBitSize$> bitset() const; + eProsima_user_DllExport std::bitset<$bitset.fullBitSize$> bitset() const + { + std::string str_value; - eProsima_user_DllExport void bitset( - const std::bitset<$bitset.fullBitSize$>&); + $if(bitset.inheritance)$ + str_value = static_cast(this)->bitset().to_string() + str_value; + $endif$ + + str_value = m_bitset.to_string() + str_value; + + return std::bitset<$bitset.fullBitSize$>(str_value); + } - $serialization_functions(bitset)$ + eProsima_user_DllExport void bitset( + const std::bitset<$bitset.fullBitSize$>& bitset) + { + std::string str_value {bitset.to_string()}; + size_t base_diff {0}; + size_t last_post {std::string::npos}; + + $if(bitset.inheritance)$ + { + base_diff += $bitset.inheritance.fullBitSize$; + std::bitset<$bitset.inheritance.fullBitSize$> internal_bitset(str_value.substr(str_value.length() - base_diff, last_post)); + static_cast<$bitset.inheritance.scopedname$*>(this)->bitset(internal_bitset); + last_post = base_diff; + } + $endif$ + + base_diff += $bitset.bitSize$; + m_bitset = std::bitset<$bitset.bitSize$>(str_value.substr(str_value.length() - base_diff, last_post)); + } $extensions : { extension | $extension$}; separator="\n"$ @@ -433,12 +640,6 @@ $if(member.annotationOptional || member.annotationExternal)$ $public_member_common_declaration(member=member)$ $elseif(member.typecode.primitive)$ $public_member_primitive_declaration(member=member)$ -$elseif(ctx.generateTypesC)$ -$if(member.typecode.isStringType)$ -$public_member_cstring_declaration(member=member)$ -$else$ -$public_member_common_declaration(member=member)$ -$endif$ $else$ $public_member_common_declaration(member=member)$ $endif$ @@ -450,34 +651,28 @@ public_member_primitive_declaration(member) ::= << * @param _$member.name$ New value for member $member.name$ */ eProsima_user_DllExport void $member.name$( - $member_type_declaration(member)$ _$member.name$); + $member_type_declaration(member)$ _$member.name$) +{ + $\ $m_$member.name$ = _$member.name$; +} /*! * @brief This function returns the value of member $member.name$ * @return Value of member $member.name$ */ -eProsima_user_DllExport $member_type_declaration(member)$ $member.name$() const; +eProsima_user_DllExport $member_type_declaration(member)$ $member.name$() const +{ + return m_$member.name$; +} /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ */ -eProsima_user_DllExport $member_type_declaration(member)$& $member.name$(); ->> - -public_member_cstring_declaration(member) ::= << -/*! - * @brief This function sets a value in member $member.name$ - * @param _$member.name$ New value for member $member.name$ - */ -eProsima_user_DllExport void $member.name$( - const $member_type_declaration(member)$ _$member.name$); - -/*! - * @brief This function returns the value of member $member.name$ - * @return Value of member $member.name$ - */ -eProsima_user_DllExport const $member_type_declaration(member)$ $member.name$() const; +eProsima_user_DllExport $member_type_declaration(member)$& $member.name$() +{ + return m_$member.name$; +} >> public_member_common_declaration(member) ::= << @@ -486,26 +681,38 @@ public_member_common_declaration(member) ::= << * @param _$member.name$ New value to be copied in member $member.name$ */ eProsima_user_DllExport void $member.name$( - const $member_type_declaration(member)$& _$member.name$); + const $member_type_declaration(member)$& _$member.name$) +{ + $\ $m_$member.name$ = _$member.name$; +} /*! * @brief This function moves the value in member $member.name$ * @param _$member.name$ New value to be moved in member $member.name$ */ eProsima_user_DllExport void $member.name$( - $member_type_declaration(member)$&& _$member.name$); + $member_type_declaration(member)$&& _$member.name$) +{ + $\ $m_$member.name$ = std::move(_$member.name$); +} /*! * @brief This function returns a constant reference to member $member.name$ * @return Constant reference to member $member.name$ */ -eProsima_user_DllExport const $member_type_declaration(member)$& $member.name$() const; +eProsima_user_DllExport const $member_type_declaration(member)$& $member.name$() const +{ + return m_$member.name$; +} /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ */ -eProsima_user_DllExport $member_type_declaration(member)$& $member.name$(); +eProsima_user_DllExport $member_type_declaration(member)$& $member.name$() +{ + return m_$member.name$; +} >> public_bitfield_declaration(member) ::= << @@ -515,13 +722,42 @@ $if(member.name)$ * @param _$member.name$ New value for member $member.name$ */ eProsima_user_DllExport void $member.name$( - $member.spec.cppTypename$ _$member.name$); + $member.spec.cppTypename$ _$member.name$) +{ + int base = $member.basePosition$; +$if(member.spec.typecode.isType_7)$ + m_bitset.set(base, _$member.name$); +$else$ + int size = $member.spec.bitSize$; + for (int i = base; i < base + size; ++i) + { + m_bitset.set(i, !!(_$member.name$ & 0x01)); + _$member.name$ = _$member.name$ \>> 1; + } +$endif$ + +} /*! * @brief This function returns the value of member $member.name$ * @return Value of member $member.name$ */ -eProsima_user_DllExport $member.spec.cppTypename$ $member.name$() const; +eProsima_user_DllExport $member.spec.cppTypename$ $member.name$() const +{ + int base = $member.basePosition$; +$if(member.spec.typecode.isType_7)$ + return m_bitset.test(base); +$else$ + int size = $member.spec.bitSize$; + std::bitset<$member.spec.bitSize$> aux; + for (int i = 0; i < size; ++i) + { + aux.set(i, m_bitset.test(i + base)); + } + return static_cast<$member.spec.cppTypename$>(aux.to_ullong()); +$endif$ + +} $endif$ >> @@ -529,89 +765,99 @@ private_member_declaration(member) ::= << $member_type_declaration(member)$ m_$member.name$$member_default_init(member)$; >> -public_unionmember_declaration(member) ::= << +public_unionmember_declaration(union, member) ::= << $if(member.annotationExternal)$ -$public_unionmember_common_declaration(member=member)$ +$public_unionmember_common_declaration(union, member)$ $elseif(member.typecode.primitive)$ -$public_unionmember_primitive_declaration(member=member)$ -$elseif(ctx.generateTypesC)$ -$if(member.typecode.isStringType)$ -$public_unionmember_cstring_declaration(member=member)$ -$else$ -$public_unionmember_common_declaration(member=member)$ -$endif$ +$public_unionmember_primitive_declaration(union, member)$ $else$ -$public_unionmember_common_declaration(member=member)$ +$public_unionmember_common_declaration(union, member)$ $endif$ >> -public_unionmember_primitive_declaration(member) ::= << +public_unionmember_primitive_declaration(union, member) ::= << /*! * @brief This function sets a value in member $member.name$ * @param _$member.name$ New value for member $member.name$ */ eProsima_user_DllExport void $member.name$( - $member.typecode.cppTypename$ _$member.name$); + $member.typecode.cppTypename$ _$member.name$) +{ + m_$member.name$ = _$member.name$; + $unionmember_set_discriminator(member=member, defaultvalue=union.defaultvalue)$ +} /*! * @brief This function returns the value of member $member.name$ * @return Value of member $member.name$ - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the requested union member is not the current selection. + * @exception eprosima::fastcdr::exception::BadParamException This exception is thrown if the requested union member is not the current selection. */ -eProsima_user_DllExport $member.typecode.cppTypename$ $member.name$() const; +eProsima_user_DllExport $member.typecode.cppTypename$ $member.name$() const +{ + $unionmember_check_case_list(member=member, totallabels=union.totallabels)$ + + return m_$member.name$; +} /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the requested union member is not the current selection. - */ -eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$(); ->> - -public_unionmember_cstring_declaration(member) ::= << -/*! - * @brief This function sets a value in member $member.name$ - * @param _$member.name$ New value for member $member.name$ + * @exception eprosima::fastcdr::exception::BadParamException This exception is thrown if the requested union member is not the current selection. */ -eProsima_user_DllExport void $member.name$( - const $member.typecode.cppTypename$ _$member.name$); +eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$() +{ + $unionmember_check_case_list(member=member, totallabels=union.totallabels)$ -/*! - * @brief This function returns the value of member $member.name$ - * @return Value of member $member.name$ - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the requested union member is not the current selection. - */ -eProsima_user_DllExport const $member.typecode.cppTypename$ $member.name$() const; + return m_$member.name$; +} >> -public_unionmember_common_declaration(member) ::= << +public_unionmember_common_declaration(union, member) ::= << /*! * @brief This function copies the value in member $member.name$ * @param _$member.name$ New value to be copied in member $member.name$ */ eProsima_user_DllExport void $member.name$( - const $member_type_declaration(member)$& _$member.name$); + const $member_type_declaration(member)$& _$member.name$) +{ + m_$member.name$ = _$member.name$; + $unionmember_set_discriminator(member=member, defaultvalue=union.defaultvalue)$ +} /*! * @brief This function moves the value in member $member.name$ * @param _$member.name$ New value to be moved in member $member.name$ */ eProsima_user_DllExport void $member.name$( - $member_type_declaration(member)$&& _$member.name$); + $member_type_declaration(member)$&& _$member.name$) +{ + m_$member.name$ = std::move(_$member.name$); + $unionmember_set_discriminator(member=member, defaultvalue=union.defaultvalue)$ +} /*! * @brief This function returns a constant reference to member $member.name$ * @return Constant reference to member $member.name$ - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the requested union member is not the current selection. + * @exception eprosima::fastcdr::exception::BadParamException This exception is thrown if the requested union member is not the current selection. */ -eProsima_user_DllExport const $member_type_declaration(member)$& $member.name$() const; +eProsima_user_DllExport const $member_type_declaration(member)$& $member.name$() const +{ + $unionmember_check_case_list(member=member, totallabels=union.totallabels)$ + + return m_$member.name$; +} /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ - * @exception eprosima::fastcdr::BadParamException This exception is thrown if the requested union member is not the current selection. + * @exception eprosima::fastcdr::exception::BadParamException This exception is thrown if the requested union member is not the current selection. */ -eProsima_user_DllExport $member_type_declaration(member)$& $member.name$(); +eProsima_user_DllExport $member_type_declaration(member)$& $member.name$() +{ + $unionmember_check_case_list(member=member, totallabels=union.totallabels)$ + + return m_$member.name$; +} >> member_default_init(member) ::= <% @@ -624,114 +870,144 @@ $endif$ $endif$ %> -serialization_functions(type) ::= << -$if(ctx.fastcdr)$ -/*! - * @brief This function serializes an object using FastCDR serialization. - * @param cdr FastCDR serialization object. - */ -eProsima_user_DllExport void serialize( - eprosima::fastcdr::FastCdr& cdr) const; +member_move(member) ::= <% +$if(member.typecode.primitive)$ +m_$member.name$ = x.m_$member.name$; +$else$ +m_$member.name$ = std::move(x.m_$member.name$); +$endif$ +%> -/*! - * @brief This function deserializes an object using FastCDR serialization. - * @param cdr FastCDR serialization object. - */ -eProsima_user_DllExport void deserialize( - eprosima::fastcdr::FastCdr& cdr); +unionmember_discriminator_case(member, totallabels) ::= << +$if(member.default)$ +default: + b = true; + switch (__d) + { + $totallabels:{ label | case $label$:}; separator="\n"$ + b = false; + break; + default: + break; + } + break; +$else$ +$member.labels:{ label | case $label$:}; separator="\n"$ + switch (__d) + { + $member.labels:{ label | case $label$:}; separator="\n"$ + b = true; + break; + default: + break; + } + break; +$endif$ +>> +unionmember_copy(member) ::= << +$if(member.labels)$ +$member.labels:{ label | case $label$:}; separator="\n"$ + m_$member.name$ = x.m_$member.name$; + break; $endif$ >> -sequences_definition(typecode) ::= << -$if(typecode.contentTypeCode.isStructType)$ -$typecode.contentTypeCode.namespaces : { ns | namespace $ns$ \{ }; separator="\n"$ -class $typecode.contentTypeCode.name$; -$reverse(typecode.contentTypeCode.namespaces) : { ns | \} // $ns$}; separator="\n"$ +unionmemberdefault_copy(member) ::= << +default: +$if(member)$ +$if(member.default)$ + m_$member.name$ = x.m_$member.name$; $endif$ -$if(typecode.contentTypeCode.isUnionType)$ -$typecode.contentTypeCode.namespaces : { ns | namespace $ns$ \{ }; separator="\n"$ -class $typecode.contentTypeCode.name$; -$reverse(typecode.contentTypeCode.namespaces) : { ns | \} // $ns$}; separator="\n"$ $endif$ -$sequences_definition_impl(typecode=typecode, typename=typecode.cppTypename)$ + break; >> -sequences_definition_impl(typecode, typename) ::= << - -class eProsima_user_DllExport $typename$ -{ -public: - $typename$(); - - $typename$( - uint32_t maximum); - - $typename$( - uint32_t length, - $typecode.contentTypeCode.cppTypename$* data, - bool release = false); - - $typename$( - const $typename$& $typename$_); - - $typename$& operator =( - const $typename$& $typename$_); - - ~$typename$(); - - $typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$$else$&$endif$$else$&$endif$ operator[]( - uint32_t index); - - const $typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$$else$&$endif$$else$&$endif$ operator[]( - uint32_t index) const; - - void size( - uint32_t size); - - uint32_t size() const; - - void length( - uint32_t size); - - uint32_t length() const; - - uint32_t maximum() const; - - void value( - $typecode.contentTypeCode.cppTypename$* value); - - $typecode.contentTypeCode.cppTypename$* value( - bool orphan = false); - - const $typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ const$else$$endif$$else$$endif$* value() const; +unionmember_move(member) ::= << +$if(member.labels)$ +$member.labels:{ label | case $label$:}; separator="\n"$ +$if(member.typecode.primitive)$ + m_$member.name$ = x.m_$member.name$; +$else$ + m_$member.name$ = std::move(x.m_$member.name$); +$endif$ - void release( - bool release); + break; +$endif$ +>> - bool release() const; +unionmemberdefault_move(member) ::= << +default: +$if(member)$ +$if(member.default)$ +$if(member.typecode.primitive)$ + m_$member.name$ = x.m_$member.name$; +$else$ + m_$member.name$ = std::move(x.m_$member.name$); +$endif$ +$endif$ +$endif$ - bool& release(); + break; +>> - void serialize( - eprosima::fastcdr::Cdr& cdr) const; +unionmember_compare(member) ::= << +$if(member.labels)$ +$member.labels:{ label | case $label$:}; separator="\n"$ + return (m_$member.name$ == x.m_$member.name$); + break; +$endif$ +>> - void deserialize( - eprosima::fastcdr::Cdr& cdr); +unionmemberdefault_compare(member) ::= << +default: +$if(member)$ +$if(member.default)$ + return m_$member.name$ == x.m_$member.name$; +$endif$ +$endif$ -private: + break; +>> - uint32_t maximum_ = $typecode.maxsize$; +unionmember_set_discriminator(member, defaultvalue) ::= << +$if(member.default)$ +m__d = $defaultvalue$; +$else$ +m__d = $first(member.labels)$; +$endif$ +>> - mutable uint32_t length_ = 0; +unionmember_check_case_list(member, totallabels) ::= << +$if(member.default)$ +bool b = true; - mutable $typecode.contentTypeCode.cppTypename$* value_ = nullptr; +switch (m__d) +{ + $totallabels:{ label | case $label$:}; separator="\n"$ + b = false; + break; + default: + break; +} +$else$ +bool b = false; - bool release_ = true; +switch (m__d) +{ + $member.labels:{ label | case $label$:}; separator="\n"$ + b = true; + break; + default: + break; +} +$endif$ - void free_memory(); -}; +if (!b) +{ + throw eprosima::fastcdr::exception::BadParamException("This member has not been selected"); +} >> //{ Fast DDS-Gen extensions diff --git a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg deleted file mode 100644 index 8ebb4810..00000000 --- a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg +++ /dev/null @@ -1,1348 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -group TypesSource; - -import "com/eprosima/fastdds/idl/templates/eprosima.stg" -import "FastCdrCommon.stg" - -main(ctx, definitions, extensions) ::= << -$fileHeader(ctx=ctx, file=[ctx.filename, ".cpp"], description=["This source file contains the implementation of the described types in the IDL file."])$ - -#ifdef _WIN32 -// Remove linker warning LNK4221 on Visual Studio -namespace { -char dummy; -} // namespace -#endif // _WIN32 - -#include "$ctx.filename$.h" - -$if(ctx.generateTypeObject)$ -#include "$ctx.filename$TypeObject.h" -$endif$ - -$if(ctx.cdr)$ -#include - -$endif$ - -$if(ctx.fastcdr)$ -#include - -$endif$ - -#include -using namespace eprosima::fastcdr::exception; - -#include - -$extensions : { extension | $extension$}; separator="\n"$ - -$if(ctx.generateTypesC)$ -$ctx.typeCodesToDefine : { type | $sequences_definition(type.value)$ }; separator="\n"$ -$endif$ - -$definitions; separator="\n"$ -$if(ctx.thereIsStructOrUnion)$ -// Include auxiliary functions like for serializing/deserializing. -#include "$ctx.filename$CdrAux.ipp" -$endif$ - ->> - -module(ctx, parent, module, definition_list) ::= << -namespace $module.name$ { - -$definition_list$ - -} // namespace $module.name$ ->> - -const_decl(ctx, parent, const, const_type) ::= << -$const_type$ -$if(const.parent)$ -$if(const.parent.isInterface)$ -$if(const.typeCode.isType_5)$ -const $const.typeCode.cppTypename$ $const.parent.scopedname$::$const.name$ = $const.value$; -$elseif(const.typeCode.isType_6)$ -const $const.typeCode.cppTypename$ $const.parent.scopedname$::$const.name$ = $const.value$; -$endif$ -$endif$ -$endif$ ->> - -typedef_decl(ctx, parent, typedefs, typedefs_type, declarator_type) ::= << -$declarator_type$ -$typedefs_type$ -$typedefs : -{ typedef | -$if(ctx.generateTypesC)$ -$if(typedef.typedefContentTypeCode.isSequenceType)$ -$sequences_definition_impl(typecode=typedef.typedefContentTypeCode, scopedtypename=typedef.scopedname, typename=typedef.name)$ -$endif$ -$endif$ -}; separator="\n"$ ->> - -struct_type(ctx, parent, struct, extensions, member_list) ::= << -$member_list$ -$struct.name$::$struct.name$() - $if(struct.inheritance)$ - : $struct_inherit_default_init(struct.inheritance)$ - $endif$ - -{ - $if(ctx.generateTypeObject)$ - // Just to register all known types - register$ctx.filename$Types(); - $endif$ -} - -$struct.name$::~$struct.name$() -{ - $struct.members:{ member |$member_destructor(ctx=ctx, member=member)$}; separator="\n"$ -} - -$struct.name$::$struct.name$( - const $struct.name$& x) - $if(struct.inheritance)$ - : $struct_inherit_copy_init(struct.inheritance)$ - $endif$ - -{ - $if(struct.members)$ - $struct.members:{ member | $member_copy(ctx=ctx, member=member)$}; separator="\n"$ - $else$ - static_cast(x); - $endif$ -} - -$struct.name$::$struct.name$( - $struct.name$&& x) noexcept - $if(struct.inheritance)$ - : $struct_inherit_move_init(struct.inheritance)$ - $endif$ - -{ - $if(struct.members)$ - $struct.members:{ member | $member_move(member=member)$}; separator="\n"$ - $else$ - static_cast(x); - $endif$ -} - -$struct.name$& $struct.name$::operator =( - const $struct.name$& x) -{ - $if(struct.inheritance)$$struct.inheritance.scopedname$::operator =(x);$endif$ - - $if(struct.members)$ - $struct.members:{ member | $member_copy(ctx=ctx, member=member)$}; separator="\n"$ - $else$ - static_cast(x); - $endif$ - - return *this; -} - -$struct.name$& $struct.name$::operator =( - $struct.name$&& x) noexcept -{ - $if(struct.inheritance)$$struct.inheritance.scopedname$::operator =(std::move(x));$endif$ - - $if(struct.members)$ - $struct.members:{ member | $member_move(member=member)$}; separator="\n"$ - $else$ - static_cast(x); - $endif$ - - return *this; -} - -bool $struct.name$::operator ==( - const $struct.name$& x) const -{ - $if(struct.inheritance)$if ($struct.inheritance.scopedname$::operator !=(x)) - { - return false; - } - $endif$ - - $if(!struct.members)$ - static_cast(x); - return true; - $else$ - return ($struct.members:{ member | m_$member.name$ == x.m_$member.name$}; separator=" &&\n "$); - $endif$ -} - -bool $struct.name$::operator !=( - const $struct.name$& x) const -{ - return !(*this == x); -} - -$if(ctx.fastcdr)$ -void $struct.name$::serialize( - eprosima::fastcdr::FastCdr &scdr) const -{ - $if(struct.inheritance)$$struct.inheritance.scopedname$::serialize(scdr);$endif$ - - $struct.members : { member |$if(!member.annotationNonSerialized)$$object_serialization(ctx=ctx, object=member)$$endif$}; separator=""$ -} - -void $struct.name$::deserialize( - eprosima::fastcdr::FastCdr& dcdr) -{ - $if(struct.inheritance)$$struct.inheritance.scopedname$::deserialize(dcdr);$endif$ - - $struct.members : { member |$if(!member.annotationNonSerialized)$$object_deserialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ -} -$endif$ -$struct.members:{ member | $public_member_declaration(class=struct.name, member=member)$}; separator="\n"$ -$extensions : { extension | $extension$}; separator="\n"$ ->> - -bitset_type(ctx, parent, bitset) ::= << -$bitset.name$::$bitset.name$()$if(bitset.inheritance)$ - : $bitset_inherit_default_init(bitset.inheritance)$$endif$ -{ - $if(ctx.generateTypeObject)$ - // Just to register all known types - register$ctx.filename$Types(); - $endif$ -} - -$bitset.name$::~$bitset.name$() -{ -} - -$bitset.name$::$bitset.name$( - const $bitset.name$& x)$if(bitset.inheritance)$ - : $bitset_inherit_copy_init(bitset.inheritance)$$endif$ -{ - m_bitset = x.m_bitset; -} - -$bitset.name$::$bitset.name$( - $bitset.name$&& x) noexcept $if(bitset.inheritance)$ - : $bitset_inherit_move_init(bitset.inheritance)$$endif$ -{ - m_bitset = x.m_bitset; -} - -$bitset.name$& $bitset.name$::operator =( - const $bitset.name$& x) -{ - $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::operator =(x);$endif$ - - m_bitset = x.m_bitset; - - return *this; -} - -$bitset.name$& $bitset.name$::operator =( - $bitset.name$&& x) noexcept -{ - $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::operator =(std::move(x));$endif$ - - m_bitset = x.m_bitset; - - return *this; -} - -bool $bitset.name$::operator ==( - const $bitset.name$& x) const -{ - $if(bitset.inheritance)$ if ($bitset.inheritance.scopedname$::operator !=(x)) return false;$endif$ - - return m_bitset == x.m_bitset; -} - -bool $bitset.name$::operator !=( - const $bitset.name$& x) const -{ - return !(*this == x); -} - -$if(ctx.fastcdr)$ -void $bitset.name$::serialize( - eprosima::fastcdr::FastCdr& scdr) const -{ - $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::serialize(scdr);$endif$ - - $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_serialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ -} - -void $bitset.name$::deserialize( - eprosima::fastcdr::FastCdr& dcdr) -{ - $if(bitset.inheritance)$ $bitset.inheritance.scopedname$::deserialize(dcdr);$endif$ - - $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_deserialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ -} - -$endif$ - - -$bitset.bitfields:{ member | $public_bitfield_definition(class=bitset.name, member=member)$}; separator="\n"$ - -std::bitset<$bitset.fullBitSize$> $bitset.name$::bitset() const -{ - std::string str_value; - - $if(bitset.inheritance)$ - str_value = static_cast(this)->bitset().to_string() + str_value; - $endif$ - - str_value = m_bitset.to_string() + str_value; - - return std::bitset<$bitset.fullBitSize$>(str_value); -} - -void $bitset.name$::bitset( - const std::bitset<$bitset.fullBitSize$>& bitset) -{ - std::string str_value {bitset.to_string()}; - size_t base_diff {0}; - size_t last_post {std::string::npos}; - - $if(bitset.inheritance)$ - { - base_diff += $bitset.inheritance.fullBitSize$; - std::bitset<$bitset.inheritance.fullBitSize$> internal_bitset(str_value.substr(str_value.length() - base_diff, last_post)); - static_cast<$bitset.inheritance.scopedname$*>(this)->bitset(internal_bitset); - last_post = base_diff; - } - $endif$ - - base_diff += $bitset.bitSize$; - m_bitset = std::bitset<$bitset.bitSize$>(str_value.substr(str_value.length() - base_diff, last_post)); -} - ->> - -public_bitfield_definition(class, member) ::= << -$if(member.name)$ -void $class$::$member.name$( - $member.spec.cppTypename$ _$member.name$) -{ - int base = $member.basePosition$; -$if(member.spec.typecode.isType_7)$ - m_bitset.set(base, _$member.name$); -$else$ - int size = $member.spec.bitSize$; - for (int i = base; i < base + size; ++i) - { - m_bitset.set(i, !!(_$member.name$ & 0x01)); - _$member.name$ = _$member.name$ \>> 1; - } -$endif$ - -} - -$member.spec.cppTypename$ $class$::$member.name$() const -{ - int base = $member.basePosition$; -$if(member.spec.typecode.isType_7)$ - return m_bitset.test(base); -$else$ - int size = $member.spec.bitSize$; - std::bitset<$member.spec.bitSize$> aux; - for (int i = 0; i < size; ++i) - { - aux.set(i, m_bitset.test(i + base)); - } - return static_cast<$member.spec.cppTypename$>(aux.to_ullong()); -$endif$ - -} -$endif$ - ->> - -union_type(ctx, parent, union, switch_type) ::= << -$switch_type$ -$union.name$::$union.name$() -{ - $if(union.defaultvalue)$ - m__d = $union.defaultvalue$; - $else$ - m__d = $first(first(union.members).labels)$; - $endif$ -} - -$union.name$::~$union.name$() -{ -} - -$union.name$::$union.name$( - const $union.name$& x) -{ - m__d = x.m__d; - - switch (m__d) - { - $union.members:{ member | $unionmember_copy(member)$}; separator="\n"$ - $unionmemberdefault_copy(union.defaultMember)$ - } -} - -$union.name$::$union.name$( - $union.name$&& x) noexcept -{ - m__d = x.m__d; - - switch (m__d) - { - $union.members:{ member | $unionmember_move(member)$}; separator="\n"$ - $unionmemberdefault_move(union.defaultMember)$ - } -} - -$union.name$& $union.name$::operator =( - const $union.name$& x) -{ - m__d = x.m__d; - - switch (m__d) - { - $union.members:{ member | $unionmember_copy(member)$}; separator="\n"$ - $unionmemberdefault_copy(union.defaultMember)$ - } - - return *this; -} - -$union.name$& $union.name$::operator =( - $union.name$&& x) noexcept -{ - m__d = x.m__d; - - switch (m__d) - { - $union.members:{ member | $unionmember_move(member)$}; separator="\n"$ - $unionmemberdefault_move(union.defaultMember)$ - } - - return *this; -} - -bool $union.name$::operator ==( - const $union.name$& x) const -{ - if (m__d != x.m__d) - { - return false; - } - - switch (m__d) - { - $union.members:{ member | $unionmember_compare(member)$}; separator="\n"$ - $unionmemberdefault_compare(union.defaultMember)$ - } - return false; -} - -bool $union.name$::operator !=( - const $union.name$& x) const -{ - return !(*this == x); -} - -void $union.name$::_d( - $union.discriminator.typecode.cppTypename$ __d) -{ - bool b = false; - - switch (m__d) - { - $union.members:{ member | $unionmember_discriminator_case(member=member, totallabels=union.totallabels)$}; separator="\n"$ - $if(!union.defaultMember)$ - default: - break; - $endif$ - } - - if (!b) - { - throw BadParamException("Discriminator doesn't correspond with the selected union member"); - } - - m__d = __d; -} - -$union.discriminator.typecode.cppTypename$ $union.name$::_d() const -{ - return m__d; -} - -$union.discriminator.typecode.cppTypename$& $union.name$::_d() -{ - return m__d; -} - -$union.members:{ member | $public_unionmember_declaration(class=union.name, member=member, defaultvalue=union.defaultvalue, totallabels=union.totallabels)$}; separator="\n"$ -$if(ctx.fastcdr)$ -void $union.name$::serialize( - eprosima::fastcdr::FastCdr& scdr) const -{ - scdr << m__d; - - switch (m__d) - { - $union.members:{ member |$unionmember_case_selection_se(ctx=ctx, member=member)$}; separator="\n"$ - $unionmemberdefault_case_selection_se(ctx=ctx, member=union.defaultMember)$ - } -} - -void $union.name$::deserialize( - eprosima::fastcdr::FastCdr& dcdr) -{ - dcdr \>> m__d; - - switch (m__d) - { - $union.members:{ member |$unionmember_case_selection_de(ctx=ctx, member=member)$}; separator="\n"$ - $unionmemberdefault_case_selection_de(ctx=ctx, member=union.defaultMember)$ - } -} -$endif$ ->> - -/***** Utils *****/ - -public_member_declaration(class, member) ::= << -$if(member.annotationOptional || member.annotationExternal)$ -$public_object_member_declaration(class=class, member=member)$ -$elseif(member.typecode.primitive)$ -$public_primitive_member_declaration(class=class, member=member)$ -$elseif(ctx.generateTypesC)$ -$if(member.typecode.isStringType)$ -$public_cstring_member_declaration(class=class, member=member)$ -$else$ -$public_object_member_declaration(class=class, member=member)$ -$endif$ -$else$ -$public_object_member_declaration(class=class, member=member)$ -$endif$ ->> - -public_primitive_member_declaration(class, member) ::= << -/*! - * @brief This function sets a value in member $member.name$ - * @param _$member.name$ New value for member $member.name$ - */ -void $class$::$member.name$( - $member_type_declaration(member)$ _$member.name$) -{ - $\ $m_$member.name$ = _$member.name$; -} - -/*! - * @brief This function returns the value of member $member.name$ - * @return Value of member $member.name$ - */ -$member_type_declaration(member)$ $class$::$member.name$() const -{ - return m_$member.name$; -} - -/*! - * @brief This function returns a reference to member $member.name$ - * @return Reference to member $member.name$ - */ -$member_type_declaration(member)$& $class$::$member.name$() -{ - return m_$member.name$; -} ->> - -public_cstring_member_declaration(class, member) ::= << -/*! - * @brief This function sets a value in member $member.name$ - * @param _$member.name$ New value for member $member.name$ - */ -void $class$::$member.name$( - const $member.typecode.cppTypename$ _$member.name$) -{ - free(m_$member.name$); - m_$member.name$ = (char*)malloc(sizeof(char) * (strlen(_$member.name$) + 1)); - strncpy(m_$member.name$, _$member.name$, strlen(_$member.name$) + 1); -} - -/*! - * @brief This function returns the value of member $member.name$ - * @return Value of member $member.name$ - */ -const $member.typecode.cppTypename$ $class$::$member.name$() const -{ - return m_$member.name$; -} ->> - -public_object_member_declaration(class, member) ::= << -/*! - * @brief This function copies the value in member $member.name$ - * @param _$member.name$ New value to be copied in member $member.name$ - */ -void $class$::$member.name$( - const $member_type_declaration(member)$& _$member.name$) -{ - $\ $m_$member.name$ = _$member.name$; -} - -/*! - * @brief This function moves the value in member $member.name$ - * @param _$member.name$ New value to be moved in member $member.name$ - */ -void $class$::$member.name$( - $member_type_declaration(member)$&& _$member.name$) -{ - $\ $m_$member.name$ = std::move(_$member.name$); -} - -/*! - * @brief This function returns a constant reference to member $member.name$ - * @return Constant reference to member $member.name$ - */ -const $member_type_declaration(member)$& $class$::$member.name$() const -{ - return m_$member.name$; -} - -/*! - * @brief This function returns a reference to member $member.name$ - * @return Reference to member $member.name$ - */ -$member_type_declaration(member)$& $class$::$member.name$() -{ - return m_$member.name$; -} ->> - -public_unionmember_declaration(class, member, totallabels, defaultvalue) ::= << -$if(member.annotationExternal)$ -$public_unionmember_cpp_declaration(class=class, member=member, totallabels=totallabels, defaultvalue=defaultvalue)$ -$elseif(member.typecode.primitive)$ -$public_unionmember_primitive_declaration(class=class, member=member, totallabels=totallabels, defaultvalue=defaultvalue)$ -$elseif(ctx.generateTypesC)$ -$if(member.typecode.isStringType)$ -$unionmember_cstring_declaration(class=class, member=member, totallabels=totallabels, defaultvalue=defaultvalue)$ -$else$ -$public_unionmember_cpp_declaration(class=class, member=member, totallabels=totallabels, defaultvalue=defaultvalue)$ -$endif$ -$else$ -$public_unionmember_cpp_declaration(class=class, member=member, totallabels=totallabels, defaultvalue=defaultvalue)$ -$endif$ ->> - -public_unionmember_primitive_declaration(class, member, totallabels, defaultvalue) ::= << -void $class$::$member.name$( - $member.typecode.cppTypename$ _$member.name$) -{ - m_$member.name$ = _$member.name$; - $unionmember_set_discriminator(member=member, defaultvalue=defaultvalue)$ -} - -$member.typecode.cppTypename$ $class$::$member.name$() const -{ - $unionmember_check_case_list(member=member, totallabels=totallabels)$ - - return m_$member.name$; -} - -$member.typecode.cppTypename$& $class$::$member.name$() -{ - $unionmember_check_case_list(member=member, totallabels=totallabels)$ - - return m_$member.name$; -} ->> - -unionmember_cstring_declaration(class, member, totallabels, defaultvalue) ::= << -void $class$::$member.name$( - const char* _$member.name$) -{ - free(m_$member.name$); - m_$member.name$ = (char*)malloc(sizeof(char) * (strlen(_$member.name$) + 1)); - strncpy(m_$member.name$, _$member.name$, strlen(_$member.name$)); - $unionmember_set_discriminator(member=member, defaultvalue=defaultvalue)$ -} - -const char* $class$::$member.name$() const -{ - $unionmember_check_case_list(member=member, totallabels=totallabels)$ - - return m_$member.name$; -} ->> - -public_unionmember_cpp_declaration(class, member, totallabels, defaultvalue) ::= << -void $class$::$member.name$( - const $member_type_declaration(member)$& _$member.name$) -{ - m_$member.name$ = _$member.name$; - $unionmember_set_discriminator(member=member, defaultvalue=defaultvalue)$ -} - -void $class$::$member.name$( - $member_type_declaration(member)$&& _$member.name$) -{ - m_$member.name$ = std::move(_$member.name$); - $unionmember_set_discriminator(member=member, defaultvalue=defaultvalue)$ -} - -const $member_type_declaration(member)$& $class$::$member.name$() const -{ - $unionmember_check_case_list(member=member, totallabels=totallabels)$ - - return m_$member.name$; -} - -$member_type_declaration(member)$& $class$::$member.name$() -{ - $unionmember_check_case_list(member=member, totallabels=totallabels)$ - - return m_$member.name$; -} ->> - -member_copy(ctx, member) ::= <% -$if(ctx.generateTypesC)$ -$if(member.typecode.isStringType)$ -free(m_$member.name$); -m_$member.name$ = (char*)malloc(sizeof(char) * (strlen(x.m_$member.name$) + 1)); -strncpy(m_$member.name$, x.m_$member.name$, strlen(x.m_$member.name$) + 1); -$else$ -m_$member.name$ = x.m_$member.name$; -$endif$ -$else$ -m_$member.name$ = x.m_$member.name$; -$endif$ -%> - -member_move(member) ::= <% -$if(member.typecode.primitive)$ -m_$member.name$ = x.m_$member.name$; -$else$ -m_$member.name$ = std::move(x.m_$member.name$); -$endif$ -%> - -unionmember_discriminator_case(member, totallabels) ::= << -$if(member.default)$ -default: - b = true; - switch (__d) - { - $totallabels:{ label | case $label$:}; separator="\n"$ - b = false; - break; - default: - break; - } - break; -$else$ -$member.labels:{ label | case $label$:}; separator="\n"$ - switch (__d) - { - $member.labels:{ label | case $label$:}; separator="\n"$ - b = true; - break; - default: - break; - } - break; -$endif$ ->> - -unionmember_copy(member) ::= << -$if(member.labels)$ -$member.labels:{ label | case $label$:}; separator="\n"$ - m_$member.name$ = x.m_$member.name$; - break; -$endif$ ->> - -unionmemberdefault_copy(member) ::= << -default: -$if(member)$ -$if(member.default)$ - m_$member.name$ = x.m_$member.name$; -$endif$ -$endif$ - - break; ->> - -unionmember_move(member) ::= << -$if(member.labels)$ -$member.labels:{ label | case $label$:}; separator="\n"$ -$if(member.typecode.primitive)$ - m_$member.name$ = x.m_$member.name$; -$else$ - m_$member.name$ = std::move(x.m_$member.name$); -$endif$ - - break; -$endif$ ->> - -unionmemberdefault_move(member) ::= << -default: -$if(member)$ -$if(member.default)$ -$if(member.typecode.primitive)$ - m_$member.name$ = x.m_$member.name$; -$else$ - m_$member.name$ = std::move(x.m_$member.name$); -$endif$ -$endif$ -$endif$ - - break; ->> - -unionmember_compare(member) ::= << -$if(member.labels)$ -$member.labels:{ label | case $label$:}; separator="\n"$ - return (m_$member.name$ == x.m_$member.name$); - break; -$endif$ ->> - -unionmemberdefault_compare(member) ::= << -default: -$if(member)$ -$if(member.default)$ - return m_$member.name$ == x.m_$member.name$; -$endif$ -$endif$ - - break; ->> - -unionmember_set_discriminator(member, defaultvalue) ::= << -$if(member.default)$ -m__d = $defaultvalue$; -$else$ -m__d = $first(member.labels)$; -$endif$ ->> - -unionmember_check_case_list(member, totallabels) ::= << -$if(member.default)$ -bool b = true; - -switch (m__d) -{ - $totallabels:{ label | case $label$:}; separator="\n"$ - b = false; - break; - default: - break; -} -$else$ -bool b = false; - -switch (m__d) -{ - $member.labels:{ label | case $label$:}; separator="\n"$ - b = true; - break; - default: - break; -} -$endif$ - -if (!b) -{ - throw BadParamException("This member has not been selected"); -} ->> - -unionmember_case_selection_se(ctx, member) ::= << -$if(member.labels)$ -$member.labels:{ label |case $label$:}; separator="\n"$ -$object_serialization(ctx=ctx, object=member)$ -break; -$endif$ ->> - -unionmemberdefault_case_selection_se(ctx, member) ::= << -default: -$if(member)$ -$if(member.default)$ - $object_serialization(ctx=ctx, object=member)$ -$endif$ -$endif$ - - break; ->> - -unionmember_case_selection_de(ctx, member) ::= << -$if(member.labels)$ -$member.labels:{ label |case $label$:}; separator="\n"$ - $object_deserialization(ctx=ctx, object=member)$ - break; -$endif$ ->> - -unionmemberdefault_case_selection_de(ctx, member) ::= << -default: -$if(member)$ -$if(member.default)$ - $object_deserialization(ctx=ctx, object=member)$ -$endif$ -$endif$ - - break; ->> - -sequences_definition(typecode) ::= << -$sequences_definition_impl(typecode=typecode, scopedtypename=typecode.cppTypename, typename=typecode.cppTypename)$ ->> - -sequences_definition_impl(typecode, scopedtypename, typename) ::= << - -$scopedtypename$::$typename$() -{ - // value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - value_ = nullptr; -} - -$scopedtypename$::$typename$( - uint32_t maximum) - : maximum_(maximum) -{ - // value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - value_ = nullptr; -} - -$scopedtypename$::$typename$( - uint32_t length, - $typecode.contentTypeCode.cppTypename$* data, - bool release) - : length_(length) - , value_(data) - , release_(release) -{ -} - -$scopedtypename$::$typename$( - const $typename$& $typename$_) - : maximum_($typename$_.maximum_) - , length_($typename$_.length_) - , release_(true) -{ - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - for (size_t i = 0; i < length_; ++i) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - strncpy(value_[i], $typename$_.value_[i], strlen($typename$_.value_[i]) + 1); - $else$ - value_[i] = $typename$_.value_[i];$endif$$else$ - value_[i] = $typename$_.value_[i];$endif$ - } -} - -$scopedtypename$& $scopedtypename$::operator =( - const $typename$& $typename$_) -{ - maximum_ = $typename$_.maximum_; - length_ = $typename$_.length_; - free_memory(); - release_ = true; - - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - for (size_t i = 0; i < length_; ++i) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - strncpy(value_[i], $typename$_.value_[i], strlen($typename$_.value_[i]) + 1); - $else$ - value_[i] = $typename$_.value_[i];$endif$$else$ - value_[i] = $typename$_.value_[i];$endif$ - } - - return *this; -} - -$scopedtypename$::~$typename$() -{ - free_memory(); -} - -$typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$$else$&$endif$$else$&$endif$ $scopedtypename$::operator[]( - uint32_t index) -{ - if (value_ == nullptr) - { - if (maximum_ == 0) - { - if (length_ != 0) // Must be set. If not, will return nullptr[index] and crash. - { - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - } - } - else - { - value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - } - - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - } - - return value_[index]; -} - -const $typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$$else$&$endif$$else$&$endif$ $scopedtypename$::operator[]( - uint32_t index) const -{ - if (value_ == nullptr) - { - if (maximum_ == 0) - { - if (length_ != 0) // Must be set. If not, will return nullptr[index] and crash. - { - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - } - } - else - { - value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - } - - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - } - - return value_[index]; -} - -void $scopedtypename$::size( - uint32_t size) -{ - if (maximum_ == 0) - { - if(value_ != nullptr && size > length_) - { - $typecode.contentTypeCode.cppTypename$* temp = new $typecode.contentTypeCode.cppTypename$[size]; - for (size_t i = 0; i < length_; ++i) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - if (value_[i] != nullptr) - { - strncpy(temp[i], value_[i], strlen(value_[i]) + 1); - } - else - { - temp[i] = nullptr; - } - $else$ - temp[i] = value_[i];$endif$$else$ - temp[i] = value_[i];$endif$ - } - free_memory(); - value_ = temp; - release_ = true; - } - } - else - { - if(size > maximum_) - { - throw BadParamException("Length is greater than maximum length of the sequence"); - } - } - - length_ = size; -} - -uint32_t $scopedtypename$::size() const -{ - return length_; -} - -void $scopedtypename$::length( - uint32_t length) -{ - if (maximum_ == 0) - { - if(value_ != nullptr && length > length_) - { - $typecode.contentTypeCode.cppTypename$* temp = new $typecode.contentTypeCode.cppTypename$[length]; - for (size_t i = 0; i < length_; ++i) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - if (value_[i] != nullptr) - { - strncpy(temp[i], value_[i], strlen(value_[i]) + 1); - } - else - { - temp[i] = nullptr; - } - $else$ - temp[i] = value_[i];$endif$$else$ - temp[i] = value_[i];$endif$ - } - free_memory(); - value_ = temp; - release_ = true; - } - } - else - { - if(length > maximum_) - { - throw BadParamException("Length is greater than maximum length of the sequence"); - } - } - - length_ = length; -} - -uint32_t $scopedtypename$::length() const -{ - return length_; -} - -uint32_t $scopedtypename$::maximum() const -{ - if (maximum_ == 0) - { - return length_; - } - else - { - return maximum_; - } -} - -void $scopedtypename$::value( - $typecode.contentTypeCode.cppTypename$* value) -{ - free_memory(); - value_ = value; -} - -$typecode.contentTypeCode.cppTypename$* $scopedtypename$::value( - bool orphan) -{ - if (orphan && !release_) - { - return nullptr; - } - - if (value_ == nullptr) - { - if (maximum_ == 0) - { - if (length_ == 0) // Not yet set - { - return nullptr; // To be coherent with accessing value[length]; - } - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - } - else - { - value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - } - - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - } - - if (orphan) - { - release_ = false; - } - - return value_; -} - -const $typecode.contentTypeCode.cppTypename$$if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ const$else$$endif$$else$$endif$* $scopedtypename$::value() const -{ - if (value_ == nullptr) - { - if (maximum_ == 0) - { - if (length_ == 0) // Not yet set - { - return nullptr; // To be coherent with accessing value[length]; - } - value_ = new $typecode.contentTypeCode.cppTypename$[length_]; - } - else - { - value_ = new $typecode.contentTypeCode.cppTypename$[maximum_]; - } - - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - } - - return value_; -} - -void $scopedtypename$::release( - bool release) -{ - release_ = release; -} - -bool $scopedtypename$::release() const -{ - return release_; -} - -bool& $scopedtypename$::release() -{ - return release_; -} - -$if(ctx.anyCdr)$ -size_t $scopedtypename$::calculate_serialized_size( - const $scopedtypename$& data, - size_t& current_alignment) -{ - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv2); - return calculate_serialized_size(calculator, data, current_alignment); -} - -size_t $scopedtypename$::calculate_serialized_size( - eprosima::fastcdr::CdrSizeCalculator& calculator, - const $scopedtypename$& data, - size_t& current_alignment) -{ - return calculator.calculate_serialized_size(data, current_alignment); -} - -$endif$ - -$if(ctx.cdr)$ -void $scopedtypename$::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - scdr << length_; - - if (value_ == nullptr && length_ > 0) - { - size_t size = (maximum_ == 0) ? length_ : maximum_; - value_ = new $typecode.contentTypeCode.cppTypename$[size]; - - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - } - - for (size_t count = 0; count < length_; ++count) - { - scdr << value_[count]; - } -} - -void $scopedtypename$::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - uint32_t old_length = length_; - uint32_t new_length; - - dcdr \>> new_length; - - if (maximum_ != 0 && new_length > maximum_) - { - throw BadParamException("Deserialized length is greater than maximum length of the sequence. Incompatible \ - sequences."); - } - - if ((value_ == nullptr && new_length > 0) || (old_length < new_length)) - { - free_memory(); - - size_t size = (maximum_ == 0) ? new_length : maximum_; - value_ = new $typecode.contentTypeCode.cppTypename$[size]; - } - - length_ = new_length; - - for (size_t count = 0; count < length_; ++count) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - { - std::string temp; - dcdr \>> temp; - value_[count] = (char*)malloc(temp.size() + 1); - strncpy(value_[count], temp.c_str(), temp.size() + 1); - } - $else$ - dcdr \>> value_[count];$endif$$else$ - dcdr \>> value_[count];$endif$ - } -} - -void $scopedtypename$::free_memory() -{ - if (release_) - { - $if(ctx.generateTypesC)$$if(typecode.contentTypeCode.isStringType)$ - for (size_t count = 0; count < length_; ++count) - { - free(value_[count]); - value_[count] = nullptr; - } - $else$$endif$$else$$endif$ - delete[](value_); - } - value_ = nullptr; -} - -$endif$ ->> - -//{ Fast DDS-Gen extensions -module_conversion(ctx, parent, modules, definition_list) ::= << -$modules : { module | -namespace $module.name$ { -}; separator="\n"$ - -$definition_list$ - -$reverse(modules) : { module | -\} // namespace $module.name$ -}; separator="\n"$ ->> -//} diff --git a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg index 415275e8..0283549f 100644 --- a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg +++ b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg @@ -38,7 +38,7 @@ $fast_macro_declarations()$ $ctx.directIncludeDependencies : {include | %include "$include$.i"}; separator="\n"$ %{ -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" #include %} @@ -66,7 +66,7 @@ namespace swig { $definitions; separator="\n"$ // Include the class interfaces -%include "$ctx.filename$.h" +%include "$ctx.filename$.hpp" // Include the corresponding TopicDataType %include "$ctx.filename$PubSubTypes.i" diff --git a/src/main/java/com/eprosima/fastdds/fastddsgen.java b/src/main/java/com/eprosima/fastdds/fastddsgen.java index 3fb44118..cee59bf8 100644 --- a/src/main/java/com/eprosima/fastdds/fastddsgen.java +++ b/src/main/java/com/eprosima/fastdds/fastddsgen.java @@ -23,6 +23,7 @@ import com.eprosima.fastdds.util.VSConfiguration; import com.eprosima.idl.generator.manager.TemplateGroup; import com.eprosima.idl.generator.manager.TemplateManager; +import com.eprosima.idl.generator.manager.TemplateST; import com.eprosima.idl.parser.grammar.IDLLexer; import com.eprosima.idl.parser.grammar.IDLParser; import com.eprosima.idl.parser.tree.Annotation; @@ -136,6 +137,8 @@ public enum LANGUAGE private LANGUAGE m_languageOption = LANGUAGE.CPP; // Default language -> CPP + private boolean generate_typesupport_ = true; + /* * ---------------------------------------------------------------------------------------- * @@ -285,6 +288,10 @@ else if (languageOption.equalsIgnoreCase("java")) throw new BadArgumentException("No language specified after -language argument"); } } + else if (arg.equals("-no-typesupport")) + { + generate_typesupport_ = false; + } else if (arg.equals("-package")) { if (count < args.length) @@ -553,6 +560,7 @@ public static void printHelp() System.out.println("\t\t-flat-output-dir: ignore input files relative paths and place all generated files in the specified output directory."); System.out.println("\t\t-help: shows this help"); System.out.println("\t\t-I : add directory to preprocessor include paths."); + System.out.println("\t\t-no-typesupport: avoid generating the type support files."); System.out.println("\t\t-ppDisable: disables the preprocessor."); System.out.println("\t\t-ppPath: specifies the preprocessor path."); System.out.println("\t\t-python: generates python bindings for the generated types."); @@ -689,8 +697,7 @@ private Project parseIDL( } // Load common types template - tmanager.addGroup("com/eprosima/fastcdr/idl/templates/TypesHeader.stg"); - tmanager.addGroup("com/eprosima/fastcdr/idl/templates/TypesSource.stg"); + tmanager.addGroup("com/eprosima/fastcdr/idl/templates/TypesHeader.stg").enable_using_explicitly_modules(); if (m_type_object_files) { tmanager.addGroup("com/eprosima/fastdds/idl/templates/TypeObjectHeader.stg"); @@ -698,21 +705,27 @@ private Project parseIDL( } // Load Types common templates - tmanager.addGroup("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg"); - tmanager.addGroup("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeaderImpl.stg"); - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg"); - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg"); + if (generate_typesupport_) + { + tmanager.addGroup("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg"); + tmanager.addGroup("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeaderImpl.stg"); + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg"); + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg"); + } - // Load Publisher templates - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPublisherHeader.stg"); - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPublisherSource.stg"); + if (m_exampleOption != null) + { + // Load Publisher templates + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPublisherHeader.stg"); + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPublisherSource.stg"); - // Load Subscriber templates - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSSubscriberHeader.stg"); - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSSubscriberSource.stg"); + // Load Subscriber templates + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSSubscriberHeader.stg"); + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSSubscriberSource.stg"); - // Load PubSubMain template - tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubMain.stg"); + // Load PubSubMain template + tmanager.addGroup("com/eprosima/fastdds/idl/templates/DDSPubSubMain.stg"); + } if (m_test) { @@ -821,41 +834,36 @@ private Project parseIDL( System.out.println("Generating Type definition files..."); if ((returnedValue) && - (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + ".h", + (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + ".hpp", maintemplates.getTemplate("com/eprosima/fastcdr/idl/templates/TypesHeader.stg"), m_replace))) { - if (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + ".cxx", - maintemplates.getTemplate("com/eprosima/fastcdr/idl/templates/TypesSource.stg"), m_replace)) - { - project.addCommonIncludeFile(relative_dir + ctx.getFilename() + ".h"); - project.addCommonSrcFile(relative_dir + ctx.getFilename() + ".cxx"); - - if (m_type_object_files) - { - System.out.println("Generating TypeObject files..."); - if (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + "TypeObject.h", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypeObjectHeader.stg"), m_replace)) - { - if (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + "TypeObject.cxx", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypeObjectSource.stg"), m_replace)) - { - project.addCommonIncludeFile(relative_dir + ctx.getFilename() + "TypeObject.h"); - project.addCommonSrcFile(relative_dir + ctx.getFilename() + "TypeObject.cxx"); - } - } - } - if (m_python) - { - System.out.println("Generating Swig interface files..."); - if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + ".i", - maintemplates.getTemplate("com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg"), m_replace)) - { - - } - } - } + project.addCommonIncludeFile(relative_dir + ctx.getFilename() + ".hpp"); + + if (m_type_object_files) + { + System.out.println("Generating TypeObject files..."); + if (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + "TypeObject.h", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypeObjectHeader.stg"), m_replace)) + { + if (returnedValue = Utils.writeFile(output_dir + ctx.getFilename() + "TypeObject.cxx", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypeObjectSource.stg"), m_replace)) + { + project.addCommonIncludeFile(relative_dir + ctx.getFilename() + "TypeObject.h"); + project.addCommonSrcFile(relative_dir + ctx.getFilename() + "TypeObject.cxx"); + } + } + } + if (m_python) + { + System.out.println("Generating Swig interface files..."); + if (returnedValue = + Utils.writeFile(output_dir + ctx.getFilename() + ".i", + maintemplates.getTemplate("com/eprosima/fastcdr/idl/templates/TypesSwigInterface.stg"), m_replace)) + { + + } + } } if (m_test) @@ -876,7 +884,6 @@ private Project parseIDL( String fileNameH = output_dir + ctx.getFilename() + "Serialization.h"; returnedValue = Utils.writeFile(fileNameH, maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/SerializationHeader.stg"), m_replace); - project.addCommonTestingFile(relative_dir + ctx.getFilename() + "PubSubTypes.cxx"); for (String element : project.getFullDependencies()) { @@ -885,78 +892,81 @@ private Project parseIDL( } } - System.out.println("Generating TopicDataTypes files..."); - if (ctx.isThereIsStructOrUnion()) + System.out.println("Generating Type Support files..."); + if (generate_typesupport_) { - if (returnedValue &= - Utils.writeFile(output_dir + ctx.getFilename() + "CdrAux.hpp", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg"), m_replace)) + if (ctx.isThereIsStructOrUnion()) { - project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "CdrAux.hpp"); - returnedValue &= + if (returnedValue &= + Utils.writeFile(output_dir + ctx.getFilename() + "CdrAux.hpp", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg"), m_replace)) + { + project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "CdrAux.hpp"); + returnedValue &= Utils.writeFile(output_dir + ctx.getFilename() + "CdrAux.ipp", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeaderImpl.stg"), m_replace); + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/TypesCdrAuxHeaderImpl.stg"), m_replace); + } } - } - returnedValue &= + returnedValue &= Utils.writeFile(output_dir + ctx.getFilename() + "PubSubTypes.h", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg"), m_replace); - project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "PubSubTypes.h"); - if (ctx.existsLastStructure()) - { - m_atLeastOneStructure = true; - project.setHasStruct(true); - - if (returnedValue &= - Utils.writeFile(output_dir + ctx.getFilename() + "PubSubTypes.cxx", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg"), m_replace)) + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg"), m_replace); + project.addCommonIncludeFile(relative_dir + ctx.getFilename() + "PubSubTypes.h"); + if (ctx.existsLastStructure()) { - project.addProjectSrcFile(relative_dir + ctx.getFilename() + "PubSubTypes.cxx"); - if (m_python) + m_atLeastOneStructure = true; + project.setHasStruct(true); + + if (returnedValue &= + Utils.writeFile(output_dir + ctx.getFilename() + "PubSubTypes.cxx", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg"), m_replace)) { - System.out.println("Generating Swig interface files..."); - returnedValue &= Utils.writeFile( - output_dir + ctx.getFilename() + "PubSubTypes.i", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSwigInterface.stg"), m_replace); + project.addCommonSrcFile(relative_dir + ctx.getFilename() + "PubSubTypes.cxx"); + if (m_python) + { + System.out.println("Generating Swig interface files..."); + returnedValue &= Utils.writeFile( + output_dir + ctx.getFilename() + "PubSubTypes.i", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubTypeSwigInterface.stg"), m_replace); + } } - } - if (m_exampleOption != null) - { - System.out.println("Generating Publisher files..."); - if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + "Publisher.h", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPublisherHeader.stg"), m_replace)) + if (m_exampleOption != null) { + System.out.println("Generating Publisher files..."); if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + "Publisher.cxx", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPublisherSource.stg"), m_replace)) + Utils.writeFile(output_dir + ctx.getFilename() + "Publisher.h", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPublisherHeader.stg"), m_replace)) { - project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "Publisher.h"); - project.addProjectSrcFile(relative_dir + ctx.getFilename() + "Publisher.cxx"); + if (returnedValue = + Utils.writeFile(output_dir + ctx.getFilename() + "Publisher.cxx", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPublisherSource.stg"), m_replace)) + { + project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "Publisher.h"); + project.addProjectSrcFile(relative_dir + ctx.getFilename() + "Publisher.cxx"); + } } - } - System.out.println("Generating Subscriber files..."); - if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + "Subscriber.h", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSSubscriberHeader.stg"), m_replace)) - { + System.out.println("Generating Subscriber files..."); if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + "Subscriber.cxx", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSSubscriberSource.stg"), m_replace)) + Utils.writeFile(output_dir + ctx.getFilename() + "Subscriber.h", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSSubscriberHeader.stg"), m_replace)) { - project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "Subscriber.h"); - project.addProjectSrcFile(relative_dir + ctx.getFilename() + "Subscriber.cxx"); + if (returnedValue = + Utils.writeFile(output_dir + ctx.getFilename() + "Subscriber.cxx", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSSubscriberSource.stg"), m_replace)) + { + project.addProjectIncludeFile(relative_dir + ctx.getFilename() + "Subscriber.h"); + project.addProjectSrcFile(relative_dir + ctx.getFilename() + "Subscriber.cxx"); + } } - } - System.out.println("Generating main file..."); - if (returnedValue = - Utils.writeFile(output_dir + ctx.getFilename() + "PubSubMain.cxx", - maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubMain.stg"), m_replace)) - { - project.addProjectSrcFile(relative_dir + ctx.getFilename() + "PubSubMain.cxx"); + System.out.println("Generating main file..."); + if (returnedValue = + Utils.writeFile(output_dir + ctx.getFilename() + "PubSubMain.cxx", + maintemplates.getTemplate("com/eprosima/fastdds/idl/templates/DDSPubSubMain.stg"), m_replace)) + { + project.addProjectSrcFile(relative_dir + ctx.getFilename() + "PubSubMain.cxx"); + } } } } @@ -1019,7 +1029,7 @@ private Project parseIDL( return null; } - ST jnisourceTemplate = maintemplates.getTemplate("JNISource"); + TemplateST jnisourceTemplate = maintemplates.getTemplate("JNISource"); if (Utils.writeFile(output_dir + ctx.getFilename() + "PubSubJNI.cxx", jnisourceTemplate, m_replace)) { project.addJniSrcFile(relative_dir + ctx.getFilename() + "PubSubJNI.cxx"); diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/CMakeLists.stg b/src/main/java/com/eprosima/fastdds/idl/templates/CMakeLists.stg index 04648f07..625a42fe 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/CMakeLists.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/CMakeLists.stg @@ -48,13 +48,16 @@ $solution.projects : { project | $pub_sub_execs(project=project, libraries=solut pub_sub_execs(project, libraries, test) ::= << message(STATUS "Configuring $project.name$...") +$if(!project.commonSrcFiles.empty)$ add_library($project.name$_lib $project.commonSrcFiles : { file | $file$}; separator=" "$) target_link_libraries($project.name$_lib $solution.libraries : { library | $library$}; separator=" "$) +$endif$ $if(!project.projectSrcFiles.empty)$ add_executable($project.name$ $project.projectSrcFiles : { file | $file$}; separator=" "$) target_link_libraries($project.name$ $solution.libraries : { library | $library$}; separator=" "$ - $project.name$_lib $project.dependencies : { dep | $dep$_lib}; separator=" "$) + $project.name$_lib $project.dependencies : { dep | $dep$_lib}; separator=" "$ + ) $endif$ $if(test)$ @@ -75,7 +78,8 @@ add_executable($project.name$SerializationTest target_link_libraries($project.name$SerializationTest GTest::gtest_main $solution.libraries : { library | $library$}; separator=" "$ - $project.name$_lib $project.dependencies : { dep | $dep$_lib}; separator=" "$) + $project.name$_lib $project.dependencies : { dep | $dep$_lib}; separator=" "$ + ) gtest_discover_tests($project.name$SerializationTest) $endif$ diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg b/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg index 9a428564..1e15d327 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeHeader.stg @@ -29,7 +29,7 @@ $fileHeader(ctx=ctx, file=[ctx.filename, "PubSubTypes.h"], description=["This h #include #include -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" $ctx.directIncludeDependencies : {include | #include "$include$PubSubTypes.h"}; separator="\n"$ diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg b/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg index 1d3b2224..057eb754 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/DDSPubSubTypeSource.stg @@ -31,6 +31,11 @@ using DataRepresentationId_t = eprosima::fastdds::dds::DataRepresentationId_t; $definitions; separator="\n"$ +$if(ctx.thereIsStructOrUnion)$ +// Include auxiliary functions like for serializing/deserializing. +#include "$ctx.filename$CdrAux.ipp" +$endif$ + >> module(ctx, parent, module, definition_list) ::= << diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/JNIHeader.stg b/src/main/java/com/eprosima/fastdds/idl/templates/JNIHeader.stg index c4763497..f8a62353 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/JNIHeader.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/JNIHeader.stg @@ -19,7 +19,7 @@ import "eprosima.stg" main(ctx, definitions) ::= << $fileHeader(ctx=ctx, file=[ctx.filename, "JNII.cxx"], description=[""])$ -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" #include #if defined(_WIN32) diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/SerializationHeader.stg b/src/main/java/com/eprosima/fastdds/idl/templates/SerializationHeader.stg index 189322a0..ac1ab5d4 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/SerializationHeader.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/SerializationHeader.stg @@ -22,7 +22,7 @@ $fileHeader(ctx=ctx, file=[ctx.filename, "Serialization.h"], description=["This #ifndef _FAST_DDS_GENERATED_$ctx.headerGuardName$_SERIALIZATION_H_ #define _FAST_DDS_GENERATED_$ctx.headerGuardName$_SERIALIZATION_H_ -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" $definitions; separator="\n"$ diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/TypeObjectSource.stg b/src/main/java/com/eprosima/fastdds/idl/templates/TypeObjectSource.stg index 9bce2b32..e2fcfa3c 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/TypeObjectSource.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/TypeObjectSource.stg @@ -24,7 +24,7 @@ $fileHeader(ctx=ctx, file=[ctx.filename, "TypeObject.cpp"], description=["This s namespace { char dummy; } #endif -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" #include "$ctx.filename$TypeObject.h" #include #include diff --git a/src/main/java/com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg b/src/main/java/com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg index 5ab13e7c..29bca63c 100644 --- a/src/main/java/com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg +++ b/src/main/java/com/eprosima/fastdds/idl/templates/TypesCdrAuxHeader.stg @@ -22,7 +22,7 @@ $fileHeader(ctx=ctx, file=[ctx.filename, "CdrAux.hpp"], description=["This sourc #ifndef _FAST_DDS_GENERATED_$ctx.headerGuardName$CDRAUX_HPP_ #define _FAST_DDS_GENERATED_$ctx.headerGuardName$CDRAUX_HPP_ -#include "$ctx.filename$.h" +#include "$ctx.filename$.hpp" $if(ctx.anyCdr)$ $ctx.types:{ type | $if(type.inScope)$$if(type.typeCode.isStructType)$ diff --git a/src/main/java/com/eprosima/fastdds/util/Utils.java b/src/main/java/com/eprosima/fastdds/util/Utils.java index 1821dd34..6d6dd20f 100644 --- a/src/main/java/com/eprosima/fastdds/util/Utils.java +++ b/src/main/java/com/eprosima/fastdds/util/Utils.java @@ -16,6 +16,8 @@ import org.stringtemplate.v4.ST; +import com.eprosima.idl.generator.manager.TemplateST; + import java.io.*; public class Utils @@ -74,6 +76,11 @@ public static String addFileSeparator(String directory) return returnedValue; } + public static boolean writeFile(String file, TemplateST template, boolean replace) + { + return writeFile(file, template.get_st(), replace); + } + public static boolean writeFile(String file, ST template, boolean replace) { boolean returnedValue = false;