Skip to content

Commit acebde9

Browse files
authored
Merge pull request #690 from nasa/struct-member-array-loop-codegen
Generate loop for toString() on Struct member arrays
2 parents 65154e3 + 90f0666 commit acebde9

File tree

8 files changed

+189
-131
lines changed

8 files changed

+189
-131
lines changed

compiler/lib/src/main/scala/codegen/CppWriter/StructCppWriter.scala

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -355,32 +355,63 @@ case class StructCppWriter(
355355
private def getFunctionMembers: List[CppDoc.Class.Member] = {
356356
// Members on which to call toString()
357357
val toStringMemberNames =
358-
memberList.filter((n, tn) => typeMembers(n).getUnderlyingType match {
359-
case _: Type.String => false
360-
case t if s.isPrimitive(t, tn) => false
358+
astMembers.map((_, node, _) => {
359+
val t = typeMembers(node.data.name)
360+
(node, node.data.name, typeCppWriter.write(t))
361+
}).filter((n, _, tn) => (sizes.contains(n.data.name), typeMembers(n.data.name).getUnderlyingType) match {
362+
case (false, _: Type.String) => false
363+
case (false, t) if s.isPrimitive(t, tn) => false
361364
case _ => true
362-
}).map((n, _) => n)
365+
})
363366
// String initialization for arrays and serializable member types in toString()
364367
val initStrings = toStringMemberNames match {
365368
case Nil => Nil
366369
case names =>
367370
List(
368371
Line.blank ::
369372
lines("// Declare strings to hold any serializable toString() arguments"),
370-
names.flatMap(n =>
371-
if sizes.contains(n) then
372-
lines(s"Fw::String ${n}Str[${sizes(n)}];")
373-
else
374-
lines(s"Fw::String ${n}Str;")
375-
),
373+
names.flatMap((_, n, _) => lines(s"Fw::String ${n}Str;")),
376374
Line.blank ::
377375
lines("// Call toString for arrays and serializable types"),
378-
names.flatMap(n =>
379-
if sizes.contains(n) then
380-
iterateN(sizes(n), lines(s"this->m_$n[i].toString(${n}Str[i]);"))
381-
else
382-
lines(s"this->m_$n.toString(${n}Str);")
383-
),
376+
names.flatMap((node, n, tn) => {
377+
val formatStr = FormatCppWriter.write(
378+
getFormatStr(n),
379+
node.data.typeName
380+
)
381+
382+
(sizes.contains(n), typeMembers(n).getUnderlyingType) match {
383+
case (true, _: Type.String) =>
384+
case (true, t) if s.isPrimitive(t, tn) =>
385+
case (true, _) =>
386+
case _ => lines(s"this->m_$n.toString(${n}Str);")
387+
}
388+
389+
// Loop through and format each element if this is an array
390+
if (sizes.contains(n)) {
391+
val fillTmpString = (typeMembers(n).getUnderlyingType) match {
392+
case (_: Type.String) =>
393+
s"${n}Tmp = this->m_$n[i];"
394+
case t if s.isPrimitive(t, tn) =>
395+
s"""${n}Tmp.format("$formatStr", ${promoteF32ToF64 (t) (s"this->m_$n[i]")});"""
396+
case _ =>
397+
s"this->m_$n[i].toString(${n}Tmp);"
398+
}
399+
400+
iterateN(sizes(n), lines(
401+
s"""|Fw::String ${n}Tmp;
402+
|${fillTmpString}
403+
|
404+
|FwSizeType size = ${n}Tmp.length() + (i > 0 ? 2 : 0);
405+
|if ((size + ${n}Str.length()) <= ${n}Str.maxLength()) {
406+
| if (i > 0) {
407+
| ${n}Str += ", ";
408+
| }
409+
| ${n}Str += ${n}Tmp;
410+
|} else {
411+
| break;
412+
|}"""))
413+
} else lines(s"this->m_$n.toString(${n}Str);")
414+
}),
384415
).flatten
385416
}
386417

@@ -473,12 +504,7 @@ case class StructCppWriter(
473504
node.data.typeName
474505
)
475506
if sizes.contains(n) then {
476-
if sizes(n) == 1 then
477-
List(s"$n = [ $formatStr ]")
478-
else
479-
s"$n = [ $formatStr" ::
480-
List.fill(sizes(n) - 2)(formatStr) ++
481-
List(s"$formatStr ]")
507+
List(s"$n = [ %s ]")
482508
} else
483509
List(s"$n = $formatStr")
484510
}).mkString("\"( \"\n\"", ", \"\n\"", "\"\n\" )\";")).map(indentIn),
@@ -494,14 +520,8 @@ case class StructCppWriter(
494520
List(s"this->m_$n.toChar()")
495521
case (false, t) if s.isPrimitive(t, tn) =>
496522
List(promoteF32ToF64 (t) (s"this->m_$n"))
497-
case (false, _) =>
498-
List(s"${n}Str.toChar()")
499-
case (true, _: Type.String) =>
500-
List.range(0, sizes(n)).map(i => s"this->m_$n[$i].toChar()")
501-
case (true, t) if s.isPrimitive(t, tn) =>
502-
List.range(0, sizes(n)).map(i => promoteF32ToF64 (t) (s"this->m_$n[$i]"))
503523
case _ =>
504-
List.range(0, sizes(n)).map(i => s"${n}Str[$i].toChar()")
524+
List(s"${n}Str.toChar()")
505525
}).mkString(",\n"))
506526
},
507527
");"

