Skip to content

Commit 49ca013

Browse files
committed
[C++] Reduce copying of data in CppGenerator.
1 parent 353b6c5 commit 49ca013

File tree

1 file changed

+28
-36
lines changed

1 file changed

+28
-36
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,13 @@ public void generate() throws IOException
132132
collectVarData(messageBody, i, varData);
133133

134134
final StringBuilder sb = new StringBuilder();
135-
out.append(generateFields(className, fields, BASE_INDENT, false));
135+
generateFields(sb, className, fields, BASE_INDENT, false);
136136
generateGroups(sb, groups, BASE_INDENT);
137+
generateVarData(sb, className, varData, BASE_INDENT);
138+
generateDisplay(sb, msgToken.name(), fields, groups, varData, BASE_INDENT + INDENT);
139+
sb.append("};\n");
140+
sb.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n");
137141
out.append(sb);
138-
out.append(generateVarData(className, varData, BASE_INDENT));
139-
out.append(generateDisplay(msgToken.name(), fields, groups, varData, BASE_INDENT + INDENT));
140-
out.append("};\n");
141-
out.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n");
142142
}
143143
}
144144
}
@@ -165,20 +165,20 @@ private void generateGroups(final StringBuilder sb, final List<Token> tokens, fi
165165

166166
final List<Token> fields = new ArrayList<>();
167167
i = collectFields(tokens, i, fields);
168-
sb.append(generateFields(formatClassName(groupName), fields, indent + INDENT, false));
168+
generateFields(sb, formatClassName(groupName), fields, indent + INDENT, false);
169169

170170
final List<Token> groups = new ArrayList<>();
171171
i = collectGroups(tokens, i, groups);
172172
generateGroups(sb, groups, indent + INDENT);
173173

174174
final List<Token> varData = new ArrayList<>();
175175
i = collectVarData(tokens, i, varData);
176-
sb.append(generateVarData(formatClassName(groupName), varData, indent + INDENT));
176+
generateVarData(sb, formatClassName(groupName), varData, indent + INDENT);
177177

178178
sb.append(generateGroupDisplay(groupName, fields, groups, varData, indent + INDENT + INDENT));
179179

180180
sb.append(indent).append(" };\n");
181-
sb.append(generateGroupProperty(groupName, groupToken, cppTypeForNumInGroup, indent));
181+
generateGroupProperty(sb, groupName, groupToken, cppTypeForNumInGroup, indent);
182182
}
183183
}
184184

@@ -350,11 +350,13 @@ private static void generateGroupClassHeader(
350350
.append(indent).append("#endif\n");
351351
}
352352

353-
private static CharSequence generateGroupProperty(
354-
final String groupName, final Token token, final String cppTypeForNumInGroup, final String indent)
353+
private static void generateGroupProperty(
354+
final StringBuilder sb,
355+
final String groupName,
356+
final Token token,
357+
final String cppTypeForNumInGroup,
358+
final String indent)
355359
{
356-
final StringBuilder sb = new StringBuilder();
357-
358360
final String className = formatClassName(groupName);
359361
final String propertyName = formatPropertyName(groupName);
360362

@@ -413,14 +415,11 @@ private static CharSequence generateGroupProperty(
413415
indent + " }\n",
414416
propertyName,
415417
token.version()));
416-
417-
return sb;
418418
}
419419

420-
private CharSequence generateVarData(final String className, final List<Token> tokens, final String indent)
420+
private void generateVarData(
421+
final StringBuilder sb, final String className, final List<Token> tokens, final String indent)
421422
{
422-
final StringBuilder sb = new StringBuilder();
423-
424423
for (int i = 0, size = tokens.size(); i < size;)
425424
{
426425
final Token token = tokens.get(i);
@@ -604,8 +603,6 @@ private CharSequence generateVarData(final String className, final List<Token> t
604603

605604
i += token.componentTokenCount();
606605
}
607-
608-
return sb;
609606
}
610607

611608
private void generateVarDataDescriptors(
@@ -1979,11 +1976,13 @@ private CharSequence generateMessageFlyweightCode(final String className, final
19791976
generateConstructorsAndOperators(className));
19801977
}
19811978

1982-
private CharSequence generateFields(
1983-
final String containingClassName, final List<Token> tokens, final String indent, final boolean inComposite)
1979+
private void generateFields(
1980+
final StringBuilder sb,
1981+
final String containingClassName,
1982+
final List<Token> tokens,
1983+
final String indent,
1984+
final boolean inComposite)
19841985
{
1985-
final StringBuilder sb = new StringBuilder();
1986-
19871986
for (int i = 0, size = tokens.size(); i < size; i++)
19881987
{
19891988
final Token signalToken = tokens.get(i);
@@ -2016,8 +2015,6 @@ private CharSequence generateFields(
20162015
}
20172016
}
20182017
}
2019-
2020-
return sb;
20212018
}
20222019

20232020
private void generateFieldCommonMethods(
@@ -2339,14 +2336,15 @@ private CharSequence generateLiteral(final PrimitiveType type, final String valu
23392336
return literal;
23402337
}
23412338

2342-
private CharSequence generateDisplay(
2339+
private void generateDisplay(
2340+
final StringBuilder sb,
23432341
final String name,
23442342
final List<Token> fields,
23452343
final List<Token> groups,
23462344
final List<Token> varData,
23472345
final String indent)
23482346
{
2349-
return String.format("\n" +
2347+
sb.append(String.format("\n" +
23502348
indent + "template<typename CharT, typename Traits>\n" +
23512349
indent + "friend std::basic_ostream<CharT, Traits>& operator<<(\n" +
23522350
indent + " std::basic_ostream<CharT, Traits>& builder, %1$s _writer)\n" +
@@ -2363,7 +2361,7 @@ private CharSequence generateDisplay(
23632361
indent + " return builder;\n" +
23642362
indent + "}\n",
23652363
formatClassName(name),
2366-
appendDisplay(fields, groups, varData, indent + INDENT));
2364+
appendDisplay(fields, groups, varData, indent + INDENT)));
23672365
}
23682366

23692367
private CharSequence generateGroupDisplay(
@@ -2387,10 +2385,7 @@ private CharSequence generateGroupDisplay(
23872385
appendDisplay(fields, groups, varData, indent + INDENT));
23882386
}
23892387

2390-
private CharSequence generateCompositeDisplay(
2391-
final String name,
2392-
final List<Token> tokens,
2393-
final String indent)
2388+
private CharSequence generateCompositeDisplay(final String name, final List<Token> tokens, final String indent)
23942389
{
23952390
return String.format("\n" +
23962391
indent + "template<typename CharT, typename Traits>\n" +
@@ -2407,10 +2402,7 @@ private CharSequence generateCompositeDisplay(
24072402
}
24082403

24092404
private CharSequence appendDisplay(
2410-
final List<Token> fields,
2411-
final List<Token> groups,
2412-
final List<Token> varData,
2413-
final String indent)
2405+
final List<Token> fields, final List<Token> groups, final List<Token> varData, final String indent)
24142406
{
24152407
final StringBuilder sb = new StringBuilder();
24162408
final boolean[] atLeastOne = {false};

0 commit comments

Comments
 (0)