diff --git a/src/main/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg b/src/main/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg index 81cd0159..6ba302c5 100644 --- a/src/main/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg +++ b/src/main/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg @@ -50,7 +50,7 @@ $elseif(object.typecode.isType_e)$ $object_map_seq_serialization(ctx=ctx, object=object, preffix=preffix)$ $else$ -scdr << $serializeCasting(typecode=object.typecode)$$preffix$$object.name$; +scdr << $serializeCasting(typecode=object.typecode)$$preffix$$object.name$$if(object.typecode.isStringType)$.c_str()$endif$; $endif$ >> @@ -77,10 +77,10 @@ $endif$ >> string_collection_serialization(ctx, object, preffix, array) ::= << -$if(ctx.generateTypesC)$ $if(object.typecode.isType_f)$ -$recursive_string_array_serialization(ctx=ctx, name=cdrMemberName(name=object.name, preffix=preffix), loopvar=ctx.nextLoopVarName, dims=object.typecode.dimensions)$ -$elseif(object.typecode.isType_e)$ +$recursive_string_array_serialization(ctx=ctx, name=cdrMemberName(name=object.name, preffix=preffix), loopvar=ctx.nextLoopVarName, dims=object.typecode.dimensions, object=object)$ +$elseif(ctx.generateTypesC)$ +$if(object.typecode.isType_e)$ { scdr << $preffix$$object.name$; } @@ -93,23 +93,48 @@ $else$ } scdr << temp_$object.name$; } +$endif$ + +$elseif(object.typecode.contentTypeCode.isStringType)$ +$if(object.typecode.contentTypeCode.isBounded)$ +{ +$if(object.typecode.isType_e)$ + scdr << static_cast($preffix$$object.name$.size()); +$endif$ + + for (const auto& item : $preffix$$object.name$) + { + scdr << item.c_str(); + } +} + +$else$ +scdr << $serializeCasting(typecode=object.typecode)$$preffix$$object.name$; + $endif$ $else$ scdr << $serializeCasting(typecode=object.typecode)$$preffix$$object.name$; + $endif$ >> -recursive_string_array_serialization(ctx, name, loopvar, dims) ::= << +recursive_string_array_serialization(ctx, name, loopvar, dims, object) ::= << $if(rest(dims))$ for (uint32_t $loopvar$ = 0; $loopvar$ < $name$.size(); ++$loopvar$) { - $recursive_string_array_serialization(ctx=ctx, name=cdrIndexName(name=name,loopvar=loopvar), loopvar=ctx.nextLoopVarName, dims=rest(dims))$ + $recursive_string_array_serialization(ctx=ctx, name=cdrIndexName(name=name,loopvar=loopvar), loopvar=ctx.nextLoopVarName, dims=rest(dims), object=object)$ } -$else$ +$elseif(ctx.generateTypesC)$ for (char* str : $name$) { scdr << std::string(str != nullptr ? str : ""); } +$else$ +for (const auto& str : $name$) +{ + scdr << str$if(object.typecode.contentTypeCode.isStringType)$.c_str()$endif$; +} + $endif$ >> @@ -160,10 +185,10 @@ $endif$ >> string_collection_deserialization(ctx, object, preffix) ::= << -$if(ctx.generateTypesC)$ $if(object.typecode.isType_f)$ -$recursive_string_array_deserialization(ctx=ctx, name=cdrMemberName(name=object.name, preffix=preffix), loopvar=ctx.nextLoopVarName, dims=object.typecode.dimensions)$ -$elseif(object.typecode.isType_e)$ +$recursive_string_array_deserialization(ctx=ctx, name=cdrMemberName(name=object.name, preffix=preffix), loopvar=ctx.nextLoopVarName, dims=object.typecode.dimensions, object=object)$ +$elseif(ctx.generateTypesC)$ +$if(object.typecode.isType_e)$ { dcdr \>> $preffix$$object.name$; } @@ -185,18 +210,38 @@ $else$ } } $endif$ +$elseif(object.typecode.contentTypeCode.isStringType)$ +$if(object.typecode.contentTypeCode.isBounded)$ +{ +$if(object.typecode.isType_e)$ + uint32_t sequence_size = 0; + dcdr \>> sequence_size; + $preffix$$object.name$$if(object.typecode.forwarded)$->$else$.$endif$resize(sequence_size); +$endif$ + + for (auto& item : $if(object.typecode.forwarded)$*$endif$$preffix$$object.name$) + { + std::string s; + dcdr \>> s; + item = s.c_str(); + } +} + +$else$ +dcdr \>> $preffix$$object.name$; +$endif$ $else$ dcdr \>> $preffix$$object.name$; $endif$ >> -recursive_string_array_deserialization(ctx, name, loopvar, dims) ::= << +recursive_string_array_deserialization(ctx, name, loopvar, dims, object) ::= << $if(rest(dims))$ for (uint32_t $loopvar$ = 0; $loopvar$ < $name$.size(); ++$loopvar$) { - $recursive_string_array_deserialization(ctx=ctx, name=cdrIndexName(name=name,loopvar=loopvar), loopvar=ctx.nextLoopVarName, dims=rest(dims))$ + $recursive_string_array_deserialization(ctx=ctx, name=cdrIndexName(name=name,loopvar=loopvar), loopvar=ctx.nextLoopVarName, dims=rest(dims), object=object)$ } -$else$ +$elseif(ctx.generateTypesC)$ // Free old memory allocation for (char* str : $name$) { @@ -211,7 +256,27 @@ for (uint32_t index = 0; index < $name$.size(); ++index) strncpy(aux, str.c_str(), str.size() + 1); $name$[index] = aux; } -$endif$>> +$else$ +for (auto& str : $name$) +{ +$if(object.typecode.contentTypeCode.isStringType)$ +$if(object.typecode.contentTypeCode.isBounded)$ + { + std::string aux_str; + dcdr \>> aux_str; + str = aux_str.c_str(); + } + +$else$ + dcdr \>> str; +$endif$ +$else$ + dcdr \>> str; +$endif$ +} + +$endif$ +>> bitfield_deserialization(ctx, object) ::= <<$if(member.name)$$member.spec.cppTypename$ aux_$member.name$; dcdr \>> aux_$member.name$; @@ -515,6 +580,16 @@ $if(typecode.isStringType)$ $else$ dcdr \>> $if(typecode.forwarded)$*$endif$$preffix$$name$; $endif$ +$elseif(typecode.isStringType)$ +$if(typecode.isBounded)$ +{ + std::string aux; + dcdr \>> aux; + $if(typecode.forwarded)$*$endif$$preffix$$name$ = aux.c_str(); +} +$else$ +dcdr \>> $if(typecode.forwarded)$*$endif$$preffix$$name$; +$endif$ $else$ dcdr \>> $if(typecode.forwarded)$*$endif$$preffix$$name$; $endif$ 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 2b016533..90b17a20 100644 --- a/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg +++ b/src/main/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg @@ -26,6 +26,8 @@ $endif$ $ctx.directIncludeDependencies : {include | #include "$include$.h"}; separator="\n"$ +#include + #include #include #include diff --git a/thirdparty/idl-parser b/thirdparty/idl-parser index ad28baf8..95f7c24f 160000 --- a/thirdparty/idl-parser +++ b/thirdparty/idl-parser @@ -1 +1 @@ -Subproject commit ad28baf822a40f1aa595b613a6866c91c6051bdd +Subproject commit 95f7c24f3ef0ae22acb7f12d7c6463c96da9c6c7