compiler/tools/fpp-to-cpp/test/array/S3SerializableAc.ref.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,32 @@ namespace S {
160160
{
161161
static const char* formatString =
162162
"( "
163-
"mU32Array = [ %" PRIu32 ", "
164-
"%" PRIu32 ", "
165-
"%" PRIu32 " ], "
163+
"mU32Array = [ %s ], "
166164
"mF64 = %f"
167165
" )";
168166

167+
// Declare strings to hold any serializable toString() arguments
168+
Fw::String mU32ArrayStr;
169+
170+
// Call toString for arrays and serializable types
171+
for (FwSizeType i = 0; i < 3; i++) {
172+
Fw::String mU32ArrayTmp;
173+
mU32ArrayTmp.format("%" PRIu32 "", this->m_mU32Array[i]);
174+
175+
FwSizeType size = mU32ArrayTmp.length() + (i > 0 ? 2 : 0);
176+
if ((size + mU32ArrayStr.length()) <= mU32ArrayStr.maxLength()) {
177+
if (i > 0) {
178+
mU32ArrayStr += ", ";
179+
}
180+
mU32ArrayStr += mU32ArrayTmp;
181+
} else {
182+
break;
183+
}
184+
}
185+
169186
sb.format(
170187
formatString,
171-
this->m_mU32Array[0],
172-
this->m_mU32Array[1],
173-
this->m_mU32Array[2],
188+
mU32ArrayStr.toChar(),
174189
this->m_mF64
175190
);
176191
}

compiler/tools/fpp-to-cpp/test/struct/AliasTypeSerializableAc.ref.cpp

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -189,38 +189,35 @@ void AliasType ::
189189
"( "
190190
"x = %s, "
191191
"y = %s, "
192-
"z = [ %s, "
193-
"%s, "
194-
"%s, "
195-
"%s, "
196-
"%s, "
197-
"%s, "
198-
"%s, "
199-
"%s, "
200-
"%s, "
201-
"%s ]"
192+
"z = [ %s ]"
202193
" )";
203194

204195
// Declare strings to hold any serializable toString() arguments
205196
Fw::String yStr;
197+
Fw::String zStr;
206198

207199
// Call toString for arrays and serializable types
208200
this->m_y.toString(yStr);
201+
for (FwSizeType i = 0; i < 10; i++) {
202+
Fw::String zTmp;
203+
zTmp = this->m_z[i];
204+
205+
FwSizeType size = zTmp.length() + (i > 0 ? 2 : 0);
206+
if ((size + zStr.length()) <= zStr.maxLength()) {
207+
if (i > 0) {
208+
zStr += ", ";
209+
}
210+
zStr += zTmp;
211+
} else {
212+
break;
213+
}
214+
}
209215

210216
sb.format(
211217
formatString,
212218
this->m_x,
213219
yStr.toChar(),
214-
this->m_z[0].toChar(),
215-
this->m_z[1].toChar(),
216-
this->m_z[2].toChar(),
217-
this->m_z[3].toChar(),
218-
this->m_z[4].toChar(),
219-
this->m_z[5].toChar(),
220-
this->m_z[6].toChar(),
221-
this->m_z[7].toChar(),
222-
this->m_z[8].toChar(),
223-
this->m_z[9].toChar()
220+
zStr.toChar()
224221
);
225222
}
226223

compiler/tools/fpp-to-cpp/test/struct/EnumSerializableAc.ref.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,34 @@ void Enum ::
159159
static const char* formatString =
160160
"( "
161161
"e = %s, "
162-
"eArr = [ %s, "
163-
"%s, "
164-
"%s ]"
162+
"eArr = [ %s ]"
165163
" )";
166164

167165
// Declare strings to hold any serializable toString() arguments
168166
Fw::String eStr;
169-
Fw::String eArrStr[3];
167+
Fw::String eArrStr;
170168

