Skip to content

Commit d3f3bf4

Browse files
committed
[C++] use constexpr to define precedence checks lookup tables
1 parent 68aeb1a commit d3f3bf4

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ public void generate() throws IOException
243243
generateDisplay(sb, msgToken.name(), fields, groups, varData);
244244
sb.append(generateMessageLength(groups, varData, BASE_INDENT));
245245
sb.append("};\n");
246-
generateLookupTableDefinitions(sb, className, fieldPrecedenceModel);
247246
sb.append(CppUtil.closingBraces(namespaces.length)).append("#endif\n");
248247
out.append(sb);
249248
}
@@ -2975,12 +2974,8 @@ private static CharSequence generateLookupTableDeclarations(final FieldPrecedenc
29752974
}
29762975

29772976
final StringBuilder sb = new StringBuilder();
2978-
sb.append(INDENT).append("static const std::string STATE_NAME_LOOKUP[")
2979-
.append(fieldPrecedenceModel.stateCount())
2980-
.append("];\n");
2981-
sb.append(INDENT).append("static const std::string STATE_TRANSITIONS_LOOKUP[")
2982-
.append(fieldPrecedenceModel.stateCount())
2983-
.append("];\n\n");
2977+
2978+
generateLookupTableDefinitions(sb, fieldPrecedenceModel);
29842979

29852980
sb.append(INDENT).append("static std::string codecStateName(CodecState state)\n")
29862981
.append(INDENT).append("{\n")
@@ -2997,27 +2992,24 @@ private static CharSequence generateLookupTableDeclarations(final FieldPrecedenc
29972992

29982993
private static void generateLookupTableDefinitions(
29992994
final StringBuilder sb,
3000-
final String className,
30012995
final FieldPrecedenceModel fieldPrecedenceModel)
30022996
{
30032997
if (null == fieldPrecedenceModel)
30042998
{
30052999
return;
30063000
}
30073001

3008-
sb.append("\n").append("const std::string ").append(className).append("::STATE_NAME_LOOKUP[")
3009-
.append(fieldPrecedenceModel.stateCount()).append("] =\n")
3010-
.append("{\n");
3002+
sb.append(INDENT).append("static constexpr const char *STATE_NAME_LOOKUP[] =\n")
3003+
.append(INDENT).append("{\n");
30113004
fieldPrecedenceModel.forEachStateOrderedByStateNumber((state) ->
3012-
sb.append(INDENT).append("\"").append(state.name()).append("\",\n"));
3013-
sb.append("};\n\n");
3005+
sb.append(INDENT).append(INDENT).append("\"").append(state.name()).append("\",\n"));
3006+
sb.append(INDENT).append("};\n\n");
30143007

3015-
sb.append("const std::string ").append(className).append("::STATE_TRANSITIONS_LOOKUP[")
3016-
.append(fieldPrecedenceModel.stateCount()).append("] =\n")
3017-
.append("{\n");
3008+
sb.append(INDENT).append("static constexpr const char *STATE_TRANSITIONS_LOOKUP[] =\n")
3009+
.append(INDENT).append("{\n");
30183010
fieldPrecedenceModel.forEachStateOrderedByStateNumber((state) ->
30193011
{
3020-
sb.append(INDENT).append("\"");
3012+
sb.append(INDENT).append(INDENT).append("\"");
30213013
final MutableBoolean isFirst = new MutableBoolean(true);
30223014
final Set<String> transitionDescriptions = new HashSet<>();
30233015
fieldPrecedenceModel.forEachTransitionFrom(state, (transitionGroup) ->
@@ -3038,7 +3030,7 @@ private static void generateLookupTableDefinitions(
30383030
});
30393031
sb.append("\",\n");
30403032
});
3041-
sb.append("};\n\n");
3033+
sb.append(INDENT).append("};\n\n");
30423034
}
30433035

30443036
private static CharSequence qualifiedStateCase(final FieldPrecedenceModel.State state)

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,30 @@ void dtosShouldReferenceTypesInDifferentPackages() throws Exception
114114
assertThat(source, containsString("using namespace test::message::schema::common;"));
115115
}
116116
}
117+
118+
@Test
119+
void shouldUseConstexprWhenDefiningPrecedenceChecksLookupTables() throws Exception
120+
{
121+
try (InputStream in = Tests.getLocalResource("code-generation-schema.xml"))
122+
{
123+
final ParserOptions options = ParserOptions.builder().stopOnError(true).build();
124+
final MessageSchema schema = parse(in, options);
125+
final IrGenerator irg = new IrGenerator();
126+
final Ir ir = irg.generate(schema);
127+
final StringWriterOutputManager outputManager = new StringWriterOutputManager();
128+
outputManager.setPackageName(ir.applicableNamespace());
129+
130+
final CppGenerator generator = new CppGenerator(
131+
ir,
132+
false,
133+
PrecedenceChecks.newInstance(new PrecedenceChecks.Context().shouldGeneratePrecedenceChecks(true)),
134+
false,
135+
outputManager);
136+
generator.generate();
137+
138+
final String source = outputManager.getSource("code.generation.test.Car").toString();
139+
assertThat(source, containsString("static constexpr const char *STATE_NAME_LOOKUP[] ="));
140+
assertThat(source, containsString("static constexpr const char *STATE_TRANSITIONS_LOOKUP[] ="));
141+
}
142+
}
117143
}

0 commit comments

Comments
 (0)