Skip to content

Commit

Permalink
Fix generated code for bounded strings (#119)
Browse files Browse the repository at this point in the history
* Refs #14562. Fix generated code for bounded strings.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* submodule

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Refs #14562. Fix serialization of collections of bounded strings.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Refs #14562. Fix deserialization of collections of bounded strings.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Submodule

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Refs #14652. Fixes for wstring.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Refs #14652. Recursive array serialization.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>

* Refs #14652. Recursive array deserialization.

Signed-off-by: Miguel Company <MiguelCompany@eprosima.com>
  • Loading branch information
MiguelCompany committed Jul 1, 2022
1 parent aada35b commit d507813
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 15 deletions.
103 changes: 89 additions & 14 deletions src/main/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg
Original file line number Diff line number Diff line change
Expand Up @@ -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$
>>
Expand All @@ -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$;
}
Expand All @@ -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<uint32_t>($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$
>>

Expand Down Expand Up @@ -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$;
}
Expand All @@ -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$)
{
Expand All @@ -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$;
Expand Down Expand Up @@ -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$
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ $endif$

$ctx.directIncludeDependencies : {include | #include "$include$.h"}; separator="\n"$

#include <fastrtps/utils/fixed_size_string.hpp>

#include <stdint.h>
#include <array>
#include <string>
Expand Down

0 comments on commit d507813

Please sign in to comment.