171169
// Call toString for arrays and serializable types
172170
this->m_e.toString(eStr);
173171
for (FwSizeType i = 0; i < 3; i++) {
174-
this->m_eArr[i].toString(eArrStr[i]);
172+
Fw::String eArrTmp;
173+
this->m_eArr[i].toString(eArrTmp);
174+
175+
FwSizeType size = eArrTmp.length() + (i > 0 ? 2 : 0);
176+
if ((size + eArrStr.length()) <= eArrStr.maxLength()) {
177+
if (i > 0) {
178+
eArrStr += ", ";
179+
}
180+
eArrStr += eArrTmp;
181+
} else {
182+
break;
183+
}
175184
}
176185

177186
sb.format(
178187
formatString,
179188
eStr.toChar(),
180-
eArrStr[0].toChar(),
181-
eArrStr[1].toChar(),
182-
eArrStr[2].toChar()
189+
eArrStr.toChar()
183190
);
184191
}
185192

compiler/tools/fpp-to-cpp/test/struct/Modules3SerializableAc.ref.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,34 @@ void Modules3 ::
159159
static const char* formatString =
160160
"( "
161161
"x = %s, "
162-
"arr = [ %s, "
163-
"%s, "
164-
"%s ]"
162+
"arr = [ %s ]"
165163
" )";
166164

167165
// Declare strings to hold any serializable toString() arguments
168166
Fw::String xStr;
169-
Fw::String arrStr[3];
167+
Fw::String arrStr;
170168

171169
// Call toString for arrays and serializable types
172170
this->m_x.toString(xStr);
173171
for (FwSizeType i = 0; i < 3; i++) {
174-
this->m_arr[i].toString(arrStr[i]);
172+
Fw::String arrTmp;
173+
this->m_arr[i].toString(arrTmp);
174+
175+
FwSizeType size = arrTmp.length() + (i > 0 ? 2 : 0);
176+
if ((size + arrStr.length()) <= arrStr.maxLength()) {
177+
if (i > 0) {
178+
arrStr += ", ";
179+
}
180+
arrStr += arrTmp;
181+
} else {
182+
break;
183+
}
175184
}
176185

177186
sb.format(
178187
formatString,
179188
xStr.toChar(),
180-
arrStr[0].toChar(),
181-
arrStr[1].toChar(),
182-
arrStr[2].toChar()
189+
arrStr.toChar()
183190
);
184191
}
185192

compiler/tools/fpp-to-cpp/test/struct/Modules4SerializableAc.ref.cpp

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -172,40 +172,48 @@ void Modules4 ::
172172
{
173173
static const char* formatString =
174174
"( "
175-
"arr1 = [ %s, "
176-
"%s, "
177-
"%s ], "
178-
"arr2 = [ %s, "
179-
"%s, "
180-
"%s, "
181-
"%s, "
182-
"%s, "
183-
"%s ]"
175+
"arr1 = [ %s ], "
176+
"arr2 = [ %s ]"
184177
" )";
185178

186179
// Declare strings to hold any serializable toString() arguments
187-
Fw::String arr1Str[3];
188-
Fw::String arr2Str[6];
180+
Fw::String arr1Str;
181+
Fw::String arr2Str;
189182

190183
// Call toString for arrays and serializable types
191184
for (FwSizeType i = 0; i < 3; i++) {
192-
this->m_arr1[i].toString(arr1Str[i]);
185+
Fw::String arr1Tmp;
186+
this->m_arr1[i].toString(arr1Tmp);
187+
188+
FwSizeType size = arr1Tmp.length() + (i > 0 ? 2 : 0);
189+
if ((size + arr1Str.length()) <= arr1Str.maxLength()) {
190+
if (i > 0) {
191+
arr1Str += ", ";
192+
}
193+
arr1Str += arr1Tmp;
194+
} else {
195+
break;
196+
}
193197
}
194198
for (FwSizeType i = 0; i < 6; i++) {
195-
this->m_arr2[i].toString(arr2Str[i]);
199+
Fw::String arr2Tmp;
200+
this->m_arr2[i].toString(arr2Tmp);
201+
202+
FwSizeType size = arr2Tmp.length() + (i > 0 ? 2 : 0);
203+
if ((size + arr2Str.length()) <= arr2Str.maxLength()) {
204+
if (i > 0) {
205+
arr2Str += ", ";
206+
}
207+
arr2Str += arr2Tmp;
208+
} else {
209+
break;
210+
}
196211
}
197212

198213
sb.format(
199214
formatString,
200-
arr1Str[0].toChar(),
201-
arr1Str[1].toChar(),
202-
arr1Str[2].toChar(),
203-
arr2Str[0].toChar(),
204-
arr2Str[1].toChar(),
205-
arr2Str[2].toChar(),
206-
arr2Str[3].toChar(),
207-
arr2Str[4].toChar(),
208-
arr2Str[5].toChar()
215+
arr1Str.toChar(),
216+
arr2Str.toChar()
209217
);
210218
}
211219

0 commit comments

Comments
 (0)