Skip to content

Commit d76eb90

Browse files
committed
[Java] Reduce copying when generating codecs.
1 parent 578ac13 commit d76eb90

File tree

2 files changed

+63
-75
lines changed

2 files changed

+63
-75
lines changed

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

Lines changed: 56 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,13 @@ private void generateEncoder(
207207
generateAnnotations(indent, className, groups, out, 0, this::encoderName);
208208
out.append(generateDeclaration(className, implementsString, msgToken));
209209
out.append(generateEncoderFlyweightCode(className, msgToken));
210-
out.append(generateEncoderFields(className, fields, indent));
211210

212211
final StringBuilder sb = new StringBuilder();
212+
generateEncoderFields(sb, className, fields, indent);
213213
generateEncoderGroups(sb, className, groups, indent, false);
214-
out.append(sb);
214+
generateEncoderVarData(sb, className, varData, indent);
215215

216-
out.append(generateEncoderVarData(className, varData, indent));
216+
out.append(sb);
217217

218218
out.append(generateEncoderDisplay(formatClassName(decoderName(msgToken.name())), indent));
219219

@@ -238,14 +238,13 @@ private void generateDecoder(
238238
generateAnnotations(indent, className, groups, out, 0, this::decoderName);
239239
out.append(generateDeclaration(className, implementsString, msgToken));
240240
out.append(generateDecoderFlyweightCode(className, msgToken));
241-
out.append(generateDecoderFields(fields, indent));
242241

243242
final StringBuilder sb = new StringBuilder();
243+
generateDecoderFields(sb, fields, indent);
244244
generateDecoderGroups(sb, className, groups, indent, false);
245+
generateDecoderVarData(sb, varData, indent);
245246
out.append(sb);
246247

247-
out.append(generateDecoderVarData(varData, indent));
248-
249248
out.append(generateDecoderDisplay(msgToken.name(), fields, groups, varData, indent));
250249

251250
out.append("}\n");
@@ -283,13 +282,13 @@ private void generateDecoderGroups(
283282
final List<Token> varData = new ArrayList<>();
284283
i = collectVarData(tokens, i, varData);
285284

286-
sb.append(generateGroupDecoderProperty(groupName, groupToken, indent, isSubGroup));
285+
generateGroupDecoderProperty(sb, groupName, groupToken, indent, isSubGroup);
287286
generateAnnotations(indent + INDENT, groupName, tokens, sb, groupIndex + 1, this::decoderName);
288287
generateGroupDecoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT);
289288

290-
sb.append(generateDecoderFields(fields, indent + INDENT));
289+
generateDecoderFields(sb, fields, indent + INDENT);
291290
generateDecoderGroups(sb, outerClassName, groups, indent + INDENT, true);
292-
sb.append(generateDecoderVarData(varData, indent + INDENT));
291+
generateDecoderVarData(sb, varData, indent + INDENT);
293292

294293
appendGroupInstanceDecoderDisplay(sb, fields, groups, varData, indent + INDENT);
295294

@@ -329,13 +328,13 @@ private void generateEncoderGroups(
329328
final List<Token> varData = new ArrayList<>();
330329
i = collectVarData(tokens, i, varData);
331330

332-
sb.append(generateGroupEncoderProperty(groupName, groupToken, indent, isSubGroup));
331+
generateGroupEncoderProperty(sb, groupName, groupToken, indent, isSubGroup);
333332
generateAnnotations(indent + INDENT, groupClassName, tokens, sb, groupIndex + 1, this::encoderName);
334333
generateGroupEncoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT);
335334

336-
sb.append(generateEncoderFields(groupClassName, fields, indent + INDENT));
335+
generateEncoderFields(sb, groupClassName, fields, indent + INDENT);
337336
generateEncoderGroups(sb, outerClassName, groups, indent + INDENT, true);
338-
sb.append(generateEncoderVarData(groupClassName, varData, indent + INDENT));
337+
generateEncoderVarData(sb, groupClassName, varData, indent + INDENT);
339338

340339
sb.append(indent).append(" }\n");
341340
}
@@ -549,19 +548,18 @@ private void generateGroupDecoderClassDeclaration(
549548
{
550549
final String className = formatClassName(groupName);
551550

551+
generateTypeJavadoc(sb, indent, groupToken);
552552
sb.append(String.format("\n" +
553-
"%1$s" +
554-
indent + "public static class %2$s\n" +
555-
indent + " implements Iterable<%2$s>, java.util.Iterator<%2$s>\n" +
553+
indent + "public static class %1$s\n" +
554+
indent + " implements Iterable<%1$s>, java.util.Iterator<%1$s>\n" +
556555
indent + "{\n" +
557-
indent + " public static final int HEADER_SIZE = %3$d;\n" +
558-
indent + " private final %4$s parentMessage;\n" +
559-
indent + " private %5$s buffer;\n" +
556+
indent + " public static final int HEADER_SIZE = %2$d;\n" +
557+
indent + " private final %3$s parentMessage;\n" +
558+
indent + " private %4$s buffer;\n" +
560559
indent + " private int count;\n" +
561560
indent + " private int index;\n" +
562561
indent + " private int offset;\n" +
563562
indent + " private int blockLength;\n",
564-
generateTypeJavadoc(indent, groupToken),
565563
className,
566564
dimensionHeaderSize,
567565
parentMessageClassName,
@@ -604,17 +602,16 @@ private void generateGroupEncoderClassDeclaration(
604602
{
605603
final String className = formatClassName(encoderName(groupName));
606604

605+
generateTypeJavadoc(sb, indent, groupToken);
607606
sb.append(String.format("\n" +
608-
"%1$s" +
609-
indent + "public static class %2$s\n" +
607+
indent + "public static class %1$s\n" +
610608
indent + "{\n" +
611-
indent + " public static final int HEADER_SIZE = %3$d;\n" +
612-
indent + " private final %4$s parentMessage;\n" +
613-
indent + " private %5$s buffer;\n" +
609+
indent + " public static final int HEADER_SIZE = %2$d;\n" +
610+
indent + " private final %3$s parentMessage;\n" +
611+
indent + " private %4$s buffer;\n" +
614612
indent + " private int count;\n" +
615613
indent + " private int index;\n" +
616614
indent + " private int offset;\n",
617-
generateTypeJavadoc(indent, groupToken),
618615
className,
619616
dimensionHeaderSize,
620617
parentMessageClassName,
@@ -646,10 +643,13 @@ private void generateGroupEncoderClassDeclaration(
646643
sb.append(indent).append(" }\n\n");
647644
}
648645

649-
private static CharSequence generateGroupDecoderProperty(
650-
final String groupName, final Token token, final String indent, final boolean isSubGroup)
646+
private static void generateGroupDecoderProperty(
647+
final StringBuilder sb,
648+
final String groupName,
649+
final Token token,
650+
final String indent,
651+
final boolean isSubGroup)
651652
{
652-
final StringBuilder sb = new StringBuilder();
653653
final String className = formatClassName(groupName);
654654
final String propertyName = formatPropertyName(token.name());
655655

@@ -699,14 +699,15 @@ private static CharSequence generateGroupDecoderProperty(
699699
className,
700700
propertyName,
701701
actingVersionGuard));
702-
703-
return sb;
704702
}
705703

706-
private CharSequence generateGroupEncoderProperty(
707-
final String groupName, final Token token, final String indent, final boolean isSubGroup)
704+
private void generateGroupEncoderProperty(
705+
final StringBuilder sb,
706+
final String groupName,
707+
final Token token,
708+
final String indent,
709+
final boolean isSubGroup)
708710
{
709-
final StringBuilder sb = new StringBuilder();
710711
final String className = formatClassName(encoderName(groupName));
711712
final String propertyName = formatPropertyName(groupName);
712713

@@ -737,14 +738,11 @@ private CharSequence generateGroupEncoderProperty(
737738
generateGroupEncodePropertyJavadoc(indent + INDENT, token, className),
738739
className,
739740
propertyName));
740-
741-
return sb;
742741
}
743742

744-
private CharSequence generateDecoderVarData(final List<Token> tokens, final String indent)
743+
private void generateDecoderVarData(
744+
final StringBuilder sb, final List<Token> tokens, final String indent)
745745
{
746-
final StringBuilder sb = new StringBuilder();
747-
748746
for (int i = 0, size = tokens.size(); i < size;)
749747
{
750748
final Token token = tokens.get(i);
@@ -791,14 +789,11 @@ private CharSequence generateDecoderVarData(final List<Token> tokens, final Stri
791789

792790
i += token.componentTokenCount();
793791
}
794-
795-
return sb;
796792
}
797793

798-
private CharSequence generateEncoderVarData(final String className, final List<Token> tokens, final String indent)
794+
private void generateEncoderVarData(
795+
final StringBuilder sb, final String className, final List<Token> tokens, final String indent)
799796
{
800-
final StringBuilder sb = new StringBuilder();
801-
802797
for (int i = 0, size = tokens.size(); i < size;)
803798
{
804799
final Token token = tokens.get(i);
@@ -841,8 +836,6 @@ private CharSequence generateEncoderVarData(final String className, final List<T
841836

842837
i += token.componentTokenCount();
843838
}
844-
845-
return sb;
846839
}
847840

848841
private void generateDataDecodeMethods(
@@ -1453,7 +1446,7 @@ private CharSequence generateEnumValues(final List<Token> tokens)
14531446
{
14541447
final Encoding encoding = token.encoding();
14551448
final CharSequence constVal = generateLiteral(encoding.primitiveType(), encoding.constValue().toString());
1456-
sb.append(generateTypeJavadoc(INDENT, token));
1449+
generateTypeJavadoc(sb, INDENT, token);
14571450
sb.append(INDENT).append(token.name()).append('(').append(constVal).append("),\n\n");
14581451
}
14591452

@@ -1644,14 +1637,14 @@ else if (tokens.get(index).signal() == Signal.END_GROUP && --level < 0)
16441637
private static CharSequence generateDeclaration(
16451638
final String className, final String implementsString, final Token typeToken)
16461639
{
1647-
return String.format(
1648-
"%s" +
1649-
"@SuppressWarnings(\"all\")\n" +
1650-
"public class %s%s\n" +
1651-
"{\n",
1652-
generateTypeJavadoc(BASE_INDENT, typeToken),
1653-
className,
1654-
implementsString);
1640+
final StringBuilder sb = new StringBuilder();
1641+
1642+
generateTypeJavadoc(sb, BASE_INDENT, typeToken);
1643+
sb.append("@SuppressWarnings(\"all\")\n")
1644+
.append("public class ").append(className).append(implementsString).append('\n')
1645+
.append("{\n");
1646+
1647+
return sb.toString();
16551648
}
16561649

16571650
private void generatePackageInfo() throws IOException
@@ -1703,9 +1696,12 @@ private void generateMetaAttributeEnum() throws IOException
17031696

17041697
private static CharSequence generateEnumDeclaration(final String name, final Token typeToken)
17051698
{
1706-
return
1707-
generateTypeJavadoc(BASE_INDENT, typeToken) +
1708-
"public enum " + name + "\n{\n";
1699+
final StringBuilder sb = new StringBuilder();
1700+
1701+
generateTypeJavadoc(sb, BASE_INDENT, typeToken);
1702+
sb.append("public enum ").append(name).append("\n{\n");
1703+
1704+
return sb.toString();
17091705
}
17101706

17111707
private CharSequence generatePrimitiveDecoder(
@@ -2614,11 +2610,9 @@ private CharSequence generateEncoderFlyweightCode(final String className, final
26142610
CodecType.ENCODER, className, token, wrapMethod + wrapAndApplyMethod, mutableBuffer);
26152611
}
26162612

2617-
private CharSequence generateEncoderFields(
2618-
final String containingClassName, final List<Token> tokens, final String indent)
2613+
private void generateEncoderFields(
2614+
final StringBuilder sb, final String containingClassName, final List<Token> tokens, final String indent)
26192615
{
2620-
final StringBuilder sb = new StringBuilder();
2621-
26222616
Generators.forEachField(
26232617
tokens,
26242618
(fieldToken, typeToken) ->
@@ -2654,14 +2648,10 @@ private CharSequence generateEncoderFields(
26542648
break;
26552649
}
26562650
});
2657-
2658-
return sb;
26592651
}
26602652

2661-
private CharSequence generateDecoderFields(final List<Token> tokens, final String indent)
2653+
private void generateDecoderFields(final StringBuilder sb, final List<Token> tokens, final String indent)
26622654
{
2663-
final StringBuilder sb = new StringBuilder();
2664-
26652655
Generators.forEachField(
26662656
tokens,
26672657
(fieldToken, typeToken) ->
@@ -2696,8 +2686,6 @@ private CharSequence generateDecoderFields(final List<Token> tokens, final Strin
26962686
break;
26972687
}
26982688
});
2699-
2700-
return sb;
27012689
}
27022690

27032691
private static void generateFieldIdMethod(final StringBuilder sb, final Token token, final String indent)

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,22 +252,22 @@ public static String generateLiteral(final PrimitiveType type, final String valu
252252
/**
253253
* Generate the Javadoc comment header for a type.
254254
*
255+
* @param sb to append to.
255256
* @param indent level for the comment.
256257
* @param typeToken for the type.
257-
* @return a string representation of the Javadoc comment.
258258
*/
259-
public static String generateTypeJavadoc(final String indent, final Token typeToken)
259+
public static void generateTypeJavadoc(
260+
final StringBuilder sb, final String indent, final Token typeToken)
260261
{
261262
final String description = typeToken.description();
262263
if (null == description || description.isEmpty())
263264
{
264-
return "";
265+
return;
265266
}
266267

267-
return
268-
indent + "/**\n" +
269-
indent + " * " + description + '\n' +
270-
indent + " */\n";
268+
sb.append(indent).append("/**\n")
269+
.append(indent).append(" * ").append(description).append('\n')
270+
.append(indent).append(" */\n");
271271
}
272272

273273
/**

0 commit comments

Comments
 (0)